/* * lome6 startup function * get the sensor id's from the config and convert them to struct ow_rom_code_t and read the scratchpads * start a first one wire temperature convert */ void lome6_startup(void) { iLCDPage = 0; iTemperatureCPU = 0; iTemperatureSB = 0; iCountdownTimer = 0; iUptime = 0; iPOD = 0; #ifdef LOME6_ONEWIRE_SUPPORT iTemperatureAIR = 0; iTemperaturePSU = 0; iTemperatureRAM = 0; #endif #ifdef LOME6_LCD_SUPPORT WINDOW *ttyWindow = NULL; #endif #ifdef LOME6_ONEWIRE_SUPPORT if (parse_ow_rom(CONF_SENSOR_PSU, &romcodePSU) == -1) { LOME6DEBUG("cannot parse ow rom code for psu sensor\n"); } if (parse_ow_rom(CONF_SENSOR_AIR, &romcodeAIR) == -1) { LOME6DEBUG("cannot parse ow rom code for air sensor\n"); } if (parse_ow_rom(CONF_SENSOR_RAM, &romcodeRAM) == -1) { LOME6DEBUG("cannot parse ow rom code for ram sensor\n"); } ow_temp_start_convert_nowait(NULL); #endif #ifdef LOME6_LCD_SUPPORT ttyWindow = subwin(NULL, CONF_LOME6_LCD_HEIGHT, CONF_LOME6_LCD_WIDTH, 0, 0); #endif // only set iPOD if server not running // (disable power on delay if server is running already) if (PIN_HIGH(POWER_STATE)) iPOD = CONF_LOME6_POD; }
/* * lome6 periodical timer function for display and one wire convert command * * if onewire is supported start onewire temperature convert * if lcd is supported display various information */ void lome6_timer(void) { #ifdef LOME6_ONEWIRE_SUPPORT // read 1w temperatures iTemperaturePSU = lome6_get_temperature(&romcodePSU); iTemperatureAIR = lome6_get_temperature(&romcodeAIR); iTemperatureRAM = lome6_get_temperature(&romcodeRAM); #endif // LOME6_ONEWIRE_SUPPORT #ifdef LOME6_LCD_SUPPORT wclear(ttyWindow); if (iLCDPage == 0) { // display uptime and date+time uint32_t working_hours = (clock_get_time() - clock_get_startup()) / 60; struct clock_datetime_t datetime; clock_current_localtime(&datetime); wprintw_P(ttyWindow, PSTR("%02d:%02d %02d.%02d.%04d"), datetime.hour, datetime.min, datetime.day, datetime.month, (datetime.year + 1900)); wclrtoeol(ttyWindow); wmove(ttyWindow, 1, 0); wprintw_P(ttyWindow, PSTR("Uptime: %02lu:%02d"), working_hours / 60, working_hours % 60); wclrtoeol(ttyWindow); #ifndef LOME6_ONEWIRE_SUPPORT if (!PIN_HIGH(POWER_STATE)) iLCDPage = 4; else iLCDPage = 0; #else iLCDPage++; #endif #ifdef LOME6_ONEWIRE_SUPPORT } else if (iLCDPage == 1) { // display onewire temperature sensor data wprintw_P(ttyWindow, PSTR("Temperature")); wclrtoeol(ttyWindow); wmove(ttyWindow, 1, 0); wprintw_P(ttyWindow, PSTR("AIR: %02d.%d"), iTemperatureAIR / 10, iTemperatureAIR % 10); wclrtoeol(ttyWindow); iLCDPage++; } else if (iLCDPage == 2) { // display onewire temperature sensor data wprintw_P(ttyWindow, PSTR("Temperature:")); wclrtoeol(ttyWindow); wmove(ttyWindow, 1, 0); wprintw_P(ttyWindow, PSTR("RAM: %02d.%d"), iTemperatureRAM / 10, iTemperatureRAM % 10); wclrtoeol(ttyWindow); iLCDPage++; } else if (iLCDPage == 3) { // display onewire temperature sensor data wprintw_P(ttyWindow, PSTR("Temperature")); wclrtoeol(ttyWindow); wmove(ttyWindow, 1, 0); wprintw_P(ttyWindow, PSTR("PSU: %02d.%d"), iTemperaturePSU / 10, iTemperaturePSU % 10); wclrtoeol(ttyWindow); iLCDPage++; #endif //LOME6_ONEWIRE_SUPPORT } else if (iLCDPage == 4) { // display temperature data wprintw_P(ttyWindow, PSTR("Temperature")); wclrtoeol(ttyWindow); wmove(ttyWindow, 1, 0); wprintw_P(ttyWindow, PSTR("CPU: %02d.%d"), iTemperatureCPU / 10, iTemperatureCPU % 10); wclrtoeol(ttyWindow); iLCDPage++; } else if (iLCDPage == 5) { // display temperature data wprintw_P(ttyWindow, PSTR("Temperature")); wclrtoeol(ttyWindow); wmove(ttyWindow, 1, 0); wprintw_P(ttyWindow, PSTR("SB: %02d.%d"), iTemperatureSB / 10, iTemperatureSB % 10); wclrtoeol(ttyWindow); iLCDPage = 0; } // start a new convert in next round ow_temp_start_convert_nowait(NULL); #endif // LOME6_LCD_SUPPORT }
/*This function will be called every 800 ms*/ void ow_periodic(void) { /*At startup we want an immediate discovery*/ static uint16_t discover_delay = 3; if (--discover_delay == 0) { discover_delay = OW_DISCOVER_DELAY; ow_discover_sensor(); #ifdef DEBUG_OW_POLLING for (uint8_t i = 0, k = 0; i < OW_SENSORS_COUNT; i++) { if (ow_sensors[i].ow_rom_code.raw != 0) { debug_printf("sensor #%d in list is: %02x %02x %02x %02x %02x %02x %02x %02x\n", ++k, ow_sensors[i].ow_rom_code.bytewise[0], ow_sensors[i].ow_rom_code.bytewise[1], ow_sensors[i].ow_rom_code.bytewise[2], ow_sensors[i].ow_rom_code.bytewise[3], ow_sensors[i].ow_rom_code.bytewise[4], ow_sensors[i].ow_rom_code.bytewise[5], ow_sensors[i].ow_rom_code.bytewise[6], ow_sensors[i].ow_rom_code.bytewise[7]); } } #endif /* DEBUG_OW_POLLING */ } for (uint8_t i = 0; i < OW_SENSORS_COUNT; i++) { if (ow_temp_sensor(&ow_sensors[i].ow_rom_code)) { if (ow_sensors[i].converted == 1) { if (ow_sensors[i].convert_delay == 1) ow_sensors[i].convert_delay = 0; else { #ifdef DEBUG_OW_POLLING debug_printf("reading temperature\n"); #endif /* DEBUG_OW_POLLING */ int8_t ret; ow_temp_scratchpad_t sp; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { ret = ow_temp_read_scratchpad(&ow_sensors[i].ow_rom_code, &sp); } if (ret != 1) { #ifdef DEBUG_OW_POLLING debug_printf("scratchpad read failed: %d\n", ret); #endif /* DEBUG_OW_POLLING */ return; } #ifdef DEBUG_OW_POLLING debug_printf("scratchpad read succeeded\n"); #endif /* DEBUG_OW_POLLING */ int16_t temp = ow_temp_normalize(&ow_sensors[i].ow_rom_code, &sp); #ifdef DEBUG_OW_POLLING debug_printf("temperature: %d.%d\n", HI8(temp), LO8(temp) > 0 ? 5 : 0); #endif /* DEBUG_OW_POLLING */ ow_sensors[i].temp = ((int8_t) HI8(temp)) * 10 + HI8(((temp & 0x00ff) * 10) + 0x80); ow_sensors[i].converted = 0; } } if (--ow_sensors[i].read_delay == 0 && ow_sensors[i].converted == 0) { ow_sensors[i].read_delay = OW_READ_DELAY; ow_temp_start_convert_nowait(&ow_sensors[i].ow_rom_code); ow_sensors[i].convert_delay = 1; ow_sensors[i].converted = 1; } } } }