/// set up temp sensors. Currently only the 'intercom' sensor needs initialisation. void temp_init() { temp_sensor_t i; for (i = 0; i < NUM_TEMP_SENSORS; i++) { switch(temp_sensors[i].temp_type) { #ifdef TEMP_MAX6675 // initialised when read /* case TT_MAX6675: break;*/ #endif #ifdef TEMP_THERMISTOR // handled by analog_init() /* case TT_THERMISTOR: break;*/ #endif #ifdef TEMP_AD595 // handled by analog_init() /* case TT_AD595: break;*/ #endif #ifdef TEMP_INTERCOM case TT_INTERCOM: intercom_init(); send_temperature(0, 0); break; #endif default: /* prevent compiler warning */ break; } } }
static PT_THREAD(thread_periodic_send(struct pt *pt)) { PT_BEGIN(pt); while(1) { TIMER_RADIO_SEND = 0; PT_WAIT_UNTIL(pt, node_id != NODE_ID_UNDEFINED && timer_reached( TIMER_RADIO_SEND, 200)); send_temperature(); } PT_END(pt); }
/// Set up temp sensors. void temp_init() { temp_sensor_t i; for (i = 0; i < NUM_TEMP_SENSORS; i++) { switch(temp_sensors[i].temp_type) { #ifdef TEMP_MAX6675 case TT_MAX6675: WRITE(SS, 1); // Turn sensor off. SET_OUTPUT(SS); // Intentionally no break, we might have more than one sensor type. #endif #ifdef TEMP_THERMISTOR // handled by analog_init() /* case TT_THERMISTOR: break;*/ #endif #ifdef TEMP_AD595 // handled by analog_init() /* case TT_AD595: break;*/ #endif #ifdef TEMP_INTERCOM case TT_INTERCOM: // Enable the RS485 transceiver SET_OUTPUT(RX_ENABLE_PIN); SET_OUTPUT(TX_ENABLE_PIN); WRITE(RX_ENABLE_PIN,0); disable_transmit(); intercom_init(); send_temperature(0, 0); // Intentionally no break. #endif default: /* prevent compiler warning */ break; } } }
int main (void) { uint8_t msglen = 0; uint8_t msg[BUS_MAXRECVMSGLEN]; uint16_t module_id = BUS_UNKNOWNADR, sender = 0, val; uint16_t new_temp; DDRC |= ((1<<PC3) | (1<<PC4)); PORTC &= ~((1<<PC3) | (1<<PC4)); clk_initialize(); //register_set_u16(MOD_eReg_ModuleID, 0x000E); // configure a bus node with address X register_get(MOD_eReg_ModuleID, 0, &module_id); bus_configure(&g_bus, module_id); bus_initialize(&g_bus, 0);// initialize bus on UART 0 spi_master_init_blk(); zagw_initialize(); sei(); register_get(APP_eReg_DesiredTempDay1, 0, &g_target_temp); gdisp_initialize(); gdisp_goto_col_line(0,0); gdisp_put_text("aktuell"); gdisp_goto_col_line(61,0); gdisp_put_text("Soll"); draw_temperatures(); draw_window_closed(); gdisp_choose_font(gdisp_font1_x8); gdisp_goto_col_line(0,3); gdisp_put_text("Addr: "); draw_hex16_value(g_bus.sCfg.uOwnNodeAddress); clk_timer_start(&g_app_timer, 100); while (1) { if (bus_get_message(&g_bus)) { if (bus_read_message(&g_bus, &sender, &msglen, msg)) { interpret_message(&g_bus, msg, msglen, sender); } } if (clk_timer_is_elapsed(&g_app_timer)) { clk_timer_start(&g_app_timer,10); gdisp_choose_font(gdisp_font1_x8); gdisp_goto_col_line(0,3); gdisp_put_text("Temp: "); if (zagw_receive()) { val = zagw_get_bits(); draw_hex16_value(val); new_temp = zagw_get_temperature(); if (new_temp != g_current_temp) { send_temperature(new_temp); } g_current_temp = new_temp; draw_temperatures(); } else { gdisp_put_text("PERR"); } } } return 0; }
static void send_temperature(struct stts751_data *mdata) { double temp; static const double steps[] = { 0.5, 0.25, 0.125, 0.0625 }; struct sol_drange val = { .min = -64.0, .max = 127.9375, .step = steps[mdata->resolution - 9] }; SOL_DBG("Temperature registers H:0x%x, L:0x%x", mdata->temp_h, mdata->temp_l); temp = mdata->temp_h; /* XXX Check if negative conversion is right */ temp += ((double)(mdata->temp_l) / (1 << 8)); /* To Kelvin */ temp += 273.16; val.val = temp; sol_flow_send_drange_packet(mdata->node, SOL_FLOW_NODE_TYPE_STTS751__OUT__KELVIN, &val); } static void read_cb(void *cb_data, struct sol_i2c *i2c, uint8_t reg, uint8_t *data, ssize_t status) { struct stts751_data *mdata = cb_data; mdata->i2c_pending = NULL; if (status < 0) { const char errmsg[] = "Failed to read STTS751 temperature status"; SOL_WRN(errmsg); sol_flow_send_error_packet(mdata->node, EIO, errmsg); mdata->reading_step = READING_NONE; return; } /* If reading status, let's check it */ if (mdata->reading_step == READING_STATUS && mdata->status) { const char errmsg[] = "Invalid temperature status: 0x%x"; SOL_WRN(errmsg, mdata->status); mdata->reading_step = READING_NONE; return; } /* Last step, send temperature */ if (mdata->reading_step == READING_TEMP_L) { send_temperature(mdata); mdata->reading_step = READING_NONE; return; } mdata->reading_step++; stts751_read(mdata); } static bool stts751_read(void *data) { struct stts751_data *mdata = data; uint8_t reg, *dst; mdata->timer = NULL; if (!set_slave(mdata, stts751_read)) return false; switch (mdata->reading_step) { case READING_STATUS: reg = STATUS_REGISTER; dst = &mdata->status; break; case READING_TEMP_H: reg = TEMPERATURE_REGISTER_H; dst = (uint8_t *)&mdata->temp_h; break; case READING_TEMP_L: reg = TEMPERATURE_REGISTER_L; dst = &mdata->temp_l; break; default: SOL_WRN("Invalid reading step"); return false; } mdata->i2c_pending = sol_i2c_read_register(mdata->i2c, reg, dst, sizeof(*dst), read_cb, mdata); if (!mdata->i2c_pending) { const char errmsg[] = "Failed to read STTS751 temperature"; SOL_WRN(errmsg); sol_flow_send_error_packet(mdata->node, EIO, errmsg); mdata->reading_step = READING_NONE; } return false; } static int temperature_stts751_tick(struct sol_flow_node *node, void *data, uint16_t port, uint16_t conn_id, const struct sol_flow_packet *packet) { struct stts751_data *mdata = data; if (mdata->reading_step != READING_NONE) { SOL_WRN("Reading operation in progress, discading TICK"); return 0; } /* First, read the status, if it's ok, then we read temp high and low */ mdata->reading_step = READING_STATUS; stts751_read(mdata); return 0; }