Merge pull request #449 from cyberman54/development

Development
This commit is contained in:
Verkehrsrot 2019-09-20 21:31:33 +02:00 committed by GitHub
commit e2d0cb6ca1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 52 additions and 53 deletions

View File

@ -311,7 +311,7 @@ Note: all settings are stored in NVRAM and will be reloaded when device starts.
Example for EU868: Example for EU868:
DataRate Radio Bit/s DataRate Configuration Bit/s
0 LoRa: SF12 / 125 kHz 250 0 LoRa: SF12 / 125 kHz 250
1 LoRa: SF11 / 125 kHz 440 1 LoRa: SF11 / 125 kHz 440
2 LoRa: SF10 / 125 kHz 980 2 LoRa: SF10 / 125 kHz 980
@ -320,20 +320,33 @@ Note: all settings are stored in NVRAM and will be reloaded when device starts.
5 LoRa: SF7 / 125 kHz 5470 5 LoRa: SF7 / 125 kHz 5470
6* LoRa: SF7 / 250 kHz 11000 6* LoRa: SF7 / 250 kHz 11000
7* FSK: 50 kbps 50000 7* FSK: 50 kbps 50000
8 .. 14 reserved for future use (RFU)
15 ignored (device keeps current setting)
*) not supported by TheThingsNetwork *) not supported by TheThingsNetwork
0x06 set LoRa TXpower 0x06 set LoRa TXpower
0 ... 15 [default: 14] 0 ... 15 [default: 7]
TXPower Configuration
0 Max EIRP (usually +16dB)
1 -2dB
2 -4dB
3 -6dB
4 -8dB
5 -10dB
6 -12dB
7 -14dB
8 .. 14 reserved for future use (RFU)
15 ignored (device keeps current setting)
0x07 set LoRa Adaptive Data Rate mode 0x07 set LoRa Adaptive Data Rate mode
0 = ADR off 0 = ADR off
1 = ADR on [default] 1 = ADR on [default]
Note: set ADR to off, if device is moving, set to on, if not. If ADR is set to off, SF value is shown inverted on display.
If ADR is set to on, SF value is shown inverted on display.
0x08 do nothing 0x08 do nothing

View File

@ -42,7 +42,8 @@
#define SCREEN_MODE (0x80) #define SCREEN_MODE (0x80)
// I2C bus access control // I2C bus access control
#define I2C_MUTEX_LOCK() (xSemaphoreTake(I2Caccess, pdMS_TO_TICKS(10)) == pdTRUE) #define I2C_MUTEX_LOCK() \
(xSemaphoreTake(I2Caccess, pdMS_TO_TICKS(10)) == pdTRUE)
#define I2C_MUTEX_UNLOCK() (xSemaphoreGive(I2Caccess)) #define I2C_MUTEX_UNLOCK() (xSemaphoreGive(I2Caccess))
enum sendprio_t { prio_low, prio_normal, prio_high }; enum sendprio_t { prio_low, prio_normal, prio_high };
@ -103,9 +104,9 @@ extern std::set<uint16_t, std::less<uint16_t>, Mallocator<uint16_t>> macs;
extern std::array<uint64_t, 0xff>::iterator it; extern std::array<uint64_t, 0xff>::iterator it;
extern std::array<uint64_t, 0xff> beacons; extern std::array<uint64_t, 0xff> beacons;
extern configData_t cfg; // current device configuration extern configData_t cfg; // current device configuration
extern char display_line6[], display_line7[]; // screen buffers extern char lmic_event_msg[]; // display buffer
extern uint8_t volatile channel; // wifi channel rotation counter extern uint8_t volatile channel; // wifi channel rotation counter
extern uint16_t volatile macs_total, macs_wifi, macs_ble, extern uint16_t volatile macs_total, macs_wifi, macs_ble,
batt_voltage; // display values batt_voltage; // display values
extern bool volatile TimePulseTick; // 1sec pps flag set by GPS or RTC extern bool volatile TimePulseTick; // 1sec pps flag set by GPS or RTC

View File

