X-Git-Url: https://the.earth.li/gitweb/?a=blobdiff_plain;f=main.c;h=bcc4008fb06047bb719be722feeba1a856712947;hb=HEAD;hp=4e3d72c3c4667e5a55a9713d8eff3466b8d9e0b8;hpb=f259a83606c7e6692970cd0ec814a7414a481938;p=temper-clone.git diff --git a/main.c b/main.c index 4e3d72c..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 */ @@ -369,11 +344,13 @@ 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(); usbDeviceDisconnect(); i = 0; @@ -411,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_bit()) - temp_state = 5; + 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; } } }