Merge pull request #552 from lautr3k/module/Drills
[clinton/Smoothieware.git] / src / modules / utils / panel / screens / ExtruderScreen.cpp
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 "LcdBase.h"
13 #include "ExtruderScreen.h"
14 #include "libs/nuts_bolts.h"
15 #include "libs/utils.h"
16 #include "ModifyValuesScreen.h"
17 #include "PublicData.h"
18 #include "checksumm.h"
19
20 #include <string>
21
22 using namespace std;
23
24 #define extruder_checksum CHECKSUM("extruder")
25
26 ExtruderScreen::ExtruderScreen()
27 {
28 }
29
30 void ExtruderScreen::on_enter()
31 {
32 THEPANEL->enter_menu_mode();
33 THEPANEL->setup_menu(4);
34 this->refresh_menu();
35 }
36
37 void ExtruderScreen::on_refresh()
38 {
39 if ( THEPANEL->menu_change() ) {
40 this->refresh_menu();
41 }
42 if ( THEPANEL->click() ) {
43 this->clicked_menu_entry(THEPANEL->get_menu_current_line());
44 }
45 }
46
47 void ExtruderScreen::display_menu_line(uint16_t line)
48 {
49 switch ( line ) {
50 case 0: THEPANEL->lcd->printf("Back"); break;
51 case 1: THEPANEL->lcd->printf("Extrude 5mm"); break;
52 case 2: THEPANEL->lcd->printf("Retract 5mm"); break;
53 case 3: THEPANEL->lcd->printf("Settings..."); break;
54 }
55 }
56
57 void ExtruderScreen::clicked_menu_entry(uint16_t line)
58 {
59 switch ( line ) {
60 case 0: THEPANEL->enter_screen(this->parent); return;
61 case 1: send_command("M120\nG91\nG1 E5 F100\nM121"); break;
62 case 2: send_command("M120\nG91\nG1 E-5 F100\nM121"); break;
63 case 3: setupConfigSettings(); break; // lazy load
64 }
65 }
66
67 void ExtruderScreen::setupConfigSettings()
68 {
69 auto mvs= new ModifyValuesScreen(true); // self delete on exit
70 mvs->set_parent(this);
71
72 mvs->addMenuItem("E steps/mm",
73 // gets steps/mm for currently active extruder
74 []() -> float { float *rd; if(PublicData::get_value( extruder_checksum, (void **)&rd )) return *rd; else return 0.0F; },
75 [this](float v) { send_gcode("M92", 'E', v); },
76 0.1F,
77 1.0F
78 );
79
80 mvs->addMenuItem("Filament diameter",
81 // gets filament diameter for currently active extruder
82 []() -> float { float *rd; if(PublicData::get_value( extruder_checksum, (void **)&rd )) return *(rd+1); else return 0.0F; },
83 [this](float v) { send_gcode("M200", 'D', v); },
84 0.01F,
85 0.0F,
86 4.0F
87 );
88
89 // flow rate
90 mvs->addMenuItem("Flow rate", // menu name
91 []() -> float { float *rd; if(PublicData::get_value( extruder_checksum, (void **)&rd )) return *(rd+2)*100.0F; else return 100.0F; }, // getter as fraction
92 [this](float fr) { send_gcode("M221", 'S', fr); }, // setter in percent
93 1.0F, // increment
94 1.0F // Min
95 );
96
97 mvs->addMenuItem("Accel", // menu name
98 []() -> float { float *rd; if(PublicData::get_value( extruder_checksum, (void **)&rd )) return *(rd+3); else return 0; }, // getter
99 [this](float acc) { send_gcode("M204", 'E', acc); }, // setter
100 10.0F, // increment
101 1.0F // Min
102 );
103
104 mvs->addMenuItem("Retract len", // menu name
105 []() -> float { float *rd; if(PublicData::get_value( extruder_checksum, (void **)&rd )) return *(rd+4); else return 0; }, // getter
106 [this](float l) { send_gcode("M207", 'S', l); }, // setter
107 0.1F, // increment
108 0.0F // Min
109 );
110
111 THEPANEL->enter_screen(mvs);
112 }