1 #include "libs/Kernel.h"
2 #include "CurrentControl.h"
3 #include "libs/nuts_bolts.h"
4 #include "libs/utils.h"
9 // add new digipot chips here
16 CurrentControl::CurrentControl(){
20 void CurrentControl::on_module_loaded(){
21 if( !THEKERNEL
->config
->value( currentcontrol_module_enable_checksum
)->by_default(false)->as_bool() ){
22 // as this module is not needed free up the resource
27 // allocate digipot, if already allocated delete it first
30 // see which chip to use
31 int chip_checksum
= get_checksum(THEKERNEL
->config
->value(digipotchip_checksum
)->by_default("mcp4451")->as_string());
32 if(chip_checksum
== mcp4451_checksum
) {
33 digipot
= new MCP4451();
34 }else if(chip_checksum
== ad5206_checksum
) {
35 digipot
= new AD5206();
36 }else { // need a default so use smoothie
37 digipot
= new MCP4451();
41 this->alpha_current
= THEKERNEL
->config
->value(alpha_current_checksum
)->by_default(0.8f
)->as_number();
42 this->beta_current
= THEKERNEL
->config
->value(beta_current_checksum
)->by_default(0.8f
)->as_number();
43 this->gamma_current
= THEKERNEL
->config
->value(gamma_current_checksum
)->by_default(0.8f
)->as_number();
44 this->delta_current
= THEKERNEL
->config
->value(delta_current_checksum
)->by_default(0.8f
)->as_number();
45 this->epsilon_current
= THEKERNEL
->config
->value(epsilon_current_checksum
)->by_default(-1)->as_number();
46 this->zeta_current
= THEKERNEL
->config
->value(zeta_current_checksum
)->by_default(-1)->as_number();
47 this->eta_current
= THEKERNEL
->config
->value(eta_current_checksum
)->by_default(-1)->as_number();
48 this->theta_current
= THEKERNEL
->config
->value(theta_current_checksum
)->by_default(-1)->as_number();
50 digipot
->set_max_current( THEKERNEL
->config
->value(digipot_max_current
)->by_default(2.0f
)->as_number());
51 digipot
->set_factor( THEKERNEL
->config
->value(digipot_factor
)->by_default(113.33f
)->as_number());
53 this->digipot
->set_current(0, this->alpha_current
);
54 this->digipot
->set_current(1, this->beta_current
);
55 this->digipot
->set_current(2, this->gamma_current
);
56 this->digipot
->set_current(3, this->delta_current
);
57 if(this->epsilon_current
>= 0){
58 this->digipot
->set_current(4, this->epsilon_current
);
59 this->digipot
->set_current(5, this->zeta_current
);
60 this->digipot
->set_current(6, this->eta_current
);
61 this->digipot
->set_current(7, this->theta_current
);
64 this->original_delta_current
= this->delta_current
; // remember this to determine if we want to save on M500
66 this->register_for_event(ON_GCODE_RECEIVED
);
70 void CurrentControl::on_gcode_received(void *argument
)
72 Gcode
*gcode
= static_cast<Gcode
*>(argument
);
73 char alpha
[8] = { 'X', 'Y', 'Z', 'E', 'A', 'B', 'C', 'D' };
79 for (i
= 0; i
< 8; i
++)
81 if (gcode
->has_letter(alpha
[i
])){
82 float c
= gcode
->get_value(alpha
[i
]);
83 this->digipot
->set_current(i
, c
);
85 case 0: this->alpha_current
= c
; break;
86 case 1: this->beta_current
= c
; break;
87 case 2: this->gamma_current
= c
; break;
88 case 3: this->delta_current
= c
; break;
89 case 4: this->epsilon_current
= c
; break;
90 case 5: this->zeta_current
= c
; break;
91 case 6: this->eta_current
= c
; break;
92 case 7: this->theta_current
= c
; break;
95 gcode
->stream
->printf("%c:%3.1fA%c", alpha
[i
], this->digipot
->get_current(i
), (i
== 7)?'\n':' ');
98 }else if(gcode
->m
== 500 || gcode
->m
== 503) {
99 if(this->delta_current
!= this->original_delta_current
) { // if not the same as loaded by config then save it
100 gcode
->stream
->printf(";Extruder current:\nM907 E%1.5f\n", this->delta_current
);