Example #1
0
/// 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;
		}
	}
}
Example #2
0
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);
}
Example #3
0
/// 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;
}
Example #5
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;
}