interating temperature controllers was done wrong. refactoring that error.
authorJim Morris <morris@wolfman.com>
Sat, 12 Sep 2015 02:20:56 +0000 (19:20 -0700)
committerJim Morris <morris@wolfman.com>
Sat, 12 Sep 2015 02:20:56 +0000 (19:20 -0700)
  Instead of keeping a list of temperature_controllers in kernel (wher eit does not belong)
  we now do a public data request for all tempoerature controllers to return their current data.
  this is the way all modules need to poll other optional modules.

src/libs/Kernel.h
src/main.cpp
src/modules/tools/temperaturecontrol/TemperatureControl.cpp
src/modules/tools/temperaturecontrol/TemperatureControlPool.cpp
src/modules/tools/temperaturecontrol/TemperatureControlPool.h
src/modules/tools/temperaturecontrol/TemperatureControlPublicAccess.h
src/modules/tools/temperatureswitch/TemperatureSwitch.cpp
src/modules/utils/panel/screens/PrepareScreen.cpp
src/modules/utils/panel/screens/WatchScreen.cpp
src/modules/utils/panel/screens/WatchScreen.h
src/modules/utils/player/Player.cpp

index 7dee848..520597d 100644 (file)
@@ -30,7 +30,6 @@ class Planner;
 class StepTicker;
 class Adc;
 class PublicData;
