static void ow_temp_event_thread(void *arg) { struct ow_temp_softc *sc; uint8_t scratch[8 + 1]; uint8_t crc; int retries, rv; sc = arg; pause("owtstart", device_get_unit(sc->dev) * hz / 100); // 10ms stagger mtx_lock(&sc->temp_lock); sc->flags |= OW_TEMP_RUNNING; ow_temp_read_power_supply(sc->dev, &sc->parasite); if (sc->parasite) device_printf(sc->dev, "Running in parasitic mode unsupported\n"); while ((sc->flags & OW_TEMP_DONE) == 0) { mtx_unlock(&sc->temp_lock); ow_temp_convert_t(sc->dev); mtx_lock(&sc->temp_lock); msleep(sc, &sc->temp_lock, 0, "owtcvt", hz); if (sc->flags & OW_TEMP_DONE) break; for (retries = 5; retries > 0; retries--) { mtx_unlock(&sc->temp_lock); rv = ow_temp_read_scratchpad(sc->dev, scratch, sizeof(scratch)); mtx_lock(&sc->temp_lock); if (rv == 0) { crc = own_crc(sc->dev, scratch, sizeof(scratch) - 1); if (crc == scratch[8]) { if (sc->type == OWT_DS1820) { if (scratch[7]) { /* * Formula from DS18S20 datasheet, page 6 * DS18S20 datahseet says count_per_c is 16, DS1820 does not */ sc->temp = (int16_t)((scratch[0] & 0xfe) | (scratch[1] << 8)) << 3; sc->temp += 16 - scratch[6] - 4; /* count_per_c == 16 */ } else sc->temp = (int16_t)(scratch[0] | (scratch[1] << 8)) << 3; } else sc->temp = (int16_t)(scratch[0] | (scratch[1] << 8)); sc->temp = sc->temp * 1000 / 16 + 273150; break; } sc->bad_crc++; } else sc->bad_reads++; } msleep(sc, &sc->temp_lock, 0, "owtcvt", sc->reading_interval); } sc->flags &= ~OW_TEMP_RUNNING; mtx_unlock(&sc->temp_lock); kproc_exit(0); }
int16_t lome6_get_temperature (struct ow_rom_code_t *rom) { int16_t retval = 0x7FFF; // error // disable interrupts uint8_t sreg = SREG; cli(); struct ow_temp_scratchpad_t sp; if (ow_temp_read_scratchpad(rom, &sp) != 1) goto out; // scratchpad read failed uint16_t temp = ow_temp_normalize(rom, &sp); retval = ((int8_t) HI8(temp)) * 10 + HI8(((temp & 0x00ff) * 10) + 0x80); out: sei(); SREG = sreg; return retval; }
/*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; } } } }