Пример #1
0
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);
}
Пример #2
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;
	
}
Пример #3
0
/*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;
			}
		}
	}
}