#include "StreamOutputPool.h"
#define temperatureswitch_checksum CHECKSUM("temperatureswitch")
-#define temperatureswitch_enable_checksum CHECKSUM("enable")
+#define enable_checksum CHECKSUM("enable")
#define temperatureswitch_hotend_checksum CHECKSUM("hotend")
#define temperatureswitch_threshold_temp_checksum CHECKSUM("threshold_temp")
#define temperatureswitch_type_checksum CHECKSUM("type")
#define temperatureswitch_heatup_poll_checksum CHECKSUM("heatup_poll")
#define temperatureswitch_cooldown_poll_checksum CHECKSUM("cooldown_poll")
+#define designator_checksum CHECKSUM("designator")
TemperatureSwitch::TemperatureSwitch()
{
+ this->temperatureswitch_state = false;
+ this->second_counter = 0;
}
// Load module
void TemperatureSwitch::on_module_loaded()
{
- // TODO load multiple instances of temperature switch linked to different temp controls and switches
+ vector<uint16_t> modulist;
+ // allow for multiple temperature switches
+ THEKERNEL->config->get_module_list(&modulist, temperatureswitch_checksum);
+ for (auto m : modulist) {
+ load_config(m);
+ }
- // free up space if not loaded
- if (!THEKERNEL->config->value(temperatureswitch_checksum, temperatureswitch_hotend_checksum, temperatureswitch_enable_checksum)->by_default(false)->as_bool()) {
- delete this;
- return;
+ // no longer need this instance as it is just used to load the other instances
+ delete this;
+}
+
+
+bool TemperatureSwitch::load_config(uint16_t modcs)
+{
+ // see if enabled
+ if (!THEKERNEL->config->value(temperatureswitch_checksum, modcs, enable_checksum)->by_default(false)->as_bool()) {
+ return false;
}
- // load settings
+ // create a temperature control and load settings
+
+ char designator= 0;
+ string s= THEKERNEL->config->value(temperatureswitch_checksum, modcs, designator_checksum)->by_default("")->as_string();
+ if(s.empty()){
+ // for backward compatibility temperatureswitch.hotend will need designator 'T' by default
+ if(modcs == temperatureswitch_hotend_checksum) designator= 'T';
+
+ }else{
+ designator= s[0];
+ }
- // get the list of temperature controllers and remove any that don't have designator == "T"
- vector<uint16_t> controller_list;
- THEKERNEL->config->get_module_list(&controller_list, temperature_control_checksum);
+ if(designator == 0) return false; // no designator then not valid
+ // create a new temperature switch module
+ TemperatureSwitch *ts= new TemperatureSwitch();
+
+ // get the list of temperature controllers and remove any that don't have designator == specified designator
+ vector<uint16_t> tempcontrollers;
+ THEKERNEL->config->get_module_list(&tempcontrollers, temperature_control_checksum);
+
+ // see what its designator is and add to list of it the one we specified
void *returned_temp;
- for (auto controller : controller_list) {
+ for (auto controller : tempcontrollers) {
bool temp_ok = PublicData::get_value(temperature_control_checksum, controller, current_temperature_checksum, &returned_temp);
if (temp_ok) {
struct pad_temperature temp = *static_cast<struct pad_temperature *>(returned_temp);
- // if the controller is a hotend (designator == "T") then keep it
- if (temp.designator.substr(0, 1) == "T") {
- temp_controllers.push_back(controller);
+ if (temp.designator[0] == designator) {
+ ts->temp_controllers.push_back(controller);
}
}
}
- // if we don't have any controllers, free up space
- if (temp_controllers.empty()) {
- delete this;
- return;
+ // if we don't have any matching controllers, then not valid
+ if (ts->temp_controllers.empty()) {
+ delete ts;
+ return false;
}
// load settings from config file
- this->temperatureswitch_state = false;
- this->temperatureswitch_type_cs = get_checksum(THEKERNEL->config->value(temperatureswitch_checksum, temperatureswitch_hotend_checksum, temperatureswitch_type_checksum)->by_default("")->as_string());
- this->temperatureswitch_threshold_temp = THEKERNEL->config->value(temperatureswitch_checksum, temperatureswitch_hotend_checksum, temperatureswitch_threshold_temp_checksum)->by_default(50.0f)->as_number();
+ s = THEKERNEL->config->value(temperatureswitch_checksum, modcs, temperatureswitch_type_checksum)->by_default("")->as_string();
+ if(s.empty()) {
+ // no type specified so invalid entry
+ delete this;
+ return false;
+ }
+ ts->temperatureswitch_type_cs= get_checksum(s); // checksum of the switch to use
- // these are to tune the heatup and cooldown polling frequencies
- this->temperatureswitch_heatup_poll = THEKERNEL->config->value(temperatureswitch_checksum, temperatureswitch_hotend_checksum, temperatureswitch_heatup_poll_checksum)->by_default(15)->as_number();
- this->temperatureswitch_cooldown_poll = THEKERNEL->config->value(temperatureswitch_checksum, temperatureswitch_hotend_checksum, temperatureswitch_cooldown_poll_checksum)->by_default(60)->as_number();
+ ts->temperatureswitch_threshold_temp = THEKERNEL->config->value(temperatureswitch_checksum, modcs, temperatureswitch_threshold_temp_checksum)->by_default(50.0f)->as_number();
- second_counter = 0;
- current_delay = this->temperatureswitch_heatup_poll;
+ // these are to tune the heatup and cooldown polling frequencies
+ ts->temperatureswitch_heatup_poll = THEKERNEL->config->value(temperatureswitch_checksum, modcs, temperatureswitch_heatup_poll_checksum)->by_default(15)->as_number();
+ ts->temperatureswitch_cooldown_poll = THEKERNEL->config->value(temperatureswitch_checksum, modcs, temperatureswitch_cooldown_poll_checksum)->by_default(60)->as_number();
+ ts->current_delay = ts->temperatureswitch_heatup_poll;
// Register for events
- this->register_for_event(ON_SECOND_TICK);
+ ts->register_for_event(ON_SECOND_TICK);
+
+ return true;
}
// Called once a second but we only need to service on the cooldown and heatup poll intervals
void on_second_tick(void *argument);
private:
+ bool load_config(uint16_t modcs);
+
// turn the switch on or off
void set_switch(bool cooler_state);
+ // the set of temperature controllers that match the reuired designator prefix
+ vector<uint16_t> temp_controllers;
// get the highest temperature from the set of configured temperature controllers
float get_highest_temperature();
- // these are set in the config file
-
- // temperatureswitch.hotend.type
- uint16_t temperatureswitch_type_cs;
-
// temperatureswitch.hotend.threshold_temp
float temperatureswitch_threshold_temp;
- // is the switch currently on (1) or off (0)?
- bool temperatureswitch_state;
+ // temperatureswitch.hotend.type
+ uint16_t temperatureswitch_type_cs;
// check temps on heatup every X seconds
// this can be set in config: temperatureswitch.hotend.heatup_poll
// we are delaying for this many seconds
uint16_t current_delay;
- // the set of all known temperature controllers
- vector<uint16_t> temp_controllers;
+ // is the switch currently on (1) or off (0)?
+ bool temperatureswitch_state;
};
#endif