-class TemperatureControlPool;
 
 class Kernel {
     public:
@@ -53,7 +52,6 @@ class Kernel {
         Config*           config;
         Conveyor*         conveyor;
         Pauser*           pauser;
-        TemperatureControlPool* temperature_control_pool;
 
         int debug;
         SlowTicker*       slow_ticker;
index 656772a..8cf56af 100644 (file)
@@ -157,9 +157,7 @@ void init() {
     // Note order is important here must be after extruder so Tn as a parameter will get executed first
     TemperatureControlPool *tp= new TemperatureControlPool();
     tp->load_tools();
-    kernel->temperature_control_pool= tp;
-    #else
-    kernel->temperature_control_pool= new TemperatureControlPool(); // so we can get just an empty temperature control array
+    delete tp;
     #endif
     #ifndef NO_TOOLS_LASER
     kernel->add_module( new Laser() );
@@ -183,7 +181,7 @@ void init() {
     kernel->add_module( new Network() );
     #endif
     #ifndef NO_TOOLS_TEMPERATURESWITCH
-    // Must be loaded after TemperatureControlPool
+    // Must be loaded after TemperatureControl
     kernel->add_module( new TemperatureSwitch() );
     #endif
     #ifndef NO_TOOLS_DRILLINGCYCLES
index 43d583d..8078cfe 100644 (file)
@@ -354,7 +354,32 @@ void TemperatureControl::on_get_public_data(void *argument)
         }
         return;
 
-    }else if(!pdr->second_element_is(this->name_checksum)) return;
+    }else if(!pdr->second_element_is(poll_controls_checksum)) {
+        // polling for all temperature controls
+        // add our data to the list
+        std::vector<struct pad_temperature*> *v;
+        void *data= pdr->get_data_ptr();
+        if(data == nullptr) {
+            // first one allocates a vector for the return data
+            v= new std::vector<struct pad_temperature*> ;
+            pdr->set_data_ptr(v);
+
+        }else{
+            v= static_cast<std::vector<pad_temperature*>*>(data);
+        }
+
+        // setup data
+        this->public_data_return.current_temperature = this->get_temperature();
+        this->public_data_return.target_temperature = (target_temperature <= 0) ? 0 : this->target_temperature;
+        this->public_data_return.pwm = this->o;
+        this->public_data_return.designator= this->designator;
+        this->public_data_return.id= this->name_checksum;
+        v->push_back(&this->public_data_return);
+        return;
+    }
+
+    // not targeted at us
+    if(!pdr->second_element_is(this->name_checksum)) return;
 
     // ok this is targeted at us, so send back the requested data
     if(pdr->third_element_is(current_temperature_checksum)) {
@@ -362,6 +387,7 @@ void TemperatureControl::on_get_public_data(void *argument)
         this->public_data_return.target_temperature = (target_temperature <= 0) ? 0 : this->target_temperature;
         this->public_data_return.pwm = this->o;
         this->public_data_return.designator= this->designator;
+        this->public_data_return.id= this->name_checksum;
         pdr->set_data_ptr(&this->public_data_return);
         pdr->set_taken();
     }
index 65b8ed6..debd8bb 100644 (file)
@@ -22,7 +22,6 @@ using namespace std;
 
 void TemperatureControlPool::load_tools()
 {
-
     vector<uint16_t> modules;
     THEKERNEL->config->get_module_list( &modules, temperature_control_checksum );
     int cnt = 0;
@@ -30,7 +29,6 @@ void TemperatureControlPool::load_tools()
         // If module is enabled
         if( THEKERNEL->config->value(temperature_control_checksum, cs, enable_checksum )->as_bool() ) {
             TemperatureControl *controller = new TemperatureControl(cs, cnt++);
-            controllers.push_back( cs );
             THEKERNEL->add_module(controller);
         }
     }
index 9544ee1..c0d8767 100644 (file)
 class TemperatureControlPool {
     public:
         void load_tools();
-        const std::vector<uint16_t>& get_controllers() const { return controllers; };
-
-    private:
-        std::vector<uint16_t> controllers;
 };
 
 
index 4792f42..fcedb8f 100644 (file)
 #define target_temperature_checksum       CHECKSUM("target_temperature")
 #define temperature_pwm_checksum          CHECKSUM("temperature_pwm")
 #define pool_index_checksum               CHECKSUM("pool_index")
+#define poll_controls_checksum            CHECKSUM("poll_controllers")
 
 struct pad_temperature {
     float current_temperature;
     float target_temperature;
     int pwm;
+    uint16_t id;
     std::string designator;
 };
 #endif
index d6a5724..aa6b643 100755 (executable)
@@ -86,17 +86,13 @@ bool TemperatureSwitch::load_config(uint16_t modcs)
     // 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
-    auto& tempcontrollers= THEKERNEL->temperature_control_pool->get_controllers();
-
     // see what its designator is and add to list of it the one we specified
-    void *returned_temp;
-    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 (temp.designator[0] == designator) {
-                ts->temp_controllers.push_back(controller);
+    std::vector<struct pad_temperature*> *controllers;
+    bool ok = PublicData::get_value(temperature_control_checksum, poll_controls_checksum, (void**)&controllers);
+    if (ok) {
+        for (auto &c : *controllers) {
+            if (c->designator[0] == designator) {
+                ts->temp_controllers.push_back(c->id);
             }
         }
     }
index e163f0d..1905ffa 100644 (file)
@@ -26,7 +26,9 @@ using namespace std;
 PrepareScreen::PrepareScreen()
 {
     // Children screens
-    if(THEKERNEL->temperature_control_pool->get_controllers().size() > 0) {
+    void *controllers;
+    bool ok = PublicData::get_value(temperature_control_checksum, poll_controls_checksum, &controllers);
+    if (ok) {
         this->extruder_screen = (new ExtruderScreen())->set_parent(this);
     }else{
         this->extruder_screen= nullptr;
@@ -118,27 +120,26 @@ void PrepareScreen::setup_temperature_screen()
 
     int cnt= 0;
     // returns enabled temperature controllers
-    for(auto i : THEKERNEL->temperature_control_pool->get_controllers()) {
-        void *returned_data;
-        bool ok = PublicData::get_value( temperature_control_checksum, i, current_temperature_checksum, &returned_data );
-        if (!ok) continue;
-
-        struct pad_temperature t =  *static_cast<struct pad_temperature *>(returned_data);
-
-        // rename if two of the known types
-        const char *name;
-        if(t.designator == "T") name= "Hotend";
-        else if(t.designator == "B") name= "Bed";
-        else name= t.designator.c_str();
-
-        mvs->addMenuItem(name, // menu name
-            [i]() -> float { return getTargetTemperature(i); }, // getter
-            [i](float t) { PublicData::set_value( temperature_control_checksum, i, &t ); }, // setter
-            1.0F, // increment
-            0.0F, // Min
-            500.0F // Max
-        );
-        cnt++;
+    std::vector<struct pad_temperature*> *controllers;
+    bool ok = PublicData::get_value(temperature_control_checksum, poll_controls_checksum, (void**)&controllers);
+    if (ok) {
+        for (auto &c : *controllers) {
+            // rename if two of the known types
+            const char *name;
+            if(c->designator == "T") name= "Hotend";
+            else if(c->designator == "B") name= "Bed";
+            else name= c->designator.c_str();
+            uint16_t i= c->id;
+
+            mvs->addMenuItem(name, // menu name
+                [i]() -> float { return getTargetTemperature(i); }, // getter
+                [i](float t) { PublicData::set_value( temperature_control_checksum, i, &t ); }, // setter
+                1.0F, // increment
+                0.0F, // Min
+                500.0F // Max
+            );
+            cnt++;
+        }
     }
 
     if(cnt > 0) {
index c83b363..a4f8782 100644 (file)
@@ -126,15 +126,16 @@ void WatchScreen::on_refresh()
         // for LCDs with leds set them according to heater status
         bool bed_on= false, hotend_on= false, is_hot= false;
         uint8_t heon=0, hemsk= 0x01; // bit set for which hotend is on bit0: hotend1, bit1: hotend2 etc
-        for(auto m : THEKERNEL->temperature_control_pool->get_controllers()) {
-            // query each heater
-            void *p= getTemperatures(m);
-            struct pad_temperature *temp= static_cast<struct pad_temperature *>(p);
-            if(temp != nullptr) {
-                if(temp->current_temperature > 50) is_hot= true; // anything is hot
-                if(temp->designator.front() == 'B' && temp->target_temperature > 0) bed_on= true;   // bed on/off
-                if(temp->designator.front() == 'T') { // a hotend by convention
-                    if(temp->target_temperature > 0){
+        temp_controllers.clear();
+        std::vector<struct pad_temperature*> *controllers;
+        bool ok = PublicData::get_value(temperature_control_checksum, poll_controls_checksum, (void**)&controllers);
+        if (ok) {
+            for (auto &c : *controllers) {
+                temp_controllers.push_back(c->id);
+                if(c->current_temperature > 50) is_hot= true; // anything is hot
+                if(c->designator.front() == 'B' && c->target_temperature > 0) bed_on= true;   // bed on/off
+                if(c->designator.front() == 'T') { // a hotend by convention
+                    if(c->target_temperature > 0){
                         hotend_on= true;// hotend on/off (anyone)
                         heon |= hemsk;
                     }
@@ -254,7 +255,7 @@ void WatchScreen::display_menu_line(uint16_t line)
     switch ( line ) {
         case 0:
         {
-            auto& tm= THEKERNEL->temperature_control_pool->get_controllers();
+            auto& tm= this->temp_controllers;
             if(tm.size() > 0) {
                 // only if we detected heaters in config
                 int n= 0;
index bf723ca..5f3e4de 100644 (file)
@@ -31,6 +31,7 @@ private:
     const char *get_status();
     const char *get_network();
     void *getTemperatures(uint16_t heater_cs);
+    std::vector<uint16_t> temp_controllers;
 
     uint32_t update_counts;
     int current_speed;
index 5175a5d..10cb071 100644 (file)
@@ -535,20 +535,19 @@ void Player::suspend_part2()
 
     this->saved_temperatures.clear();
     if(!this->leave_heaters_on) {
-        // save current temperatures
-        for(auto m : THEKERNEL->temperature_control_pool->get_controllers()) {
+        // save current temperatures, get a vector of all the controllers data
+        std::vector<struct pad_temperature*> *controllers;
+        bool ok = PublicData::get_value(temperature_control_checksum, poll_controls_checksum, (void**)&controllers);
+        if (ok) {
             // query each heater and save the target temperature if on
-            void *p;
-            if(PublicData::get_value( temperature_control_checksum, m, current_temperature_checksum, &p )) {
-                struct pad_temperature *temp= static_cast<struct pad_temperature *>(p);
+            for (auto &c : *controllers) {
                 // TODO see if in exclude list
-                if(temp != nullptr && temp->target_temperature > 0) {
-                    this->saved_temperatures[m]= temp->target_temperature;
+                if(c->target_temperature > 0) {
+                    this->saved_temperatures[c->id]= c->target_temperature;
                 }
             }
         }
 
-
         // turn off heaters that were on
         for(auto& h : this->saved_temperatures) {
             float t= 0;