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.
class StepTicker;
class Adc;
class PublicData;
-class TemperatureControlPool;
class Kernel {
public:
Config* config;
Conveyor* conveyor;
Pauser* pauser;
- TemperatureControlPool* temperature_control_pool;
int debug;
SlowTicker* slow_ticker;
// 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() );
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
}
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)) {
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();
}
void TemperatureControlPool::load_tools()
{
-
vector<uint16_t> modules;
THEKERNEL->config->get_module_list( &modules, temperature_control_checksum );
int cnt = 0;
// 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);
}
}
class TemperatureControlPool {
public:
void load_tools();
- const std::vector<uint16_t>& get_controllers() const { return controllers; };
-
- private:
- std::vector<uint16_t> controllers;
};
#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
// 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);
}
}
}
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;
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) {
// 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;
}
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;
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;
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;