From 275704b50826d48d147e9bd1cf33b9b72311a9aa Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Fri, 12 Mar 2021 22:22:06 +0100 Subject: [PATCH 1/7] Fixed BME280 driver init --- hardware/BME280.c | 2 +- main.c | 4 ++-- util/Config.h | 17 +---------------- util/time.h | 12 ++++++++---- 4 files changed, 12 insertions(+), 23 deletions(-) diff --git a/hardware/BME280.c b/hardware/BME280.c index 11b6d19..af4c19e 100644 --- a/hardware/BME280.c +++ b/hardware/BME280.c @@ -250,7 +250,7 @@ bool bme280_init(uint8_t cs_usrio_pin) { bme280_temperature_fine_adjust = BME280_TEMPERATURE_ADJUSTMENT; - USR_IO_DDR |= bme280_cs_usrio_pin; + USR_IO_DDR |= _BV(bme280_cs_usrio_pin); SPI_DDR |= _BV(SPI_MOSI) | _BV(SPI_CLK); SPI_DDR &= ~(_BV(SPI_MISO)); diff --git a/main.c b/main.c index dcf406a..0b7e90f 100755 --- a/main.c +++ b/main.c @@ -104,12 +104,12 @@ void init(void) { mtime_t sensor_poll_time = 0; void sensor_jobs(void) { - if (rtc_milliseconds() > sensor_poll_time+config_sensor_interval_ms) { + if (milliseconds() > sensor_poll_time) { if (config_sensor_bme280_enabled && bme280_ready) { bme280_poll(); } - sensor_poll_time = rtc_milliseconds(); + sensor_poll_time = milliseconds() + config_sensor_interval_ms; } } diff --git a/util/Config.h b/util/Config.h index 69732bd..0820bf9 100644 --- a/util/Config.h +++ b/util/Config.h @@ -120,19 +120,4 @@ void EEPROM_updatebyte(uint16_t addr, uint8_t data); uint8_t EEPROM_readbyte(uint16_t addr); void EEPROM_writebyte(uint16_t addr, uint8_t data); -#endif - -/* - CSMA P - CSMA Slot Time - Preamble - Tail - - LED intensity - Output gain - Input gain - - Pass-all - - Log packets -*/ \ No newline at end of file +#endif \ No newline at end of file diff --git a/util/time.h b/util/time.h index c361b5c..df3054a 100755 --- a/util/time.h +++ b/util/time.h @@ -35,6 +35,10 @@ inline mtime_t ticks_to_ms(ticks_t ticks) { return DIV_ROUND(ticks, DIV_ROUND(CLOCK_TICKS_PER_SEC, 1000)); } +static inline mtime_t milliseconds(void) { + return ticks_to_ms(timer_clock()); +} + static inline uint32_t rtc_seconds(void) { uint32_t result; @@ -45,6 +49,10 @@ static inline uint32_t rtc_seconds(void) { return result; } +static inline mtime_t rtc_milliseconds(void) { + return ticks_to_ms(timer_clock() % CLOCK_TICKS_PER_SEC); +} + static inline uint32_t rtc_unix_timestamp(void) { uint32_t result; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { @@ -54,10 +62,6 @@ static inline uint32_t rtc_unix_timestamp(void) { return result+UNIX_EPOCH_OFFSET; } -static inline mtime_t rtc_milliseconds(void) { - return ticks_to_ms(timer_clock() % CLOCK_TICKS_PER_SEC); -} - static inline void rtc_set_seconds(uint32_t seconds) { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { _rtc_seconds = seconds; From f2f5944824c56e0f3ce65e9ec83299093519486f Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Fri, 12 Mar 2021 22:22:40 +0100 Subject: [PATCH 2/7] Version 1.06 release --- device.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device.h b/device.h index 62fe0c1..aa358ca 100755 --- a/device.h +++ b/device.h @@ -5,7 +5,7 @@ // Version info #define MAJ_VERSION 0x01 -#define MIN_VERSION 0x05 +#define MIN_VERSION 0x06 // CPU settings #define TARGET_CPU m1284p From c4f7275886d61fe29d9ba4d7665812861ae1bc04 Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Fri, 12 Mar 2021 22:33:16 +0100 Subject: [PATCH 3/7] Updated precompiled firmwares --- precompiled/OpenModem_AFSK1200.zip | Bin 69246 -> 73050 bytes precompiled/OpenModem_AFSK2400.zip | Bin 69341 -> 73123 bytes precompiled/OpenModem_AFSK300.zip | Bin 69265 -> 73095 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/precompiled/OpenModem_AFSK1200.zip b/precompiled/OpenModem_AFSK1200.zip index 6ae4bb5c6760d2f6d8b52f2063f40d1eaf6afd97..3e32e1a1c78f41918bbfaaf70cd757505d989f6c 100644 GIT binary patch literal 73050 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