allow different emperature switch instances controlling different switches and readin...
authorJim Morris <morris@wolfman.com>
Wed, 27 Aug 2014 04:45:48 +0000 (21:45 -0700)
committerJim Morris <morris@wolfman.com>
Wed, 27 Aug 2014 04:45:48 +0000 (21:45 -0700)
ConfigSamples/Smoothieboard/config
src/modules/tools/temperatureswitch/TemperatureSwitch.cpp
src/modules/tools/temperatureswitch/TemperatureSwitch.h

index bc68568..9aba64f 100644 (file)
@@ -179,8 +179,9 @@ switch.fan.output_type                       pwm              # pwm output setta
 
 # automatically toggle a switch at a specified temperature
 # useful to turn on a fan or water pump to cool the hotend
-#temperatureswitch.hotend.enable                 true             #
-#temperatureswitch.hotend.type                misc             # select which MOSFET to use, fan or misc (small MOSFETs)
+#temperatureswitch.hotend.enable                   true             #
+#temperatureswitch.hotend.designator          T                # first character of the temperature control designator to use as the temperature sensor to monitor
+#temperatureswitch.hotend.type                misc             # select which switch to use, matches the name of the defined switch
 #temperatureswitch.hotend.threshold_temp      60.0             # temperature to turn on (if rising) or off the switch
 #temperatureswitch.hotend.heatup_poll         15               # poll heatup at 15 sec intervals
 #temperatureswitch.hotend.cooldown_poll       60               # poll cooldown at 60 sec intervals
index 979d207..098a644 100755 (executable)
@@ -28,66 +28,101 @@ Author: Michael Hackney, mhackney@eclecticangler.com
 #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
index 286ecc4..7f931c9 100755 (executable)
@@ -30,22 +30,21 @@ class TemperatureSwitch : public Module
         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
@@ -61,8 +60,8 @@ class TemperatureSwitch : public Module
         // 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