Mercurial > pihelp
changeset 1:e23c1b6f6080
few more changes
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Mon, 03 Jun 2013 19:17:36 +0800 |
parents | 8705acff2494 |
children | 0a6cbbb8c2b7 |
files | Makefile main.c |
diffstat | 2 files changed, 139 insertions(+), 673 deletions(-) [+] |
line wrap: on
line diff
--- a/Makefile Sat Jun 01 01:38:42 2013 +0800 +++ b/Makefile Mon Jun 03 19:17:36 2013 +0800 @@ -23,9 +23,9 @@ PROGRAMMER = #-c stk500v2 -P avrdoper PROGRAMMER = -c stk500 -P ~/dev/stk500 -p $(PROGDEVICE) -B 2 SOURCE_1WIRE = onewire.c simple_ds18b20.c crc8.c -SOURCE_CRYPTO = sha1.c hmac-sha1.c sha1-asm.S +SOURCE_CRYPTO = hmac-sha1.c sha1-asm.S SOURCE = main.c -SOURCE += $(SOURCE_1WIRE) $(SOURCE_CRYPTO) +SOURCE += (SOURCE_CRYPTO) LIBS = -lm # default but 2mhz
--- a/main.c Sat Jun 01 01:38:42 2013 +0800 +++ b/main.c Mon Jun 03 19:17:36 2013 +0800 @@ -13,14 +13,8 @@ #include <util/atomic.h> #include <util/crc16.h> -#include "simple_ds18b20.h" -#include "onewire.h" - -// configuration params -// - measurement interval -// - transmit interval -// - bluetooth params -// - number of sensors (and range?) +//#include "simple_ds18b20.h" +//#include "onewire.h" #define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) #define MAX(X,Y) ((X) > (Y) ? (X) : (Y)) @@ -28,10 +22,12 @@ // TICK should be 8 or less (8 untested). all timers need // to be a multiple. -#define TICK 6 +#define TICK 1 // we have 1024 prescaler, 32768 crystal. #define SLEEP_COMPARE (32*TICK-1) +#define KEYLEN 20 + #define VALUE_NOSENSOR 0x07D0 // 125 degrees #define VALUE_BROKEN 0x07D1 // 125.0625 @@ -77,62 +73,35 @@ uint8_t rem; }; -// eeprom-settable parameters. all timeouts should -// be a multiple of TICK (6 seconds probably) -static uint16_t measure_wake = 61; // not a divisor of comms_wake -static uint16_t comms_wake = 600; -static uint8_t wake_secs = 30; -// decidegrees -static int16_t fridge_setpoint = 180; // 18.0ºC -static uint16_t fridge_difference = 3; // 0.3ºC -static uint16_t fridge_delay = 600; // seconds +// eeprom-settable parameters, default values defined here. +// all timeouts should be a multiple of TICK +static uint32_t watchdog_long_limit = 60*60*24; +static uint32_t watchdog_short_limit = 0; +static uint32_t newboot_limit = 60*10; -static uint16_t overshoot_delay = 720; // 12 mins -static uint8_t overshoot_factor = 10; // 1.0ºC +// avr proves itself +static uint8_t avr_keys[NKEYS][KEYLEN] = {0}; + // ---- Atomic guards required accessing these variables // clock_epoch in seconds static uint32_t clock_epoch; -static uint16_t comms_count; -static uint16_t measure_count; +// watchdog counts up +static uint32_t watchdog_long_count; +static uint32_t watchdog_short_count; +// newboot counts down - it's a one-shot +static uint32_t newboot_count; // ---- End atomic guards required -static uint16_t n_measurements; - -// calculated at startup as TOTAL_MEASUREMENTS/n_sensors -static uint16_t max_measurements; - -static uint16_t measurements[TOTAL_MEASUREMENTS]; - -static struct epoch_ticks first_measurement_clock; -// last_measurement_clock is redundant but checks that we're not missing -// samples -static struct epoch_ticks last_measurement_clock; -static struct epoch_ticks last_comms_clock; - // boolean flags -static uint8_t need_measurement; -static uint8_t need_comms; -static uint8_t uart_enabled; -static uint8_t stay_awake; -static uint8_t button_pressed; - -// counts down from WAKE_SECS to 0, goes to deep sleep when hits 0 -static uint8_t comms_timeout; +static uint8_t watchdog_long_hit; +static uint8_t watchdog_short_hit; +static uint8_t newboot_hit; static uint8_t readpos; -static char readbuf[30]; +static char readbuf[50]; static uint8_t have_cmd; -static uint8_t n_sensors; -static uint8_t sensor_id[MAX_SENSORS][ID_LEN]; - -static int16_t last_fridge = DS18X20_INVALID_DECICELSIUS; -static int16_t last_wort = DS18X20_INVALID_DECICELSIUS; -static struct epoch_ticks fridge_off_clock = {0}; -static struct epoch_ticks fridge_on_clock = {0}; -static struct epoch_ticks wort_valid_clock = {0}; - int uart_putchar(char c, FILE *stream); static void long_delay(int ms); static void blink(); @@ -141,62 +110,26 @@ static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); -static uint16_t crc_out; -static FILE _crc_stdout = FDEV_SETUP_STREAM(uart_putchar, NULL, - _FDEV_SETUP_WRITE); -// convenience -static FILE *crc_stdout = &_crc_stdout; - - // thanks to http://projectgus.com/2010/07/eeprom-access-with-arduino/ #define eeprom_read_to(dst_p, eeprom_field, dst_size) eeprom_read_block((dst_p), (void *)offsetof(struct __eeprom_data, eeprom_field), (dst_size)) #define eeprom_read(dst, eeprom_field) eeprom_read_to((&dst), eeprom_field, sizeof(dst)) #define eeprom_write_from(src_p, eeprom_field, src_size) eeprom_write_block((src_p), (void *)offsetof(struct __eeprom_data, eeprom_field), (src_size)) #define eeprom_write(src, eeprom_field) { eeprom_write_from(&src, eeprom_field, sizeof(src)); } -#define EXPECT_MAGIC 0x67c9 +#define EXPECT_MAGIC 0xdf83 struct __attribute__ ((__packed__)) __eeprom_data { - uint16_t measure_wake; - uint16_t comms_wake; - uint8_t wake_secs; - - int16_t fridge_setpoint; // decidegrees - uint16_t fridge_difference; // decidegrees - uint16_t fridge_delay; + uint32_t watchdog_long_limit; + uint32_t watchdog_short_limit; + uint32_t newboot_limit; - uint16_t overshoot_delay; - uint8_t overshoot_factor; // decidegrees - -#if 0 - static uint8_t wort_id[ID_LEN]; - static uint8_t fridge_id[ID_LEN]; -#endif + uint8_t avr_key[NKEYS][KEYLEN]; uint16_t magic; }; -static const uint8_t fridge_id[ID_LEN] = - {0x28,0xCE,0xB2,0x1A,0x03,0x00,0x00,0x99}; -static const uint8_t wort_id[ID_LEN] = - {0x28,0x49,0xBC,0x1A,0x03,0x00,0x00,0x54}; - static void deep_sleep(); -// 0 or 1 -static uint8_t -is_fridge_on() -{ - if (PORT_FRIDGE & _BV(PIN_FRIDGE)) - { - return 1; - } - else - { - return 0; - } -} - // Very first setup static void setup_chip() @@ -209,22 +142,22 @@ WDTCSR |= _BV(WDCE) | _BV(WDE); WDTCSR = 0; + // set to 8S, in case sha1 is slow etc. + wdt_enable(WDTO_8S); + // Set clock to 2mhz CLKPR = _BV(CLKPCE); // divide by 4 CLKPR = _BV(CLKPS1); // enable pullups + // XXX matt pihelp PORTB = 0xff; // XXX change when using SPI PORTD = 0xff; PORTC = 0xff; // 3.3v power for bluetooth and SD DDR_LED |= _BV(PIN_LED); - DDR_SHDN |= _BV(PIN_SHDN); - - PORT_FRIDGE &= ~_BV(PIN_FRIDGE); - DDR_FRIDGE |= _BV(PIN_FRIDGE); // set pullup PORTD |= _BV(PD2); @@ -243,19 +176,6 @@ } static void -set_aux_power(uint8_t on) -{ - if (on) - { - PORT_SHDN &= ~_BV(PIN_SHDN); - } - else - { - PORT_SHDN |= _BV(PIN_SHDN); - } -} - -static void get_epoch_ticks(struct epoch_ticks *t) { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) @@ -265,18 +185,6 @@ } } -static void -set_measurement(uint8_t sensor, uint16_t measurement, uint16_t reading) -{ - measurements[sensor*max_measurements + measurement] = reading; -} - -static uint16_t -get_measurement(uint8_t sensor, uint16_t measurement) -{ - return measurements[sensor*max_measurements + measurement]; -} - static void setup_tick_counter() { @@ -357,90 +265,6 @@ } static void -cmd_fetch() -{ - crc_out = 0; - - fprintf_P(crc_stdout, PSTR("START\n")); - { - struct epoch_ticks now; - get_epoch_ticks(&now); - fprintf_P(crc_stdout, PSTR("now=%lu\n"), now.ticks); - fprintf_P(crc_stdout, PSTR("now_rem=%hhu\n"), now.rem); - } - fprintf_P(crc_stdout, PSTR("time_step=%hu\n"), measure_wake); - fprintf_P(crc_stdout, PSTR("first_time=%lu\n"), first_measurement_clock.ticks); - fprintf_P(crc_stdout, PSTR("first_time_rem=%hhu\n"), first_measurement_clock.rem); - fprintf_P(crc_stdout, PSTR("last_time=%lu\n"), last_measurement_clock.ticks); - fprintf_P(crc_stdout, PSTR("last_time_rem=%hhu\n"), last_measurement_clock.rem); - fprintf_P(crc_stdout, PSTR("comms_time=%lu\n"), last_comms_clock.ticks); - fprintf_P(crc_stdout, PSTR("comms_time_rem=%hhu\n"), last_comms_clock.rem); - fprintf_P(crc_stdout, PSTR("voltage=%hu\n"), adc_vcc()); - fprintf_P(crc_stdout, PSTR("measure=%hu\n"), measure_wake); - fprintf_P(crc_stdout, PSTR("comms=%hu\n"), comms_wake); - fprintf_P(crc_stdout, PSTR("wake=%hhu\n"), wake_secs); - fprintf_P(crc_stdout, PSTR("fridge=%.1f\n"), fridge_setpoint/10.0); - fprintf_P(crc_stdout, PSTR("fridge_diff=%.1f\n"), fridge_difference/10.0); - fprintf_P(crc_stdout, PSTR("fridge_delay=%hu\n"), fridge_delay); - fprintf_P(crc_stdout, PSTR("overshoot_factor=%.1f\n"), overshoot_factor/10.0); - fprintf_P(crc_stdout, PSTR("overshoot_delay=%hu\n"), overshoot_delay); - fprintf_P(crc_stdout, PSTR("fridge_status=%hhu\n"), is_fridge_on()); - fprintf_P(crc_stdout, PSTR("fridge_last_on=%lu\n"), fridge_on_clock.ticks); - fprintf_P(crc_stdout, PSTR("fridge_last_off=%lu\n"), fridge_off_clock.ticks); - fprintf_P(crc_stdout, PSTR("last_fridge=%hu\n"), last_fridge); - fprintf_P(crc_stdout, PSTR("last_wort=%hu\n"), last_wort); - fprintf_P(crc_stdout, PSTR("tick_secs=%d\n"), TICK); - fprintf_P(crc_stdout, PSTR("tick_wake=%d\n"), SLEEP_COMPARE); - fprintf_P(crc_stdout, PSTR("maxsens=%hhu\n"), MAX_SENSORS); - fprintf_P(crc_stdout, PSTR("totalmeas=%hu\n"), TOTAL_MEASUREMENTS); - fprintf_P(crc_stdout, PSTR("sensors=%hhu\n"), n_sensors); - for (uint8_t s = 0; s < n_sensors; s++) - { - fprintf_P(crc_stdout, PSTR("sensor_id%hhu="), s); - printhex(sensor_id[s], ID_LEN, crc_stdout); - fputc('\n', crc_stdout);