@ -7,7 +7,7 @@
; ---> SELECT THE TARGET PLATFORM HERE! <--- ; ---> SELECT THE TARGET PLATFORM HERE! <---
[board] [board]
halfile = generic.h ;halfile = generic.h
;halfile = ebox.h ;halfile = ebox.h
;halfile = eboxtube.h ;halfile = eboxtube.h
;halfile = ecopower.h ;halfile = ecopower.h
@ -18,7 +18,7 @@ halfile = generic.h
;halfile = ttgov21old.h ;halfile = ttgov21old.h
;halfile = ttgov21new.h ;halfile = ttgov21new.h
;halfile = ttgofox.h ;halfile = ttgofox.h
;halfile = ttgobeam.h halfile = ttgobeam.h
;halfile = ttgobeam10.h ;halfile = ttgobeam10.h
;halfile = fipy.h ;halfile = fipy.h
;halfile = lopy.h ;halfile = lopy.h
@ -46,7 +46,7 @@ description = Paxcounter is a device for metering passenger flows in realtime. I
release_version = 1.8.3 release_version = 1.8.3
; DEBUG LEVEL: For production run set to 0, otherwise device will leak RAM while running! ; DEBUG LEVEL: For production run set to 0, otherwise device will leak RAM while running!
; 0=None, 1=Error, 2=Warn, 3=Info, 4=Debug, 5=Verbose ; 0=None, 1=Error, 2=Warn, 3=Info, 4=Debug, 5=Verbose
debug_level = 3 debug_level = 4
extra_scripts = pre:build.py extra_scripts = pre:build.py
otakeyfile = ota.conf otakeyfile = ota.conf
lorakeyfile = loraconf.h lorakeyfile = loraconf.h

View File

