X-Git-Url: https://the.earth.li/gitweb/?a=blobdiff_plain;f=main.c;h=de54471813640c91a8b5cb4d476ecd4c614e1789;hb=fb126acc7d712c6495a2039a451b06b49e0197b2;hp=9899cb90ef2556bf4e18f1fda89e8847a79c405c;hpb=0949ba3935c9c2ec778adc94eb25cdd65e3cba4e;p=temper-clone.git diff --git a/main.c b/main.c index 9899cb9..de54471 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 { @@ -39,6 +40,10 @@ typedef struct { } keyboard_report_t; 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; @@ -216,6 +221,36 @@ 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 && @@ -282,6 +317,7 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) usbMsgLen_t usbFunctionWrite(uint8_t * data, uchar len) { if (len == 1) { + PORTB |= 1 << PB1; // LED on if (data[0] != ledstate) { ledstate = data[0]; @@ -301,13 +337,12 @@ 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); have_temp_int = true; temp_report[0] = 0x80; temp_report[1] = 2; - /* Fake 15°C */ - temp_report[2] = 0xF; - temp_report[3] = 0x0; - + 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 */ @@ -328,26 +363,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; @@ -371,5 +415,46 @@ int main(void) have_temp_int = false; } } + + if (temp_state == 1) { + if (w1_reset()) { + temp_state++; + } else { + temp_state = 0; + } + } else if (temp_state == 2) { + w1_write(0xCC); /* SKIP ROM */ + temp_state++; + } else if (temp_state == 3) { + w1_write(0x44); /* Convert T */ + temp_state++; + } else if (temp_state == 4) { + if (w1_read_bit()) + temp_state++; + } else if (temp_state == 5) { + if (w1_reset()) { + temp_state++; + } else { + temp_state = 0; + } + } else if (temp_state == 6) { + w1_write(0xCC); /* SKIP ROM */ + temp_state++; + } else if (temp_state == 7) { + w1_write(0xBE); /* Read Scratchpad */ + temp_state++; + } else if (temp_state > 7 && temp_state < 17) { + buf[temp_state - 8] = w1_read_byte(); + temp_state++; + } else if (temp_state == 17) { + 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; + } } }