cleaned up ToolManager
[clinton/Smoothieware.git] / src / modules / tools / toolmanager / ToolManager.cpp
CommitLineData
14ecdbd7
AW
1/*
2 This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl).
3 Smoothie is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
4 Smoothie is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
5 You should have received a copy of the GNU General Public License along with Smoothie. If not, see <http://www.gnu.org/licenses/>.
6*/
7
8#include "libs/Module.h"
9#include "libs/Kernel.h"
10#include <math.h>
11using namespace std;
12#include <vector>
18067d90 13#include "ToolManager.h"
38b9f24a
L
14#include "PublicDataRequest.h"
15#include "ToolManagerPublicAccess.h"
1440c258 16#include "Config.h"
5966b7d0 17#include "Robot.h"
1440c258 18#include "ConfigValue.h"
8adf2390 19#include "Conveyor.h"
1440c258
L
20#include "checksumm.h"
21#include "PublicData.h"
22#include "Gcode.h"
23
5966b7d0
AT
24#include "libs/SerialMessage.h"
25#include "libs/StreamOutput.h"
26#include "FileStream.h"
27
1440c258 28#include "modules/robot/RobotPublicAccess.h"
14ecdbd7 29
f4a68aec
L
30#define return_error_on_unhandled_gcode_checksum CHECKSUM("return_error_on_unhandled_gcode")
31
1440c258
L
32#define X_AXIS 0
33#define Y_AXIS 1
34#define Z_AXIS 2
35
92031952 36ToolManager::ToolManager(){
8adf2390 37 active_tool = 0;
38b9f24a 38 current_tool_name = CHECKSUM("hotend");
8adf2390 39}
14ecdbd7 40
92031952 41void ToolManager::on_module_loaded(){
f4a68aec
L
42 this->on_config_reload(this);
43
44 this->register_for_event(ON_CONFIG_RELOAD);
8adf2390 45 this->register_for_event(ON_GCODE_RECEIVED);
38b9f24a
L
46 this->register_for_event(ON_GET_PUBLIC_DATA);
47 this->register_for_event(ON_SET_PUBLIC_DATA);
8adf2390
L
48}
49
f4a68aec
L
50void ToolManager::on_config_reload(void *argument){
51 return_error_on_unhandled_gcode = THEKERNEL->config->value( return_error_on_unhandled_gcode_checksum )->by_default(false)->as_bool();
52}
53
92031952 54void ToolManager::on_gcode_received(void *argument){
8adf2390
L
55 Gcode *gcode = static_cast<Gcode*>(argument);
56
57 if( gcode->has_letter('T') ){
58 int new_tool = gcode->get_value('T');
59 gcode->mark_as_taken();
c974b296 60 if(new_tool >= (int)this->tools.size() || new_tool < 0){
8adf2390 61 // invalid tool
f4a68aec
L
62 if( return_error_on_unhandled_gcode ) {
63 char buf[32]; // should be big enough for any status
64 int n= snprintf(buf, sizeof(buf), "T%d invalid tool ", new_tool);
65 gcode->txt_after_ok.append(buf, n);
66 }
8adf2390 67 } else {
c974b296 68 if(new_tool != this->active_tool){
18551e1f
L
69 this->tools[active_tool]->disable();
70 this->active_tool = new_tool;
71 this->current_tool_name = this->tools[active_tool]->get_name();
72 this->tools[active_tool]->enable();
73
74 //send new_tool_offsets to robot
75 float *active_tool_offset = tools[this->active_tool]->get_offset();
76 float *new_tool_offset = tools[new_tool]->get_offset();
77 THEKERNEL->robot->setToolOffset(new_tool_offset[0], new_tool_offset[1], new_tool_offset[2]);
8adf2390
L
78 }
79 }
80 }
81}
14ecdbd7 82
38b9f24a
L
83void ToolManager::on_get_public_data(void* argument){
84 PublicDataRequest* pdr = static_cast<PublicDataRequest*>(argument);
85
86 if(!pdr->starts_with(tool_manager_checksum)) return;
87
88 // ok this is targeted at us, so send back the requested data
89 // this must be static as it will be accessed long after we have returned
90 static struct pad_toolmanager tool_return;
91 tool_return.current_tool_name= this->current_tool_name;
92
93 pdr->set_data_ptr(&tool_return);
94 pdr->set_taken();
95}
96
97void ToolManager::on_set_public_data(void* argument){
98 PublicDataRequest* pdr = static_cast<PublicDataRequest*>(argument);
99
100 if(!pdr->starts_with(tool_manager_checksum)) return;
101
102 // ok this is targeted at us, so change tools
103 uint16_t tool_name= *static_cast<float*>(pdr->get_data_ptr());
104 // TODO: fire a tool change gcode
105 pdr->set_taken();
106}
107
14ecdbd7 108// Add a tool to the tool list
92031952 109void ToolManager::add_tool(Tool* tool_to_add){
c974b296
L
110 if(this->tools.size() == 0){
111 tool_to_add->enable();
b379d27a 112 this->current_tool_name = tool_to_add->get_name();
c974b296
L
113 } else {
114 tool_to_add->disable();
115 }
14ecdbd7
AW
116 this->tools.push_back( tool_to_add );
117}
118
119
120