@ -10,15 +10,17 @@ Display-Mask (128 x 64 pixel):
0|PAX:aabbccddee 0|PAX:aabbccddee
1|PAX:aabbccddee 1|PAX:aabbccddee
2|B:a.bcV Sats:ab 2|B:a.bcV Sats:ab
3|BLTH:abcde SF:ab 3|BLTH:abcde SFab
4|WIFI:abcde ch:ab 4|WIFI:abcde ch:ab
5|RLIM:abcd abcdKB 5|RLIM:abcd abcdKB
6|xxxxxxxxxxxxxxxx
6|20:27:00* 27.Feb 6|20:27:00* 27.Feb
7|yyyyyyyyyyyyyyab 7|yyyyyyyyyyyyyyab
line 6: x = Text for LORA status OR time/date line 6: * = char {L|G|R|?} indicates time source,
line 7: y = Text for LMIC status; ab = payload queue inverse = clock controller is active,
pulsed = pps input signal is active
line 7: y = LMIC event message; ab = payload queue length
*/ */
@ -203,10 +205,10 @@ void draw_page(time_t t, uint8_t page) {
#if (HAS_LORA) #if (HAS_LORA)
u8x8.setCursor(11, 3); u8x8.setCursor(11, 3);
if (cfg.adrmode) // if ADR=on then display SF value inverse if (!cfg.adrmode) // if ADR=off then display SF value inverse
u8x8.setInverseFont(1); u8x8.setInverseFont(1);
u8x8.printf("%5s", getSfName(updr2rps(LMIC.datarate))); u8x8.printf("%4s", getSfName(updr2rps(LMIC.datarate)));
if (cfg.adrmode) // switch off inverse if it was turned on if (!cfg.adrmode) // switch off inverse if it was turned on
u8x8.setInverseFont(0); u8x8.setInverseFont(0);
#endif // HAS_LORA #endif // HAS_LORA
@ -239,17 +241,13 @@ void draw_page(time_t t, uint8_t page) {
#endif // HAS_DCF77 || HAS_IF482 #endif // HAS_DCF77 || HAS_IF482
if (timeSource != _unsynced) if (timeSource != _unsynced)
u8x8.printf(" %2d.%3s", day(t), printmonth[month(t)]); u8x8.printf(" %2d.%3s", day(t), printmonth[month(t)]);
#else // update LoRa status display
#if (HAS_LORA)
u8x8.printf("%-16s", display_line6);
#endif
#endif // TIME_SYNC_INTERVAL #endif // TIME_SYNC_INTERVAL
#if (HAS_LORA) #if (HAS_LORA)
// line 7: update LMiC event display // line 7: update LMiC event display
u8x8.setCursor(0, 7); u8x8.setCursor(0, 7);
u8x8.printf("%-14s", display_line7); u8x8.printf("%-14s", lmic_event_msg);
// update LoRa send queue display // update LoRa send queue display
msgWaiting = uxQueueMessagesWaiting(LoraSendQueue); msgWaiting = uxQueueMessagesWaiting(LoraSendQueue);
@ -259,7 +257,6 @@ void draw_page(time_t t, uint8_t page) {
u8x8.printf("%-2s", msgWaiting == SEND_QUEUE_SIZE ? "<>" : buff); u8x8.printf("%-2s", msgWaiting == SEND_QUEUE_SIZE ? "<>" : buff);
} else } else
u8x8.printf(" "); u8x8.printf(" ");
#endif // HAS_LORA #endif // HAS_LORA
break; // page0 break; // page0

View File

@ -231,7 +231,6 @@ void onEvent(ev_t ev) {
case EV_JOINED: case EV_JOINED:
strcpy_P(buff, PSTR("JOINED")); strcpy_P(buff, PSTR("JOINED"));
sprintf(display_line6, " "); // clear previous lmic status
// set data rate adaptation according to saved setting // set data rate adaptation according to saved setting
LMIC_setAdrMode(cfg.adrmode); LMIC_setAdrMode(cfg.adrmode);
// set data rate and transmit power to defaults only if we have no ADR // set data rate and transmit power to defaults only if we have no ADR
@ -258,16 +257,7 @@ void onEvent(ev_t ev) {
break; break;
case EV_TXCOMPLETE: case EV_TXCOMPLETE:
strcpy_P(buff, PSTR("TX COMPLETE"));
#if (TIME_SYNC_LORASERVER)
// if last packet sent was a timesync request, store TX timestamp
if (LMIC.pendTxPort == TIMEPORT)
store_time_sync_req(osticks2ms(LMIC.txend)); // milliseconds
#endif
strcpy_P(buff, (LMIC.txrxFlags & TXRX_ACK) ? PSTR("RECEIVED ACK")
: PSTR("TX COMPLETE"));
sprintf(display_line6, " "); // clear previous lmic status
break; break;
case EV_LOST_TSYNC: case EV_LOST_TSYNC:
@ -321,7 +311,7 @@ void onEvent(ev_t ev) {
// Log & Display if asked // Log & Display if asked
if (*buff) { if (*buff) {
ESP_LOGI(TAG, "%s", buff); ESP_LOGI(TAG, "%s", buff);
sprintf(display_line7, buff); sprintf(lmic_event_msg, buff);
} }
} }
@ -585,7 +575,12 @@ void myRxCallback(void *pUserData, uint8_t port, const uint8_t *pMsg,
// transmit complete message handler // transmit complete message handler
void myTxCallback(void *pUserData, int fSuccess) { void myTxCallback(void *pUserData, int fSuccess) {
/* currently no code here */
#if (TIME_SYNC_LORASERVER)
// if last packet sent was a timesync request, store TX timestamp
if (LMIC.pendTxPort == TIMEPORT)
store_time_sync_req(osticks2ms(LMIC.txend)); // milliseconds
#endif
} }
// decode LORAWAN MAC message // decode LORAWAN MAC message
@ -651,12 +646,12 @@ uint8_t getBattLevel() {
const char *getSfName(rps_t rps) { const char *getSfName(rps_t rps) {
const char *const t[] = {"FSK", "SF7", "SF8", "SF9", const char *const t[] = {"FSK", "SF7", "SF8", "SF9",
"SF10", "SF11", "SF12", "SFrfu"}; "SF10", "SF11", "SF12", "SF?"};
return t[getSf(rps)]; return t[getSf(rps)];
} }
const char *getBwName(rps_t rps) { const char *getBwName(rps_t rps) {
const char *const t[] = {"BW125", "BW250", "BW500", "BWrfu"}; const char *const t[] = {"BW125", "BW250", "BW500", "BW?"};
return t[getBw(rps)]; return t[getBw(rps)];
} }

View File

@ -76,9 +76,9 @@ triggers pps 1 sec impulse
// Basic Config // Basic Config
#include "main.h" #include "main.h"
configData_t cfg; // struct holds current device configuration configData_t cfg; // struct holds current device configuration
char display_line6[16], display_line7[16]; // display buffers char lmic_event_msg[16]; // display buffer for LMIC event message
uint8_t volatile channel = 0; // channel rotation counter uint8_t volatile channel = 0; // channel rotation counter
uint16_t volatile macs_total = 0, macs_wifi = 0, macs_ble = 0, uint16_t volatile macs_total = 0, macs_wifi = 0, macs_ble = 0,
batt_voltage = 0; // globals for display batt_voltage = 0; // globals for display

View File

@ -41,7 +41,7 @@ inline String getHeaderValue(String header, String headerName) {
void start_ota_update() { void start_ota_update() {
// check battery status if we can before doing ota // check battery status if we can before doing ota
if (!batt_sufficient()) { if (!batt_sufficient()) {
ESP_LOGE(TAG, "Battery voltage %dmV too low for OTA", batt_voltage); ESP_LOGE(TAG, "Battery voltage %dmV too low for OTA", batt_voltage);
return; return;
} }

View File

@ -49,7 +49,7 @@
#define RETRANSMIT_RCMD 5 // [seconds] wait time before retransmitting rcommand results #define RETRANSMIT_RCMD 5 // [seconds] wait time before retransmitting rcommand results
#define PAYLOAD_BUFFER_SIZE 51 // maximum size of payload block per transmit #define PAYLOAD_BUFFER_SIZE 51 // maximum size of payload block per transmit
#define LORADRDEFAULT 5 // 0 .. 15, LoRaWAN datarate, according to regional LoRaWAN specs [default = 5] #define LORADRDEFAULT 5 // 0 .. 15, LoRaWAN datarate, according to regional LoRaWAN specs [default = 5]
#define LORATXPOWDEFAULT 14 // 0 .. 15, LoRaWAN TX power #define LORATXPOWDEFAULT 7 // 0 .. 15, LoRaWAN TX power [default = 7]
#define MAXLORARETRY 500 // maximum count of TX retries if LoRa busy #define MAXLORARETRY 500 // maximum count of TX retries if LoRa busy
#define SEND_QUEUE_SIZE 10 // maximum number of messages in payload send queue [1 = no queue] #define SEND_QUEUE_SIZE 10 // maximum number of messages in payload send queue [1 = no queue]
@ -75,7 +75,7 @@
#define TIME_SYNC_INTERVAL_RETRY 10 // retry time sync after lost sync each .. minutes [default = 10], 0 means off #define TIME_SYNC_INTERVAL_RETRY 10 // retry time sync after lost sync each .. minutes [default = 10], 0 means off
#define TIME_SYNC_COMPILEDATE 0 // set to 1 to use compile date to initialize RTC after power outage [default = 0] #define TIME_SYNC_COMPILEDATE 0 // set to 1 to use compile date to initialize RTC after power outage [default = 0]
#define TIME_SYNC_LORAWAN 0 // set to 1 to use LORA network as time source, 0 means off [default = 0] #define TIME_SYNC_LORAWAN 0 // set to 1 to use LORA network as time source, 0 means off [default = 0]
#define TIME_SYNC_LORASERVER 0 // set to 1 to use LORA timeserver as time source, 0 means off [default = 0] #define TIME_SYNC_LORASERVER 1 // set to 1 to use LORA timeserver as time source, 0 means off [default = 0]
// settings for syncing time with timeserver applications // settings for syncing time with timeserver applications
#define TIME_SYNC_SAMPLES 1 // number of time requests for averaging #define TIME_SYNC_SAMPLES 1 // number of time requests for averaging

View File

@ -19,32 +19,25 @@ void do_reset() {
void set_reset(uint8_t val[]) { void set_reset(uint8_t val[]) {
switch (val[0]) { switch (val[0]) {
case 0: // restart device case 0: // restart device
sprintf(display_line6, "Reset pending");
do_reset(); do_reset();
break; break;
case 1: // reset MAC counter case 1: // reset MAC counter
ESP_LOGI(TAG, "Remote command: reset MAC counter"); ESP_LOGI(TAG, "Remote command: reset MAC counter");
reset_counters(); // clear macs reset_counters(); // clear macs
get_salt(); // get new salt get_salt(); // get new salt
sprintf(display_line6, "Reset counter");
break; break;
case 2: // reset device to factory settings case 2: // reset device to factory settings
ESP_LOGI(TAG, "Remote command: reset device to factory settings"); ESP_LOGI(TAG, "Remote command: reset device to factory settings");
sprintf(display_line6, "Factory reset");
eraseConfig(); eraseConfig();
break; break;
case 3: // reset send queues case 3: // reset send queues
ESP_LOGI(TAG, "Remote command: flush send queue"); ESP_LOGI(TAG, "Remote command: flush send queue");
sprintf(display_line6, "Queue reset");
flushQueues(); flushQueues();
break; break;
case 9: // reset and ask for software update via Wifi OTA case 9: // reset and ask for software update via Wifi OTA
ESP_LOGI(TAG, "Remote command: software update via Wifi"); ESP_LOGI(TAG, "Remote command: software update via Wifi");
#if (USE_OTA) #if (USE_OTA)
sprintf(display_line6, "Software update");
cfg.runmode = 1; cfg.runmode = 1;
#else
sprintf(display_line6, "Software update not implemented");
#endif // USE_OTA #endif // USE_OTA
break; break;