Commit | Line | Data |
---|---|---|
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> | |
11 | using 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 | 36 | ToolManager::ToolManager(){ |
8adf2390 | 37 | active_tool = 0; |
38b9f24a | 38 | current_tool_name = CHECKSUM("hotend"); |
8adf2390 | 39 | } |
14ecdbd7 | 40 | |
92031952 | 41 | void 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 |
50 | void 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 | 54 | void 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 |
83 | void 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 | ||
97 | void 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 | 109 | void 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 |