fix tab to space
[clinton/Smoothieware.git] / src / modules / utils / panel / screens / ControlScreen.cpp
CommitLineData
35089dc7
JM
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/Kernel.h"
9#include "libs/SerialMessage.h"
10#include "Panel.h"
11#include "PanelScreen.h"
12#include "MainMenuScreen.h"
13#include "ControlScreen.h"
14#include "libs/nuts_bolts.h"
15#include "libs/utils.h"
16#include <string>
17#include "modules/robot/RobotPublicAccess.h"
18using namespace std;
19
20#define JOGGING_SPEED_MM_MIN 1200
21
22ControlScreen::ControlScreen(){
23 this->control_mode = NULL_CONTROL_MODE;
24}
25
26void ControlScreen::on_enter(){
27 this->panel->enter_menu_mode();
28 this->panel->setup_menu(4, 4);
58d6d841
JM
29 get_current_pos(this->pos);
30 this->refresh_menu();
31 this->pos_changed= false;
35089dc7
JM
32}
33
34// called in on_idle()
35void ControlScreen::on_refresh(){
36 if( this->panel->menu_change() ){
37 this->refresh_menu();
58d6d841
JM
38 }
39
40 if(this->control_mode == AXIS_CONTROL_MODE) {
41
42 if( this->panel->click() ){
43 this->enter_menu_control();
44 this->refresh_menu();
45
46 }else if(this->panel->control_value_change()) {
47 this->pos[this->controlled_axis-'X'] = this->panel->get_control_value();
48 this->panel->lcd->setCursor(0,2);
49 this->display_axis_line(this->controlled_axis);
50 this->pos_changed= true; // make the gcode in main_loop
51 }
52
53 }else{
54 if( this->panel->click() ){
55 this->clicked_menu_entry(this->panel->menu_current_line());
56 }
57 }
35089dc7
JM
58}
59
60// queuing gcodes needs to be done from main loop
61void ControlScreen::on_main_loop() {
58d6d841
JM
62 // change actual axis value
63 if(!this->pos_changed) return;
64 this->pos_changed= false;
65
66 set_current_pos(this->controlled_axis, this->pos[this->controlled_axis-'X']);
35089dc7
JM
67}
68
69void ControlScreen::display_menu_line(uint16_t line){
58d6d841 70 // in menu mode
35089dc7
JM
71 switch( line ){
72 case 0: this->panel->lcd->printf("Back"); break;
73 case 1: this->display_axis_line('X'); break;
74 case 2: this->display_axis_line('Y'); break;
75 case 3: this->display_axis_line('Z'); break;
76 }
77}
78
79void ControlScreen::display_axis_line(char axis){
80 this->panel->lcd->printf("Move %c %8.3f", axis, this->pos[axis-'X']);
81}
82
83
84void ControlScreen::clicked_menu_entry(uint16_t line){
85 switch( line ){
86 case 0: this->panel->enter_screen(this->parent ); break;
87 case 1: this->enter_axis_control('X'); break;
88 case 2: this->enter_axis_control('Y'); break;
89 case 3: this->enter_axis_control('Z'); break;
90 }
91}
92
93void ControlScreen::enter_axis_control(char axis){
94 this->control_mode = AXIS_CONTROL_MODE;
95 this->controlled_axis = axis;
96 this->panel->enter_control_mode(this->jog_increment, this->jog_increment/10);
97 this->panel->set_control_value(this->pos[axis-'X']);
58d6d841
JM
98 this->panel->lcd->clear();
99 this->panel->lcd->setCursor(0,2);
100 this->display_axis_line(this->controlled_axis);
35089dc7
JM
101}
102
103void ControlScreen::enter_menu_control(){
58d6d841
JM
104 this->control_mode = NULL_CONTROL_MODE;
105 this->panel->enter_menu_mode();
35089dc7
JM
106}
107
108
109void ControlScreen::get_current_pos(double *cp){
58d6d841
JM
110 void *returned_data;
111
112 bool ok= THEKERNEL->public_data->get_value( robot_checksum, current_position_checksum, &returned_data );
113 if(ok) {
114 double *p= static_cast<double *>(returned_data);
115 cp[0]= p[0];
116 cp[1]= p[1];
117 cp[2]= p[2];
118 }
35089dc7 119}
58d6d841
JM
120void ControlScreen::set_current_pos(char axis, double p){
121 // change pos by issuing a G0 Xnnn
122 char buf[32];
123 int n= snprintf(buf, sizeof(buf), "G0 %c%f F%d", axis, p, (int)round(panel->get_jogging_speed(axis)));
124 string g(buf, n);
125 send_gcode(g);
35089dc7
JM
126}
127
128void ControlScreen::send_gcode(std::string g) {
58d6d841
JM
129 Gcode gcode(g, &(StreamOutput::NullStream));
130 THEKERNEL->call_event(ON_GCODE_RECEIVED, &gcode );
35089dc7
JM
131}
132