X-Git-Url: https://the.earth.li/gitweb/?a=blobdiff_plain;f=main.c;h=bcc4008fb06047bb719be722feeba1a856712947;hb=267a3bfd1e8892f8ae75bc4b3d1a5c4b310f1805;hp=0adfed8cc246c636c0180b32bffe295d9fdc20ca;hpb=97e6ede6c1e3556ec66f11ad66c6ba7c36885423;p=temper-clone.git diff --git a/main.c b/main.c index 0adfed8..bcc4008 100644 --- a/main.c +++ b/main.c @@ -30,6 +30,7 @@ #include "usbdrv.h" #include "libs-device/osccal.h" +#include "timer.h" #include "w1.h" typedef struct { @@ -40,6 +41,8 @@ typedef struct { keyboard_report_t keyboard_report; uint8_t temp_state = 0; +uint16_t last_temp = 0xFFFD; +#define TEMP_INTERVAL (10 * 1000) uint8_t temp_report[8]; bool have_temp_int = false; @@ -218,36 +221,6 @@ void set_serial(void) } } -uint16_t read_temp(void) -{ - uint8_t buf[9]; - - cli(); - if (!w1_reset()) { - return 0xFFFF; - sei(); - } - - w1_write(0xCC); /* SKIP ROM */ - w1_write(0x44); /* Convert T */ - - do { - w1_read(buf, 1); - } while (buf[0] != 0xFF); - - if (!w1_reset()) { - return 0xFFFF; - sei(); - } - - w1_write(0xCC); /* SKIP ROM */ - w1_write(0xBE); /* Read Scratchpad */ - w1_read(buf, 9); - sei(); - - return buf[2] << 8 | buf[1]; -} - usbMsgLen_t usbFunctionDescriptor(usbRequest_t *rq) { if (rq->wValue.bytes[1] == USBDESCR_STRING && @@ -335,9 +308,11 @@ usbMsgLen_t usbFunctionWrite(uint8_t * data, uchar len) if (data[1] == 0x80 && data[2] == 0x33 && data[3] == 1) { /* Temperature query */ memset(temp_report, 0, 8); - temp_state = 1; + have_temp_int = true; temp_report[0] = 0x80; temp_report[1] = 2; + temp_report[2] = last_temp >> 8; + temp_report[3] = last_temp & 0xFF; } else if (data[1] == 0x82 && data[2] == 0x77 && data[3] == 1) { /* Initialisation Query #1 */ @@ -358,27 +333,35 @@ usbMsgLen_t usbFunctionWrite(uint8_t * data, uchar len) return 0; } +void hadUsbReset(void) +{ + /* Reset our state machine back to having nothing to send */ + temp_state = 0; + have_temp_int = false; +} + int main(void) { unsigned char i; uint8_t buf[9]; + unsigned long last_temp_time = 0; wdt_enable(WDTO_1S); w1_setup(); set_serial(); + timer_init(); - usbInit(); usbDeviceDisconnect(); - i = 0; while (--i) { wdt_reset(); _delay_ms(1); } - usbDeviceConnect(); + usbInit(); + /* PB1 as output for LED */ DDRB |= 1 << PB1; @@ -405,45 +388,43 @@ int main(void) if (temp_state == 1) { if (w1_reset()) { - temp_state = 2; + temp_state++; } else { - temp_report[2] = 0xFF; - temp_report[3] = 0xFF; - have_temp_int = true; temp_state = 0; } } else if (temp_state == 2) { w1_write(0xCC); /* SKIP ROM */ - temp_state = 3; + temp_state++; } else if (temp_state == 3) { w1_write(0x44); /* Convert T */ - temp_state = 4; + temp_state++; } else if (temp_state == 4) { - if (w1_read_byte() == 0xFF) - temp_state = 5; + if (w1_read_bit()) + temp_state++; } else if (temp_state == 5) { if (w1_reset()) { - temp_state = 6; + temp_state++; } else { - temp_report[2] = 0xFF; - temp_report[3] = 0xFE; - have_temp_int = true; temp_state = 0; } } else if (temp_state == 6) { w1_write(0xCC); /* SKIP ROM */ - temp_state = 7; + temp_state++; } else if (temp_state == 7) { w1_write(0xBE); /* Read Scratchpad */ - temp_state = 8; + temp_state++; } else if (temp_state > 7 && temp_state < 17) { buf[temp_state - 8] = w1_read_byte(); temp_state++; } else if (temp_state == 17) { - temp_report[2] = buf[1] << 4 | buf[0] >> 4; - temp_report[3] = buf[0] << 4; - have_temp_int = true; + last_temp = buf[1] << 12 | buf[0] << 4; temp_state = 0; + last_temp_time = millis(); + } + + if (temp_state == 0 && + (millis() - last_temp_time) > TEMP_INTERVAL) { + temp_state = 1; } } }