Merge pull request #887 from cyberman54/development

v3.3.1
This commit is contained in:
Verkehrsrot 2022-08-18 12:13:29 +02:00 committed by GitHub
commit d4974d9c72
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
32 changed files with 170 additions and 410 deletions

View File

@ -11,8 +11,8 @@
#include <OneBitDisplay.h> #include <OneBitDisplay.h>
extern ONE_BIT_DISPLAY *dp; extern ONE_BIT_DISPLAY *dp;
#elif (HAS_DISPLAY) == 2 #elif (HAS_DISPLAY) == 2
#include <TFT_eSPI.h> #include <bb_spi_lcd.h>
extern TFT_eSPI *dp; extern BB_SPI_LCD *dp;
#endif #endif
#define DISPLAY_PAGES (7) // number of paxcounter display pages #define DISPLAY_PAGES (7) // number of paxcounter display pages
@ -24,7 +24,6 @@ extern TFT_eSPI *dp;
#define MY_FONT_NORMAL FONT_8x8 #define MY_FONT_NORMAL FONT_8x8
#define MY_FONT_LARGE FONT_16x32 #define MY_FONT_LARGE FONT_16x32
#define MY_FONT_STRETCHED FONT_12x16 #define MY_FONT_STRETCHED FONT_12x16
#define MY_DISPLAY_FIRSTLINE 30 #define MY_DISPLAY_FIRSTLINE 30
#ifndef MY_DISPLAY_RST #ifndef MY_DISPLAY_RST
@ -51,22 +50,21 @@ extern TFT_eSPI *dp;
// settings for TFT display library // settings for TFT display library
#elif (HAS_DISPLAY == 2) #elif (HAS_DISPLAY == 2)
#define MY_FONT_SMALL 1 #define MY_FONT_SMALL 2
#define MY_FONT_NORMAL 2 #define MY_FONT_NORMAL 2
#define MY_FONT_LARGE 4 #define MY_FONT_LARGE 2
#define MY_FONT_STRETCHED 6 #define MY_FONT_STRETCHED 2
#define MY_DISPLAY_FIRSTLINE 30 #define MY_DISPLAY_FIRSTLINE 30
#ifndef MY_DISPLAY_FGCOLOR #ifndef TFT_FREQUENCY
#define MY_DISPLAY_FGCOLOR 0xFFFF // TFT_WHITE #define TFT_FREQUENCY 400000L
#endif
#ifndef MY_DISPLAY_BGCOLOR
#define MY_DISPLAY_BGCOLOR 0x0000 // TFT_BLACK
#endif #endif
#ifndef TOUCH_CS #ifndef MY_DISPLAY_FGCOLOR
#define TOUCH_CS NOT_A_PIN #define MY_DISPLAY_FGCOLOR TFT_YELLOW
#endif
#ifndef MY_DISPLAY_BGCOLOR
#define MY_DISPLAY_BGCOLOR TFT_BLACK
#endif #endif
#endif #endif
@ -104,7 +102,6 @@ void dp_setup(int contrast = 0);
void dp_refresh(bool nextPage = false); void dp_refresh(bool nextPage = false);
void dp_init(bool verbose = false); void dp_init(bool verbose = false);
void dp_shutdown(void); void dp_shutdown(void);
void dp_message(const char *msg, int line, bool invers);
void dp_setFont(int font, int inv = 0); void dp_setFont(int font, int inv = 0);
void dp_dump(uint8_t *pBuffer = NULL); void dp_dump(uint8_t *pBuffer = NULL);
void dp_contrast(uint8_t contrast); void dp_contrast(uint8_t contrast);

View File

@ -39,7 +39,6 @@
#endif #endif
class PayloadConvert { class PayloadConvert {
public: public:
PayloadConvert(uint8_t size); PayloadConvert(uint8_t size);
~PayloadConvert(); ~PayloadConvert();
@ -59,6 +58,7 @@ public:
void addSensor(uint8_t[]); void addSensor(uint8_t[]);
void addTime(time_t value); void addTime(time_t value);
void addSDS(sdsStatus_t value); void addSDS(sdsStatus_t value);
private: private:
void addChars( char* string, int len); void addChars( char* string, int len);

View File

@ -20,7 +20,7 @@
#ifndef PMU_CHG_CUTOFF #ifndef PMU_CHG_CUTOFF
#ifdef HAS_PMU #ifdef HAS_PMU
#define PMU_CHG_CUTOFF AXP202_TARGET_VOL_4_2V #define PMU_CHG_CUTOFF XPOWERS_CHG_VOL_4V2
#elif defined HAS_IP5306 #elif defined HAS_IP5306
#define PMU_CHG_CUTOFF 0 #define PMU_CHG_CUTOFF 0
#endif #endif
@ -28,7 +28,7 @@
#ifndef PMU_CHG_CURRENT #ifndef PMU_CHG_CURRENT
#ifdef HAS_PMU #ifdef HAS_PMU
#define PMU_CHG_CURRENT AXP1XX_CHARGE_CUR_450MA #define PMU_CHG_CURRENT XPOWERS_CHG_CUR_450MA
#elif defined HAS_IP5306 #elif defined HAS_IP5306
#define PMU_CHG_CURRENT 2 #define PMU_CHG_CURRENT 2
#endif #endif
@ -55,8 +55,8 @@ void calibrate_voltage(void);
bool batt_sufficient(void); bool batt_sufficient(void);
#ifdef HAS_PMU #ifdef HAS_PMU
#include <axp20x.h> #include <XPowersLib.h>
extern AXP20X_Class pmu; extern XPowersPMU pmu;
enum pmu_power_t { pmu_power_on, pmu_power_off, pmu_power_sleep }; enum pmu_power_t { pmu_power_on, pmu_power_off, pmu_power_sleep };
void AXP192_powerevent_IRQ(void); void AXP192_powerevent_IRQ(void);
void AXP192_power(pmu_power_t powerlevel); void AXP192_power(pmu_power_t powerlevel);

View File

@ -23,7 +23,6 @@
#include <WString.h> #include <WString.h>
class BintrayClient { class BintrayClient {
public: public:
BintrayClient(const String& user, const String& repository, const String& package); BintrayClient(const String& user, const String& repository, const String& package);
String getUser() const; String getUser() const;

View File

@ -46,7 +46,7 @@ description = Paxcounter is a device for metering passenger flows in realtime. I
[common] [common]
; for release_version use max. 10 chars total, use any decimal format like "a.b.c" ; for release_version use max. 10 chars total, use any decimal format like "a.b.c"
release_version = 3.3.0 release_version = 3.3.1
; 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 = 3
@ -54,17 +54,16 @@ extra_scripts = pre:build.py
otakeyfile = ota.conf otakeyfile = ota.conf
lorakeyfile = loraconf.h lorakeyfile = loraconf.h
lmicconfigfile = lmic_config.h lmicconfigfile = lmic_config.h
platform_espressif32 = espressif32@5.0.0 platform_espressif32 = espressif32@5.1.0
monitor_speed = 115200 monitor_speed = 115200
upload_speed = 115200 ; set by build.py and taken from hal file upload_speed = 115200 ; set by build.py and taken from hal file
display_library = ; set by build.py and taken from hal file display_library = ; set by build.py and taken from hal file
lib_deps_lora = lib_deps_lora =
mcci-catena/MCCI LoRaWAN LMIC library @ ^4.1.1 mcci-catena/MCCI LoRaWAN LMIC library @ ^4.1.1
lib_deps_display = lib_deps_display =
https://github.com/bitbank2/OneBitDisplay#8d4ab34 https://github.com/bitbank2/OneBitDisplay.git
;bitbank2/OneBitDisplay @ ^2.1.0 https://github.com/bitbank2/bb_spi_lcd.git
ricmoo/QRCode @ ^0.0.1 ricmoo/QRCode @ ^0.0.1
bodmer/TFT_eSPI @ ^2.3.84
lib_deps_ledmatrix = lib_deps_ledmatrix =
seeed-studio/Ultrathin_LED_Matrix @ ^1.0.0 seeed-studio/Ultrathin_LED_Matrix @ ^1.0.0
lib_deps_rgbled = lib_deps_rgbled =
@ -83,7 +82,7 @@ lib_deps_basic =
bblanchon/ArduinoJson @ ^6 bblanchon/ArduinoJson @ ^6
makuna/RTC @ ^2.3.5 makuna/RTC @ ^2.3.5
spacehuhn/SimpleButton spacehuhn/SimpleButton
lewisxhe/AXP202X_Library @ ^1.1.3 https://github.com/lewisxhe/XPowersLib.git
256dpi/MQTT @ ^2.4.8 256dpi/MQTT @ ^2.4.8
lib_deps_all = lib_deps_all =
${common.lib_deps_basic} ${common.lib_deps_basic}

View File

@ -48,7 +48,6 @@ void setBMEIRQ() { xTaskNotify(irqHandlerTask, BME_IRQ, eSetBits); }
// initialize MEMS sensor // initialize MEMS sensor
// return = 0 -> error / return = 1 -> success // return = 0 -> error / return = 1 -> success
int bme_init(void) { int bme_init(void) {
int rc = 0; int rc = 0;
#ifdef HAS_BME680 #ifdef HAS_BME680
@ -77,7 +76,6 @@ int bme_init(void) {
if (rc) if (rc)
bmecycler.attach(BMECYCLE, setBMEIRQ); // start cyclic data transmit bmecycler.attach(BMECYCLE, setBMEIRQ); // start cyclic data transmit
return rc; return rc;
} // bme_init() } // bme_init()
#ifdef HAS_BME680 #ifdef HAS_BME680
@ -108,7 +106,6 @@ int checkIaqSensorStatus(void) {
// store current BME sensor data in struct // store current BME sensor data in struct
void bme_storedata(bmeStatus_t *bme_store) { void bme_storedata(bmeStatus_t *bme_store) {
if (cfg.payloadmask & MEMS_DATA) if (cfg.payloadmask & MEMS_DATA)
#ifdef HAS_BME680 #ifdef HAS_BME680
@ -138,7 +135,6 @@ void bme_storedata(bmeStatus_t *bme_store) {
// bme.readAltitude(SEALEVELPRESSURE_HPA); // bme.readAltitude(SEALEVELPRESSURE_HPA);
bme_store->iaq = 0; // IAQ feature not present with BME280 bme_store->iaq = 0; // IAQ feature not present with BME280
#endif #endif
} // bme_storedata() } // bme_storedata()
#ifdef HAS_BME680 #ifdef HAS_BME680
@ -165,7 +161,6 @@ void updateState(void) {
stateUpdateCounter++; stateUpdateCounter++;
} }
} else { } else {
/* Update every STATE_SAVE_PERIOD minutes */ /* Update every STATE_SAVE_PERIOD minutes */
if ((long)(millis() - stateUpdateCounter * STATE_SAVE_PERIOD) >= 0) { if ((long)(millis() - stateUpdateCounter * STATE_SAVE_PERIOD) >= 0) {
update = true; update = true;

View File

@ -75,7 +75,6 @@ void IRAM_ATTR watchdog() { xTaskResumeFromISR(RestartHandle); }
// used for manually uploading a firmware file via wifi // used for manually uploading a firmware file via wifi
void start_boot_menu(void) { void start_boot_menu(void) {
const char *host = clientId; const char *host = clientId;
const char *ssid = WIFI_SSID; const char *ssid = WIFI_SSID;
const char *password = WIFI_PASS; const char *password = WIFI_PASS;
@ -150,9 +149,7 @@ void start_boot_menu(void) {
// did we get a file name? // did we get a file name?
if (upload.filename != NULL) { if (upload.filename != NULL) {
switch (upload.status) { switch (upload.status) {
case UPLOAD_FILE_START: case UPLOAD_FILE_START:
// start file transfer // start file transfer
ESP_LOGI(TAG, "Uploading %s", upload.filename.c_str()); ESP_LOGI(TAG, "Uploading %s", upload.filename.c_str());
@ -177,7 +174,6 @@ void start_boot_menu(void) {
case UPLOAD_FILE_ABORTED: case UPLOAD_FILE_ABORTED:
default: default:
break; break;
} // switch } // switch
// don't boot to production if update failed // don't boot to production if update failed

View File

@ -26,7 +26,6 @@ static uint8_t buffer[cfgLen + cfgLen2];
// 3. magicByte [cfgLen2 bytes, containing a fixed identifier] // 3. magicByte [cfgLen2 bytes, containing a fixed identifier]
static void defaultConfig(configData_t *myconfig) { static void defaultConfig(configData_t *myconfig) {
strncpy(myconfig->version, PROGVERSION, strncpy(myconfig->version, PROGVERSION,
sizeof(myconfig->version) - 1); // Firmware version sizeof(myconfig->version) - 1); // Firmware version
@ -92,7 +91,6 @@ void saveConfig(bool erase) {
// load configuration from NVRAM into RAM and make it current // load configuration from NVRAM into RAM and make it current
void loadConfig(void) { void loadConfig(void) {
int readBytes = 0; int readBytes = 0;
ESP_LOGI(TAG, "Loading device configuration from NVRAM..."); ESP_LOGI(TAG, "Loading device configuration from NVRAM...");
@ -144,7 +142,6 @@ bool comp(char s1, char s2) { return (tolower(s1) < tolower(s2)); }
// helper function to lexicographically compare two versions. Returns 1 if v2 // helper function to lexicographically compare two versions. Returns 1 if v2
// is smaller, -1 if v1 is smaller, 0 if equal // is smaller, -1 if v1 is smaller, 0 if equal
int version_compare(const String v1, const String v2) { int version_compare(const String v1, const String v2) {
if (v1 == v2) if (v1 == v2)
return 0; return 0;

View File

@ -13,7 +13,6 @@ void setCyclicIRQ() { xTaskNotify(irqHandlerTask, CYCLIC_IRQ, eSetBits); }
// do all housekeeping // do all housekeeping
void doHousekeeping() { void doHousekeeping() {
// check if update or maintenance mode trigger switch was set by rcommand // check if update or maintenance mode trigger switch was set by rcommand
if ((RTC_runmode == RUNMODE_UPDATE) || (RTC_runmode == RUNMODE_MAINTENANCE)) if ((RTC_runmode == RUNMODE_UPDATE) || (RTC_runmode == RUNMODE_MAINTENANCE))
do_reset(true); // warmstart do_reset(true); // warmstart
@ -125,7 +124,6 @@ void doHousekeeping() {
#if (HAS_SDCARD) #if (HAS_SDCARD)
sdcard_flush(); sdcard_flush();
#endif #endif
} // doHousekeeping() } // doHousekeeping()
uint32_t getFreeRAM() { uint32_t getFreeRAM() {

View File

@ -18,41 +18,33 @@ static const char TAG[] = __FILE__;
// triggered by second timepulse to ticker out DCF signal // triggered by second timepulse to ticker out DCF signal
void DCF77_Pulse(uint8_t bit) { void DCF77_Pulse(uint8_t bit) {
TickType_t startTime; TickType_t startTime;
// induce a DCF Pulse // induce a DCF Pulse
for (uint8_t pulseLength = 0; pulseLength <= 2; pulseLength++) { for (uint8_t pulseLength = 0; pulseLength <= 2; pulseLength++) {
startTime = xTaskGetTickCount(); // reference time pulse start startTime = xTaskGetTickCount(); // reference time pulse start
switch (pulseLength) { switch (pulseLength) {
case 0: // 0ms = start of pulse case 0: // 0ms = start of pulse
digitalWrite(HAS_DCF77, dcf_low); digitalWrite(HAS_DCF77, dcf_low);
break; break;
case 1: // 100ms = logic 0 case 1: // 100ms = logic 0
if (bit == 0) if (bit == 0)
digitalWrite(HAS_DCF77, dcf_high); digitalWrite(HAS_DCF77, dcf_high);
break; break;
case 2: // 200ms = logic 1 case 2: // 200ms = logic 1
digitalWrite(HAS_DCF77, dcf_high); digitalWrite(HAS_DCF77, dcf_high);
break; break;
} // switch } // switch
// delay to genrate pulseLength // delay to genrate pulseLength
vTaskDelayUntil(&startTime, pdMS_TO_TICKS(100)); vTaskDelayUntil(&startTime, pdMS_TO_TICKS(100));
} // for } // for
} // DCF77_Pulse() } // DCF77_Pulse()
// helper function to convert decimal to bcd digit // helper function to convert decimal to bcd digit
uint64_t dec2bcd(uint8_t const dec, uint8_t const startpos, uint64_t dec2bcd(uint8_t const dec, uint8_t const startpos,
uint8_t const endpos, uint8_t *parity) { uint8_t const endpos, uint8_t *parity) {
uint8_t data = dec < 10 ? dec : ((dec / 10) << 4) + dec % 10; uint8_t data = dec < 10 ? dec : ((dec / 10) << 4) + dec % 10;
uint64_t bcd = 0; uint64_t bcd = 0;
@ -68,7 +60,6 @@ uint64_t dec2bcd(uint8_t const dec, uint8_t const startpos,
// generates a 1 minute dcf pulse frame for calendar time t // generates a 1 minute dcf pulse frame for calendar time t
uint64_t DCF77_Frame(const struct tm t) { uint64_t DCF77_Frame(const struct tm t) {
uint8_t parity = 0, parity_sum = 0; uint8_t parity = 0, parity_sum = 0;
uint64_t frame = 0; // start with all bits 0 uint64_t frame = 0; // start with all bits 0
@ -105,7 +96,6 @@ uint64_t DCF77_Frame(const struct tm t) {
frame += parity_sum ? set_dcfbit(58) : 0; frame += parity_sum ? set_dcfbit(58) : 0;
return frame; return frame;
} // DCF77_Frame() } // DCF77_Frame()
#endif // HAS_DCF77 #endif // HAS_DCF77

View File

@ -13,7 +13,7 @@ Display-Mask (128 x 64 pixel):
2| 2|
3|WIFI:abcde BLTH:abcde SMALL 3|WIFI:abcde BLTH:abcde SMALL
4|Batt:abc% chan:ab SMALL 4|Batt:abc% chan:ab SMALL
5|RLIM:abcd Mem:abcdKB SMALL 5|RLIM:abcd Mem:abcdeKB SMALL
6|27.Feb 2019 20:27:00* SMALL 6|27.Feb 2019 20:27:00* SMALL
7|yyyyyyyyyyyyy xx SFab SMALL 7|yyyyyyyyyyyyy xx SFab SMALL
@ -50,15 +50,15 @@ static QRCode qrcode;
#if (HAS_DISPLAY) == 1 #if (HAS_DISPLAY) == 1
ONE_BIT_DISPLAY *dp = NULL; ONE_BIT_DISPLAY *dp = NULL;
#elif (HAS_DISPLAY) == 2 #elif (HAS_DISPLAY) == 2
TFT_eSPI *dp = NULL; BB_SPI_LCD *dp = NULL;
#else #else
#error Unknown display type specified in hal file #error Unknown display type specified in hal file
#endif #endif
#endif #endif
void dp_setup(int contrast) { void dp_setup(int contrast) {
#if (HAS_DISPLAY) == 1 // I2C OLED #if (HAS_DISPLAY) == 1 // I2C OLED
dp = new ONE_BIT_DISPLAY; dp = new ONE_BIT_DISPLAY;
dp->setI2CPins(MY_DISPLAY_SDA, MY_DISPLAY_SCL, MY_DISPLAY_RST); dp->setI2CPins(MY_DISPLAY_SDA, MY_DISPLAY_SCL, MY_DISPLAY_RST);
dp->setBitBang(false); dp->setBitBang(false);
@ -69,34 +69,32 @@ void dp_setup(int contrast) {
MY_DISPLAY_FLIP ? 2 : 0); // 0 = no rotation, 1 = 90°, 2 = 180°, 3 = 280° MY_DISPLAY_FLIP ? 2 : 0); // 0 = no rotation, 1 = 90°, 2 = 180°, 3 = 280°
#elif (HAS_DISPLAY) == 2 // SPI TFT #elif (HAS_DISPLAY) == 2 // SPI TFT
dp = new TFT_eSPI(MY_DISPLAY_WIDTH, MY_DISPLAY_HEIGHT);
dp->init(); dp = new BB_SPI_LCD;
dp->setRotation(MY_DISPLAY_FLIP ? 3 : 1); dp->begin(TFT_TYPE, FLAGS_NONE, TFT_FREQUENCY, TFT_CS, TFT_DC, TFT_RST,
dp->invertDisplay(MY_DISPLAY_INVERT ? true : false); TFT_BL, TFT_MISO, TFT_MOSI, TFT_SCLK);
dp->allocBuffer(); // render all outputs to lib internal backbuffer
dp->setRotation(
MY_DISPLAY_FLIP ? 1 : 3); // 0 = no rotation, 1 = 90°, 2 = 180°, 3 = 280°
// dp->invertDisplay(MY_DISPLAY_INVERT ? true : false);
// dp->setTextWrap(false);
dp->setTextColor(MY_DISPLAY_FGCOLOR, MY_DISPLAY_BGCOLOR); dp->setTextColor(MY_DISPLAY_FGCOLOR, MY_DISPLAY_BGCOLOR);
#endif #endif
// clear display
dp_clear(); dp_clear();
if (contrast) if (contrast)
dp_contrast(contrast); dp_contrast(contrast);
} }
void dp_init(bool verbose) { void dp_init(bool verbose) {
dp_setup(DISPLAYCONTRAST); dp_setup(DISPLAYCONTRAST);
// show chip information
if (verbose) { if (verbose) {
// show startup screen
// to come -> display .bmp file with logo
// show chip information
#if (VERBOSE) #if (VERBOSE)
esp_chip_info_t chip_info; esp_chip_info_t chip_info;
esp_chip_info(&chip_info); esp_chip_info(&chip_info);
dp_setFont(MY_FONT_NORMAL); dp_setFont(MY_FONT_NORMAL);
dp->printf("** PAXCOUNTER **\r\n"); dp->printf("** PAXCOUNTER **\r\n");
dp->printf("Software v%s\r\n", PROGVERSION); dp->printf("Software v%s\r\n", PROGVERSION);
@ -107,8 +105,6 @@ void dp_init(bool verbose) {
(chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : ""); (chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");
dp->printf("%dMB %s Flash", spi_flash_get_chip_size() / (1024 * 1024), dp->printf("%dMB %s Flash", spi_flash_get_chip_size() / (1024 * 1024),
(chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "int." : "ext."); (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "int." : "ext.");
// give user some time to read or take picture
dp_dump(); dp_dump();
delay(2000); delay(2000);
dp_clear(); dp_clear();
@ -142,17 +138,14 @@ void dp_init(bool verbose) {
#endif #endif
#endif // HAS_LORA #endif // HAS_LORA
} // verbose } // verbose
dp_power(cfg.screenon); // set display off if disabled dp_power(cfg.screenon); // set display off if disabled
} // dp_init } // dp_init
// write display content to display buffer // write display content to display buffer
// nextpage = true -> flip 1 page // nextpage = true -> flip 1 page
void dp_refresh(bool nextPage) { void dp_refresh(bool nextPage) {
struct count_payload_t count; // libpax count storage struct count_payload_t count; // libpax count storage
static uint8_t DisplayPage = 0; static uint8_t DisplayPage = 0;
char timeState, strftime_buf[64]; char timeState, strftime_buf[64];
@ -188,7 +181,6 @@ void dp_refresh(bool nextPage) {
dp->setCursor(0, 0); dp->setCursor(0, 0);
switch (DisplayPage) { switch (DisplayPage) {
// page 0: pax + parameters overview // page 0: pax + parameters overview
// page 1: pax + lorawan parameters // page 1: pax + lorawan parameters
// page 2: pax + GPS lat/lon // page 2: pax + GPS lat/lon
@ -203,7 +195,7 @@ void dp_refresh(bool nextPage) {
// show pax // show pax
libpax_counter_count(&count); libpax_counter_count(&count);
dp_setFont(MY_FONT_LARGE); dp_setFont(MY_FONT_LARGE);
dp->printf("%-8d", count.pax); dp->printf("%-8u", count.pax);
dp_setFont(MY_FONT_SMALL); dp_setFont(MY_FONT_SMALL);
dp->setCursor(0, MY_DISPLAY_FIRSTLINE); dp->setCursor(0, MY_DISPLAY_FIRSTLINE);
@ -213,21 +205,21 @@ void dp_refresh(bool nextPage) {
#if ((WIFICOUNTER) && (BLECOUNTER)) #if ((WIFICOUNTER) && (BLECOUNTER))
if (cfg.wifiscan) if (cfg.wifiscan)
dp->printf("WIFI:%-5d", count.wifi_count); dp->printf("WIFI:%-5u", count.wifi_count);
else else
dp->printf("WIFI:off"); dp->printf("WIFI:off");
if (cfg.blescan) if (cfg.blescan)
dp->printf("BLTH:%-5d", count.ble_count); dp->printf("BLTH:%-5u", count.ble_count);
else else
dp->printf(" BLTH:off"); dp->printf(" BLTH:off");
#elif ((WIFICOUNTER) && (!BLECOUNTER)) #elif ((WIFICOUNTER) && (!BLECOUNTER))
if (cfg.wifiscan) if (cfg.wifiscan)
dp->printf("WIFI:%-5d", count.wifi_count); dp->printf("WIFI:%-5u", count.wifi_count);
else else
dp->printf("WIFI:off"); dp->printf("WIFI:off");
#elif ((!WIFICOUNTER) && (BLECOUNTER)) #elif ((!WIFICOUNTER) && (BLECOUNTER))
if (cfg.blescan) if (cfg.blescan)
dp->printf("BLTH:%-5d", count.ble_count); dp->printf("BLTH:%-5u", count.ble_count);
dp->printf("BLTH:off"); dp->printf("BLTH:off");
#else #else
dp->printf("Sniffer disabled"); dp->printf("Sniffer disabled");
@ -249,7 +241,7 @@ void dp_refresh(bool nextPage) {
// line 5: RSSI limiter + free memory // line 5: RSSI limiter + free memory
// RLIM:abcd Mem:abcdKB // RLIM:abcd Mem:abcdKB
dp->printf(!cfg.rssilimit ? "RLIM:off " : "RLIM:%-4d", cfg.rssilimit); dp->printf(!cfg.rssilimit ? "RLIM:off " : "RLIM:%-4d", cfg.rssilimit);
dp->printf(" Mem:%4dKB\r\n", getFreeRAM() / 1024); dp->printf(" Mem:%uKB\r\n", getFreeRAM() / 1024);
// line 6: time + date // line 6: time + date
// Wed Jan 12 21:49:08 * // Wed Jan 12 21:49:08 *
@ -300,15 +292,15 @@ void dp_refresh(bool nextPage) {
// show pax // show pax
libpax_counter_count(&count); libpax_counter_count(&count);
dp_setFont(MY_FONT_LARGE); dp_setFont(MY_FONT_LARGE);
dp->printf("%-8d", count.pax); dp->printf("%-8u", count.pax);
dp_setFont(MY_FONT_SMALL); dp_setFont(MY_FONT_SMALL);
dp->setCursor(0, MY_DISPLAY_FIRSTLINE); dp->setCursor(0, MY_DISPLAY_FIRSTLINE);
dp->printf("Net:%06X Pwr:%-2d\r\n", LMIC.netid & 0x001FFFFF, dp->printf("Net:%06X Pwr:%2u\r\n", LMIC.netid & 0x001FFFFF,
LMIC.radio_txpow); LMIC.radio_txpow);
dp->printf("Dev:%08X DR:%1d\r\n", LMIC.devaddr, LMIC.datarate); dp->printf("Dev:%08X DR:%1u\r\n", LMIC.devaddr, LMIC.datarate);
dp->printf("ChMsk:%04X Nonce:%04X\r\n", LMIC.channelMap, LMIC.devNonce); dp->printf("ChMsk:%04X Nonce:%04X\r\n", LMIC.channelMap, LMIC.devNonce);
dp->printf("fUp:%-6d fDn:%-6d\r\n", LMIC.seqnoUp ? LMIC.seqnoUp - 1 : 0, dp->printf("fUp:%-6u fDn:%-6u\r\n", LMIC.seqnoUp ? LMIC.seqnoUp - 1 : 0,
LMIC.seqnoDn ? LMIC.seqnoDn - 1 : 0); LMIC.seqnoDn ? LMIC.seqnoDn - 1 : 0);
dp->printf("SNR:%-5d RSSI:%-5d", (LMIC.snr + 2) / 4, LMIC.rssi); dp->printf("SNR:%-5d RSSI:%-5d", (LMIC.snr + 2) / 4, LMIC.rssi);
@ -327,7 +319,7 @@ void dp_refresh(bool nextPage) {
// show pax // show pax
libpax_counter_count(&count); libpax_counter_count(&count);
dp_setFont(MY_FONT_LARGE); dp_setFont(MY_FONT_LARGE);
dp->printf("%-8d", count.pax); dp->printf("%-8u", count.pax);
// show satellite status at bottom line // show satellite status at bottom line
dp_setFont(MY_FONT_SMALL); dp_setFont(MY_FONT_SMALL);
@ -382,7 +374,7 @@ void dp_refresh(bool nextPage) {
strftime(strftime_buf, sizeof(strftime_buf), "%T", &timeinfo); strftime(strftime_buf, sizeof(strftime_buf), "%T", &timeinfo);
dp->printf("%.8s\r\n", strftime_buf); dp->printf("%.8s\r\n", strftime_buf);
dp_setFont(MY_FONT_SMALL); dp_setFont(MY_FONT_SMALL);
dp->printf("%21.1f", uptime() / 1000.0); dp->printf("%-12.1f", uptime() / 1000.0);
dp_dump(); dp_dump();
break; break;
@ -404,59 +396,28 @@ void dp_refresh(bool nextPage) {
DisplayPage++; DisplayPage++;
break; break;
#endif #endif
} // switch (page) } // switch (page)
} // dp_refresh } // dp_refresh
// ------------- display helper functions ----------------- // ------------- display helper functions -----------------
void dp_setFont(int font, int inv) { void dp_setFont(int font, int inv) {
dp->setFont(font);
// handle invers printing
if (inv) if (inv)
dp->setTextColor(MY_DISPLAY_BGCOLOR, MY_DISPLAY_FGCOLOR); dp->setTextColor(MY_DISPLAY_BGCOLOR, MY_DISPLAY_FGCOLOR);
else else
dp->setTextColor(MY_DISPLAY_FGCOLOR, MY_DISPLAY_BGCOLOR); dp->setTextColor(MY_DISPLAY_FGCOLOR, MY_DISPLAY_BGCOLOR);
#if (HAS_DISPLAY) == 1
// set desired font
dp->setFont(font);
#elif (HAS_DISPLAY) == 2
// map desired oled font to tft font
switch (font) {
case MY_FONT_STRETCHED: // 16x16 on OLED
case MY_FONT_LARGE: // 16x32 on OLED
dp->setTextFont(4); // 26px
break;
case MY_FONT_SMALL: // 6x8 on OLED
case MY_FONT_NORMAL: // 8x8 on OLED
default:
dp->setTextFont(2); // 16px
break;
}
#endif
} }
void dp_dump(uint8_t *pBuffer) { void dp_dump(uint8_t *pBuffer) {
#if (HAS_DISPLAY) == 1
if (pBuffer) if (pBuffer)
memcpy(dp->getBuffer(), pBuffer, PLOTBUFFERSIZE); memcpy(dp->getBuffer(), pBuffer, PLOTBUFFERSIZE);
dp->display(); dp->display();
#elif (HAS_DISPLAY) == 2
if (pBuffer)
dp->drawBitmap(0, 0, pBuffer, MY_DISPLAY_WIDTH, MY_DISPLAY_HEIGHT,
MY_DISPLAY_FGCOLOR);
#endif
} }
void dp_clear(void) { void dp_clear(void) {
#if (HAS_DISPLAY) == 1
dp->fillScreen(MY_DISPLAY_BGCOLOR); dp->fillScreen(MY_DISPLAY_BGCOLOR);
dp->display(); dp->display();
#elif (HAS_DISPLAY) == 2
dp->fillScreen(MY_DISPLAY_BGCOLOR);
#endif
dp->setCursor(0, 0); dp->setCursor(0, 0);
} }
@ -485,14 +446,6 @@ void dp_shutdown(void) {
#endif #endif
} }
// print static message on display
void dp_message(const char *msg, int line, bool invers) {
dp_setFont(MY_FONT_SMALL, invers ? 1 : 0);
dp->setCursor(0, line * 8);
dp->printf("%-16s", msg);
dp_dump();
} // dp_message
// ------------- QR code plotter ----------------- // ------------- QR code plotter -----------------
void dp_printqr(uint16_t offset_x, uint16_t offset_y, const char *Message) { void dp_printqr(uint16_t offset_x, uint16_t offset_y, const char *Message) {
@ -523,7 +476,6 @@ void dp_printqr(uint16_t offset_x, uint16_t offset_y, const char *Message) {
int dp_drawPixel(uint8_t *buf, const uint16_t x, const uint16_t y, int dp_drawPixel(uint8_t *buf, const uint16_t x, const uint16_t y,
const uint8_t dot) { const uint8_t dot) {
if (x > MY_DISPLAY_WIDTH || y > MY_DISPLAY_HEIGHT) if (x > MY_DISPLAY_WIDTH || y > MY_DISPLAY_HEIGHT)
return -1; return -1;
@ -541,7 +493,6 @@ int dp_drawPixel(uint8_t *buf, const uint16_t x, const uint16_t y,
void dp_scrollHorizontal(uint8_t *buf, const uint16_t width, void dp_scrollHorizontal(uint8_t *buf, const uint16_t width,
const uint16_t height, bool left) { const uint16_t height, bool left) {
uint16_t col, page, idx = 0; uint16_t col, page, idx = 0;
for (page = 0; page < height / 8; page++) { for (page = 0; page < height / 8; page++) {
@ -564,7 +515,6 @@ void dp_scrollHorizontal(uint8_t *buf, const uint16_t width,
void dp_scrollVertical(uint8_t *buf, const uint16_t width, void dp_scrollVertical(uint8_t *buf, const uint16_t width,
const uint16_t height, int offset) { const uint16_t height, int offset) {
uint64_t buf_col; uint64_t buf_col;
if (!offset) if (!offset)
@ -587,7 +537,6 @@ void dp_scrollVertical(uint8_t *buf, const uint16_t width,
// ------------- curve plotter ----------------- // ------------- curve plotter -----------------
void dp_plotCurve(uint16_t count, bool reset) { void dp_plotCurve(uint16_t count, bool reset) {
static uint16_t last_count = 0, col = 0, row = 0; static uint16_t last_count = 0, col = 0, row = 0;
uint16_t v_scroll = 0; uint16_t v_scroll = 0;

View File

@ -28,9 +28,6 @@
#define CFG_sx1276_radio 1 // select LoRa chip #define CFG_sx1276_radio 1 // select LoRa chip
#define DISABLE_BROWNOUT 1 // comment out if you want to keep brownout feature #define DISABLE_BROWNOUT 1 // comment out if you want to keep brownout feature
#define HAS_DISPLAY 2 // TFT-LCD, support work in progess, not ready yet
//#define MY_DISPLAY_FLIP 1 // use if display is rotated
#define HAS_LED NOT_A_PIN // no on board LED (?) #define HAS_LED NOT_A_PIN // no on board LED (?)
#define HAS_BUTTON (39) // on board button A #define HAS_BUTTON (39) // on board button A
@ -44,38 +41,22 @@
// GPS settings // GPS settings
#define HAS_GPS 1 // use on board GPS #define HAS_GPS 1 // use on board GPS
#define GPS_SERIAL 9600, SERIAL_8N1, RXD2, TXD2 // UBlox NEO 6M RX, TX #define GPS_SERIAL 9600, SERIAL_8N1, RXD2, TXD2 // UBlox NEO 6M RX, TX
#define GPS_INT GPIO_NUM_35 // 30ns accurary timepulse, to be external wired on pcb: shorten R12! #define GPS_INT
// Display Settings // Display Settings
#define HAS_DISPLAY 2 // TFT-LCD
//#define MY_DISPLAY_FLIP 1 // use if display is rotated
#define MY_DISPLAY_WIDTH 320 #define MY_DISPLAY_WIDTH 320
#define MY_DISPLAY_HEIGHT 240 #define MY_DISPLAY_HEIGHT 240
#define MY_DISPLAY_INVERT 1 #define MY_DISPLAY_INVERT 1
#define TFT_TYPE LCD_ILI9341
// setting for M5 display
#define USER_SETUP_LOADED 1
#define ILI9341_DRIVER 1
#define M5STACK // needed for TFT driver
#define TFT_MISO MISO // SPI
#define TFT_MOSI MOSI // SPI #define TFT_MOSI MOSI // SPI
#define TFT_MISO MISO // SPI
#define TFT_SCLK SCK // SPI #define TFT_SCLK SCK // SPI
#define TFT_CS GPIO_NUM_14 // Chip select control #define TFT_CS GPIO_NUM_14 // Chip select control
#define TFT_DC GPIO_NUM_27 // Data Command control #define TFT_DC GPIO_NUM_27 // Data Command control
#define TFT_RST GPIO_NUM_33 // Reset #define TFT_RST GPIO_NUM_33 // Reset
#define TFT_BL GPIO_NUM_32 // LED back-light #define TFT_BL GPIO_NUM_32 // LED back-light
#define TFT_FREQUENCY 40000000
#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red
//#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
//#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
//#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
//#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT
#define SPI_FREQUENCY 40000000
#endif #endif

View File

@ -20,7 +20,6 @@
#define LORA_IO1 GPIO_NUM_34 // must be wired by you on PCB! #define LORA_IO1 GPIO_NUM_34 // must be wired by you on PCB!
#define LORA_IO2 LMIC_UNUSED_PIN #define LORA_IO2 LMIC_UNUSED_PIN
// enable only if you want to store a local paxcount table on the device // enable only if you want to store a local paxcount table on the device
#define HAS_SDCARD 1 // this board has an SD-card-reader/writer #define HAS_SDCARD 1 // this board has an SD-card-reader/writer
#define SDCARD_CS GPIO_NUM_4 #define SDCARD_CS GPIO_NUM_4
@ -31,9 +30,6 @@
#define CFG_sx1276_radio 1 // select LoRa chip #define CFG_sx1276_radio 1 // select LoRa chip
#define DISABLE_BROWNOUT 1 // comment out if you want to keep brownout feature #define DISABLE_BROWNOUT 1 // comment out if you want to keep brownout feature
#define HAS_DISPLAY 2 // TFT-LCD, support work in progess, not ready yet
//#define MY_DISPLAY_FLIP 1 // use if display is rotated
#define HAS_LED NOT_A_PIN // no on board LED (?) #define HAS_LED NOT_A_PIN // no on board LED (?)
#define RGB_LED_COUNT 10 #define RGB_LED_COUNT 10
@ -53,35 +49,19 @@
// #define GPS_INT GPIO_NUM_35 // 30ns accurary timepulse, to be external wired on pcb: shorten R12! // #define GPS_INT GPIO_NUM_35 // 30ns accurary timepulse, to be external wired on pcb: shorten R12!
// Display Settings // Display Settings
#define HAS_DISPLAY 2 // TFT-LCD
//#define MY_DISPLAY_FLIP 1 // use if display is rotated
#define MY_DISPLAY_WIDTH 320 #define MY_DISPLAY_WIDTH 320
#define MY_DISPLAY_HEIGHT 240 #define MY_DISPLAY_HEIGHT 240
#define MY_DISPLAY_INVERT 1 #define MY_DISPLAY_INVERT 1
#define TFT_TYPE LCD_ILI9341
// setting for M5 display
#define USER_SETUP_LOADED 1
#define ILI9341_DRIVER 1
#define M5STACK // needed for TFT driver
#define TFT_MISO MISO // SPI
#define TFT_MOSI MOSI // SPI #define TFT_MOSI MOSI // SPI
#define TFT_MISO MISO // SPI
#define TFT_SCLK SCK // SPI #define TFT_SCLK SCK // SPI
#define TFT_CS GPIO_NUM_14 // Chip select control #define TFT_CS GPIO_NUM_14 // Chip select control
#define TFT_DC GPIO_NUM_27 // Data Command control #define TFT_DC GPIO_NUM_27 // Data Command control
#define TFT_RST GPIO_NUM_33 // Reset #define TFT_RST GPIO_NUM_33 // Reset
#define TFT_BL GPIO_NUM_32 // LED back-light #define TFT_BL GPIO_NUM_32 // LED back-light
#define TFT_FREQUENCY 40000000
#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red
//#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
//#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
//#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
//#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT
#define SPI_FREQUENCY 40000000
#endif #endif

View File

@ -34,19 +34,14 @@ Reset -> reset device
// power management settings // power management settings
#define HAS_PMU 1 // has AXP192 chip #define HAS_PMU 1 // has AXP192 chip
#define XPOWERS_CHIP_AXP192 1
#define PMU_INT GPIO_NUM_35 // battery interrupt #define PMU_INT GPIO_NUM_35 // battery interrupt
#define PMU_CHG_CURRENT AXP1XX_CHARGE_CUR_1000MA // battery charge current #define PMU_CHG_CURRENT XPOWERS_CHG_CUR_1000MA // battery charge current
// possible values (mA): // possible values (mA):
// 100/190/280/360/450/550/630/700/780/880/960/1000/1080/1160/1240/1320 // 100/190/280/360/450/550/630/700/780/880/960/1000/1080/1160/1240/1320
#define PMU_CHG_CUTOFF AXP202_TARGET_VOL_4_2V // battery charge cutoff #define PMU_CHG_CUTOFF XPOWERS_CHG_VOL_4V2 // battery charge cutoff
// possible values (V): // possible values (V):
// 4_1/4_15/4_2/4_36 // 4V1/4V15/4V2/4V36
// blue onboard led settings
// possible values:
// AXP20X_LED_OFF / AXP20X_LED_LOW_LEVEL (means LED ON) / AXP20X_LED_BLINK_1HZ / AXP20X_LED_BLINK_4HZ
#define PMU_LED_RUN_MODE AXP20X_LED_LOW_LEVEL
#define PMU_LED_SLEEP_MODE AXP20X_LED_OFF
// GPS settings // GPS settings
#define HAS_GPS 1 // use on board GPS #define HAS_GPS 1 // use on board GPS

View File

@ -9,9 +9,6 @@
#define DISABLE_BROWNOUT 1 // comment out if you want to keep brownout feature #define DISABLE_BROWNOUT 1 // comment out if you want to keep brownout feature
#define HAS_DISPLAY 2 // TFT-LCD, support work in progess, not ready yet
#define MY_DISPLAY_FLIP 1 // use if display is rotated
#define HAS_LED NOT_A_PIN // no on board LED (?) #define HAS_LED NOT_A_PIN // no on board LED (?)
#define HAS_BUTTON (35) // on board button A #define HAS_BUTTON (35) // on board button A
@ -20,36 +17,19 @@
#define BAT_VOLTAGE_DIVIDER 2.605f // voltage divider #define BAT_VOLTAGE_DIVIDER 2.605f // voltage divider
// Display Settings // Display Settings
#define HAS_DISPLAY 2 // TFT-LCD
#define MY_DISPLAY_FLIP 1 // use if display is rotated
#define MY_DISPLAY_WIDTH 135 #define MY_DISPLAY_WIDTH 135
#define MY_DISPLAY_HEIGHT 240 #define MY_DISPLAY_HEIGHT 240
#define MY_DISPLAY_INVERT 1 #define MY_DISPLAY_INVERT 1
#define TFT_TYPE LCD_ST7789_135 // size 135x240 px
// setting for TTGO T-display
#define USER_SETUP_LOADED 1
#define ST7789_DRIVER 1
#define CGRAM_OFFSET
#define TFT_MOSI GPIO_NUM_19 // SPI #define TFT_MOSI GPIO_NUM_19 // SPI
#define TFT_MISO NOT_A_PIN // SPI
#define TFT_SCLK GPIO_NUM_18 // SPI #define TFT_SCLK GPIO_NUM_18 // SPI
#define TFT_CS GPIO_NUM_5 // Chip select control #define TFT_CS GPIO_NUM_5 // Chip select control
#define TFT_DC GPIO_NUM_16 // Data Command control #define TFT_DC GPIO_NUM_16 // Data Command control
#define TFT_RST GPIO_NUM_23 // Reset #define TFT_RST GPIO_NUM_23 // Reset
#define TFT_BL GPIO_NUM_4 // LED back-light #define TFT_BL GPIO_NUM_4 // LED back-light
#define TFT_FREQUENCY 40000000
#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT
#define SPI_FREQUENCY 40000000
#define SPI_READ_FREQUENCY 6000000
#endif #endif

View File

@ -9,9 +9,6 @@
#define DISABLE_BROWNOUT 1 // comment out if you want to keep brownout feature #define DISABLE_BROWNOUT 1 // comment out if you want to keep brownout feature
#define HAS_DISPLAY 2 // TFT-LCD, support work in progess, not ready yet
#define MY_DISPLAY_FLIP 1 // use if display is rotated
#define HAS_LED NOT_A_PIN // no on board LED (?) #define HAS_LED NOT_A_PIN // no on board LED (?)
#define HAS_BUTTON (33) // on board button A #define HAS_BUTTON (33) // on board button A
@ -20,39 +17,20 @@
#define BAT_VOLTAGE_DIVIDER 2.605f // voltage divider #define BAT_VOLTAGE_DIVIDER 2.605f // voltage divider
// Display Settings // Display Settings
#define HAS_DISPLAY 2 // TFT-LCD
#define MY_DISPLAY_FLIP 1 // use if display is rotated
#define MY_DISPLAY_WIDTH 80 #define MY_DISPLAY_WIDTH 80
#define MY_DISPLAY_HEIGHT 160 #define MY_DISPLAY_HEIGHT 160
#define MY_DISPLAY_INVERT 1 #define MY_DISPLAY_INVERT 1
#define TFT_TYPE LCD_ST7735S
// setting for TTGO T-display
#define USER_SETUP_LOADED 1
#define ST7735_DRIVER 1
#define CGRAM_OFFSET
#define TFT_MISO -1
#define TFT_MOSI GPIO_NUM_19 // SPI #define TFT_MOSI GPIO_NUM_19 // SPI
#define TFT_MISO NOT_A_PIN // SPI
#define TFT_SCLK GPIO_NUM_18 // SPI #define TFT_SCLK GPIO_NUM_18 // SPI
#define TFT_CS GPIO_NUM_5 // Chip select control #define TFT_CS GPIO_NUM_5 // Chip select control
#define TFT_DC GPIO_NUM_23 // Data Command control #define TFT_DC GPIO_NUM_23 // Data Command control
#define TFT_RST GPIO_NUM_26 // Reset #define TFT_RST GPIO_NUM_26 // Reset
#define TFT_BL GPIO_NUM_27 // LED back-light #define TFT_BL GPIO_NUM_27 // LED back-light
#define TFT_BACKLIGHT_ON 1 #define TFT_FREQUENCY 27000000
#define ST7735_GREENTAB160x80
#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT
#define SPI_FREQUENCY 27000000
#define SPI_READ_FREQUENCY 6000000
#endif #endif

View File

@ -15,7 +15,6 @@ void i2c_init(void) {
void i2c_deinit(void) { Wire.end(); } void i2c_deinit(void) { Wire.end(); }
void i2c_scan(void) { void i2c_scan(void) {
// parts of the code in this function were taken from: // parts of the code in this function were taken from:
// //
// Copyright (c) 2019 BitBank Software, Inc. // Copyright (c) 2019 BitBank Software, Inc.
@ -78,7 +77,6 @@ void i2c_scan(void) {
// functions for i2c r/w access, mutexing is done by Wire.cpp // functions for i2c r/w access, mutexing is done by Wire.cpp
int i2c_readBytes(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len) { int i2c_readBytes(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len) {
uint8_t ret = 0; uint8_t ret = 0;
Wire.beginTransmission(addr); Wire.beginTransmission(addr);
Wire.write(reg); Wire.write(reg);
@ -100,7 +98,6 @@ finish:
} }
int i2c_writeBytes(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len) { int i2c_writeBytes(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len) {
uint8_t ret = 0; uint8_t ret = 0;
Wire.beginTransmission(addr); Wire.beginTransmission(addr);
Wire.write(reg); Wire.write(reg);

View File

@ -85,7 +85,6 @@ not evaluated by model BU-190, use "F" instead for this model
static const char TAG[] = __FILE__; static const char TAG[] = __FILE__;
String IF482_Frame(time_t t) { String IF482_Frame(time_t t) {
char mon, out[IF482_FRAME_SIZE + 1], buf[IF482_FRAME_SIZE - 3]; char mon, out[IF482_FRAME_SIZE + 1], buf[IF482_FRAME_SIZE - 3];
if (sntp_get_sync_status() == SNTP_SYNC_STATUS_IN_PROGRESS) if (sntp_get_sync_status() == SNTP_SYNC_STATUS_IN_PROGRESS)

View File

@ -7,7 +7,6 @@ TaskHandle_t irqHandlerTask = NULL;
// irq handler task, handles all our application level interrupts // irq handler task, handles all our application level interrupts
void irqHandler(void *pvParameters) { void irqHandler(void *pvParameters) {
_ASSERT((uint32_t)pvParameters == 1); // FreeRTOS check _ASSERT((uint32_t)pvParameters == 1); // FreeRTOS check
uint32_t irqSource; uint32_t irqSource;

View File

@ -158,7 +158,6 @@ void ledLoop(void *parameter) {
} }
// No custom blink, check LoRaWAN state // No custom blink, check LoRaWAN state
} else { } else {
#if (HAS_LORA) #if (HAS_LORA)
// LED indicators for viusalizing LoRaWAN state // LED indicators for viusalizing LoRaWAN state
if (LMIC.opmode & (OP_JOINING | OP_REJOIN)) { if (LMIC.opmode & (OP_JOINING | OP_REJOIN)) {

View File

@ -14,7 +14,6 @@
*********************************************************************/ *********************************************************************/
void setABPParameters() { void setABPParameters() {
/** ************************************************************** /** **************************************************************
* ************************************************************* */ * ************************************************************* */
#if defined(CFG_eu868) #if defined(CFG_eu868)

View File

@ -84,7 +84,6 @@ static const char TAG[] = __FILE__;
char clientId[20] = {0}; // unique ClientID char clientId[20] = {0}; // unique ClientID
void setup() { void setup() {
char features[100] = ""; char features[100] = "";
// disable brownout detection // disable brownout detection
@ -487,7 +486,6 @@ void setup() {
RTC_runmode = RUNMODE_NORMAL; RTC_runmode = RUNMODE_NORMAL;
vTaskDelete(NULL); vTaskDelete(NULL);
} // setup() } // setup()
void loop() { vTaskDelete(NULL); } void loop() { vTaskDelete(NULL); }

View File

@ -19,7 +19,6 @@ void mqtt_deinit(void) {
} }
esp_err_t mqtt_init(void) { esp_err_t mqtt_init(void) {
// setup network connection and MQTT client // setup network connection and MQTT client
ETH.begin(); ETH.begin();
ETH.setHostname(clientId); ETH.setHostname(clientId);
@ -43,7 +42,6 @@ esp_err_t mqtt_init(void) {
} }
int mqtt_connect(const char *my_host, const uint16_t my_port) { int mqtt_connect(const char *my_host, const uint16_t my_port) {
IPAddress mqtt_server_ip; IPAddress mqtt_server_ip;
ESP_LOGI(TAG, "MQTT name is %s", MQTT_CLIENTNAME); ESP_LOGI(TAG, "MQTT name is %s", MQTT_CLIENTNAME);
@ -75,13 +73,10 @@ int mqtt_connect(const char *my_host, const uint16_t my_port) {
} }
void mqtt_client_task(void *param) { void mqtt_client_task(void *param) {
MessageBuffer_t msg; MessageBuffer_t msg;
while (1) { while (1) {
if (mqttClient.connected()) { if (mqttClient.connected()) {
// check for incoming messages // check for incoming messages
mqttClient.loop(); mqttClient.loop();
@ -124,7 +119,6 @@ void mqtt_client_task(void *param) {
// process incoming MQTT messages // process incoming MQTT messages
void mqtt_callback(MQTTClient *client, char *topic, char *payload, int length) { void mqtt_callback(MQTTClient *client, char *topic, char *payload, int length) {
if (strcmp(topic, MQTT_INTOPIC) == 0) { if (strcmp(topic, MQTT_INTOPIC) == 0) {
// get length of base64 encoded message // get length of base64 encoded message
size_t out_len = 0; size_t out_len = 0;
mbedtls_base64_decode(NULL, 0, &out_len, (unsigned char *)payload, length); mbedtls_base64_decode(NULL, 0, &out_len, (unsigned char *)payload, length);

View File

@ -58,7 +58,6 @@ void PayloadConvert::addConfig(configData_t value) {
void PayloadConvert::addStatus(uint16_t voltage, uint64_t uptime, float cputemp, void PayloadConvert::addStatus(uint16_t voltage, uint64_t uptime, float cputemp,
uint32_t mem, uint8_t reset0, uint32_t mem, uint8_t reset0,
uint32_t restarts) { uint32_t restarts) {
buffer[cursor++] = highByte(voltage); buffer[cursor++] = highByte(voltage);
buffer[cursor++] = lowByte(voltage); buffer[cursor++] = lowByte(voltage);
buffer[cursor++] = (byte)((uptime & 0xFF00000000000000) >> 56); buffer[cursor++] = (byte)((uptime & 0xFF00000000000000) >> 56);

View File

@ -23,59 +23,42 @@ static const adc_unit_t unit = ADC_UNIT_1;
#endif // BAT_MEASURE_ADC #endif // BAT_MEASURE_ADC
#ifdef HAS_PMU #ifdef HAS_PMU
AXP20X_Class pmu; XPowersPMU pmu;
void AXP192_powerevent_IRQ(void) { void AXP192_powerevent_IRQ(void) {
pmu.readIRQ(); pmu.getIrqStatus();
if (pmu.isVbusOverVoltageIRQ()) if (pmu.isVbusOverVoltageIrq())
ESP_LOGI(TAG, "USB voltage %.2fV too high.", pmu.getVbusVoltage() / 1000); ESP_LOGI(TAG, "USB voltage %.2fV too high.", pmu.getVbusVoltage() / 1000);
if (pmu.isVbusPlugInIRQ()) if (pmu.isVbusInsertIrq())
ESP_LOGI(TAG, "USB plugged, %.2fV @ %.0mA", pmu.getVbusVoltage() / 1000, ESP_LOGI(TAG, "USB plugged, %.2fV @ %.0mA", pmu.getVbusVoltage() / 1000,
pmu.getVbusCurrent()); pmu.getVbusCurrent());
if (pmu.isVbusRemoveIRQ()) if (pmu.isVbusRemoveIrq())
ESP_LOGI(TAG, "USB unplugged."); ESP_LOGI(TAG, "USB unplugged.");
if (pmu.isBatInsertIrq())
if (pmu.isBattPlugInIRQ())
ESP_LOGI(TAG, "Battery is connected."); ESP_LOGI(TAG, "Battery is connected.");
if (pmu.isBattRemoveIRQ()) if (pmu.isBatRemoveIrq())
ESP_LOGI(TAG, "Battery was removed."); ESP_LOGI(TAG, "Battery was removed.");
if (pmu.isChargingIRQ()) if (pmu.isBatChagerStartIrq())
ESP_LOGI(TAG, "Battery charging."); ESP_LOGI(TAG, "Battery charging started.");
if (pmu.isChargingDoneIRQ()) { if (pmu.isBatChagerDoneIrq())
ESP_LOGI(TAG, "Battery charging done."); ESP_LOGI(TAG, "Battery charging done.");
#ifdef PMU_LED_RUN_MODE if (pmu.isBattTempLowIrq())
pmu.setChgLEDMode(PMU_LED_RUN_MODE);
#else
pmu.setChgLEDMode(AXP20X_LED_LOW_LEVEL);
#endif
}
if (pmu.isBattTempLowIRQ())
ESP_LOGI(TAG, "Battery high temperature."); ESP_LOGI(TAG, "Battery high temperature.");
if (pmu.isBattTempHighIRQ()) if (pmu.isBattTempHighIrq())
ESP_LOGI(TAG, "Battery low temperature."); ESP_LOGI(TAG, "Battery low temperature.");
if (pmu.isLowVoltageLevel1IRQ()) {
ESP_LOGI(TAG, "Battery has reached voltage level 1.");
pmu.setChgLEDMode(AXP20X_LED_BLINK_4HZ);
}
if (pmu.isLowVoltageLevel2IRQ()) {
ESP_LOGI(TAG, "Battery has reached voltage level 2.");
pmu.setChgLEDMode(AXP20X_LED_BLINK_1HZ);
}
// PEK button handling:
// long press -> shutdown power, must be exited by another longpress
if (pmu.isPekeyLongPressIrq())
AXP192_power(pmu_power_off); // switch off Lora, GPS, display
#ifdef HAS_BUTTON #ifdef HAS_BUTTON
// short press -> esp32 deep sleep mode, can be exited by pressing user button // short press -> esp32 deep sleep mode, must be exited by user button
if (pmu.isPEKShortPressIRQ()) { if (pmu.isPekeyShortPressIrq())
enter_deepsleep(0, HAS_BUTTON); enter_deepsleep(0, HAS_BUTTON);
}
#endif #endif
// long press -> shutdown power, can be exited by another longpress pmu.clearIrqStatus();
if (pmu.isPEKLongtPressIRQ()) {
AXP192_power(pmu_power_off); // switch off Lora, GPS, display
}
pmu.clearIRQ();
// refresh stored voltage value // refresh stored voltage value
read_battlevel(); read_battlevel();
@ -84,48 +67,41 @@ void AXP192_powerevent_IRQ(void) {
void AXP192_power(pmu_power_t powerlevel) { void AXP192_power(pmu_power_t powerlevel) {
switch (powerlevel) { switch (powerlevel) {
case pmu_power_off: case pmu_power_off:
pmu.setChargerLedFunction(XPOWER_CHGLED_CTRL_MANUAL);
pmu.setChargingLedFreq(XPOWERS_CHG_LED_DISABLE);
pmu.shutdown(); pmu.shutdown();
break; break;
case pmu_power_sleep: case pmu_power_sleep:
#ifdef PMU_LED_SLEEP_MODE pmu.setChargerLedFunction(XPOWER_CHGLED_CTRL_MANUAL);
pmu.setChgLEDMode(PMU_LED_SLEEP_MODE); pmu.setChargingLedFreq(XPOWERS_CHG_LED_FRE_1HZ);
#else
pmu.setChgLEDMode(AXP20X_LED_OFF);
#endif
// we don't cut off DCDC1, because OLED display will then block i2c bus // we don't cut off DCDC1, because OLED display will then block i2c bus
// pmu.setPowerOutPut(AXP192_DCDC1, AXP202_OFF); // OLED off // pmu.disableDC1(); // OLED off
pmu.setPowerOutPut(AXP192_LDO3, AXP202_OFF); // gps off pmu.disableLDO3(); // gps off
pmu.setPowerOutPut(AXP192_LDO2, AXP202_OFF); // lora off pmu.disableLDO2(); // lora off
pmu.enableSleep();
break; break;
case pmu_power_on: case pmu_power_on:
default: default:
pmu.setPowerOutPut(AXP192_LDO2, AXP202_ON); // Lora on T-Beam V1.0/1.1 pmu.enableLDO2(); // Lora on T-Beam V1.0/1.1
pmu.setPowerOutPut(AXP192_LDO3, AXP202_ON); // Gps on T-Beam V1.0/1.1 pmu.enableLDO3(); // Gps on T-Beam V1.0/1.1
pmu.setPowerOutPut(AXP192_DCDC1, AXP202_ON); // OLED on T-Beam v1.0/1.1 pmu.enableDC1(); // OLED on T-Beam v1.0/1.1
pmu.setPowerOutPut(AXP192_DCDC2, AXP202_OFF); // unused on T-Beam v1.0/1.1 pmu.setChargerLedFunction(XPOWER_CHGLED_CTRL_MANUAL);
pmu.setPowerOutPut(AXP192_EXTEN, AXP202_OFF); // unused on T-Beam v1.0/1.1 pmu.setChargingLedFreq(XPOWERS_CHG_LED_LEVEL_LOW);
#ifdef PMU_LED_RUN_MODE
pmu.setChgLEDMode(PMU_LED_RUN_MODE);
#else
pmu.setChgLEDMode(AXP20X_LED_LOW_LEVEL);
#endif
break; break;
} }
} }
void AXP192_showstatus(void) { void AXP192_showstatus(void) {
if (pmu.isBatteryConnect()) if (pmu.isBatteryConnect())
if (pmu.isChargeing()) if (pmu.isCharging())
ESP_LOGI(TAG, "Battery charging, %.2fV @ %.0fmAh", ESP_LOGI(TAG, "Battery charging, %.2fV @ %.0fmAh",
pmu.getBattVoltage() / 1000, pmu.getBattChargeCurrent()); pmu.getBattVoltage() / 1000, pmu.getBatteryChargeCurrent());
else else
ESP_LOGI(TAG, "Battery not charging"); ESP_LOGI(TAG, "Battery not charging");
else else
ESP_LOGI(TAG, "No Battery"); ESP_LOGI(TAG, "No Battery");
if (pmu.isVBUSPlug()) if (pmu.isVbusIn())
ESP_LOGI(TAG, "USB powered, %.0fmW", ESP_LOGI(TAG, "USB powered, %.0fmW",
pmu.getVbusVoltage() / 1000 * pmu.getVbusCurrent()); pmu.getVbusVoltage() / 1000 * pmu.getVbusCurrent());
else else
@ -133,58 +109,58 @@ void AXP192_showstatus(void) {
} }
void AXP192_init(void) { void AXP192_init(void) {
if (pmu.begin(i2c_readBytes, i2c_writeBytes, AXP192_PRIMARY_ADDRESS) == if (!pmu.begin(Wire, AXP192_PRIMARY_ADDRESS, SCL, SDA))
AXP_FAIL)
ESP_LOGI(TAG, "AXP192 PMU initialization failed"); ESP_LOGI(TAG, "AXP192 PMU initialization failed");
else { else {
// configure voltages ESP_LOGD(TAG, "AXP192 ChipID:0x%x", pmu.getChipID());
pmu.setDCDC1Voltage(3300); // for external OLED display
// set pmu operating voltages
pmu.setMinSystemVoltage(2700);
pmu.setVbusVoltageLimit(XPOWERS_VBUS_VOL_LIM_4V5);
pmu.disableVbusCurrLimit();
// set device operating voltages
pmu.setDC1Voltage(3300); // for external OLED display
pmu.setLDO2Voltage(3300); // LORA VDD 3v3 pmu.setLDO2Voltage(3300); // LORA VDD 3v3
pmu.setLDO3Voltage(3300); // GPS VDD 3v3 pmu.setLDO3Voltage(3300); // GPS VDD 3v3
// configure voltage warning levels
pmu.setVWarningLevel1(3600);
pmu.setVWarningLevel2(3800);
pmu.setPowerDownVoltage(3300);
// configure PEK button settings // configure PEK button settings
pmu.setTimeOutShutdown(false); // forced shutdown by PEK enabled pmu.setPowerKeyPressOffTime(XPOWERS_POWEROFF_4S);
pmu.setShutdownTime( pmu.setPowerKeyPressOnTime(XPOWERS_POWERON_128MS);
AXP_POWER_OFF_TIME_6S); // 6 sec button press for shutdown
pmu.setlongPressTime(
AXP_LONGPRESS_TIME_1S5); // 1.5 sec button press for long press
pmu.setStartupTime(
AXP192_STARTUP_TIME_1S); // 1 sec button press for startup
// set battery temperature sensing pin off to save power // set battery temperature sensing pin off to save power
pmu.setTSmode(AXP_TS_PIN_MODE_DISABLE); pmu.disableTSPinMeasure();
// switch ADCs on // Enable internal ADC detection
pmu.adc1Enable(AXP202_BATT_VOL_ADC1, true); pmu.enableBattDetection();
pmu.adc1Enable(AXP202_BATT_CUR_ADC1, true); pmu.enableVbusVoltageMeasure();
pmu.adc1Enable(AXP202_VBUS_VOL_ADC1, true); pmu.enableBattVoltageMeasure();
pmu.adc1Enable(AXP202_VBUS_CUR_ADC1, true); pmu.enableSystemVoltageMeasure();
#ifdef PMU_INT #ifdef PMU_INT
pinMode(PMU_INT, INPUT_PULLUP); pinMode(PMU_INT, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PMU_INT), PMUIRQ, FALLING); attachInterrupt(digitalPinToInterrupt(PMU_INT), PMUIRQ, FALLING);
pmu.enableIRQ(AXP202_VBUS_REMOVED_IRQ | AXP202_VBUS_CONNECT_IRQ | // disable all interrupts
AXP202_BATT_REMOVED_IRQ | AXP202_BATT_CONNECT_IRQ | pmu.disableIRQ(XPOWERS_ALL_IRQ);
AXP202_CHARGING_FINISHED_IRQ | AXP202_PEK_SHORTPRESS_IRQ, // clear all interrupt flags
1); pmu.clearIrqStatus();
pmu.clearIRQ(); // enable the required interrupt function
pmu.enableIRQ(XPOWERS_BAT_INSERT_IRQ | XPOWERS_BAT_REMOVE_IRQ | // BATTERY
XPOWERS_VBUS_INSERT_IRQ | XPOWERS_VBUS_REMOVE_IRQ | // VBUS
XPOWERS_PKEY_SHORT_IRQ | XPOWERS_PKEY_LONG_IRQ | // POWER KEY
XPOWERS_BAT_CHG_DONE_IRQ | XPOWERS_BAT_CHG_START_IRQ // CHARGE
);
#endif // PMU_INT #endif // PMU_INT
// set charging parameterss according to user settings if we have (see power.h) // set charging parameters according to user settings if we have (see power.h)
#ifdef PMU_CHG_CURRENT #ifdef PMU_CHG_CURRENT
pmu.setChargeControlCur(PMU_CHG_CURRENT); pmu.setChargeCurrent(PMU_CHG_CURRENT);
pmu.setChargingTargetVoltage(PMU_CHG_CUTOFF); pmu.setChargerVoltageLimit(PMU_CHG_CUTOFF);
pmu.enableChargeing(true); pmu.enableCharge();
#endif #endif
// switch power rails on // switch power rails on
AXP192_power(pmu_power_on); AXP192_power(pmu_power_on);
ESP_LOGI(TAG, "AXP192 PMU initialized"); ESP_LOGI(TAG, "AXP192 PMU initialized");
} }
} }
@ -263,6 +239,8 @@ uint8_t read_battlevel(mapFn_t mapFunction) {
uint8_t batt_percent = 0; uint8_t batt_percent = 0;
#ifdef HAS_IP5306 #ifdef HAS_IP5306
batt_percent = IP5306_GetBatteryLevel(); batt_percent = IP5306_GetBatteryLevel();
#elif defined HAS_PMU
batt_percent = pmu.getBatteryPercent();
#else #else
const uint16_t batt_voltage = read_voltage(); const uint16_t batt_voltage = read_voltage();
if (batt_voltage <= BAT_MIN_VOLTAGE) if (batt_voltage <= BAT_MIN_VOLTAGE)
@ -292,7 +270,7 @@ uint8_t read_battlevel(mapFn_t mapFunction) {
// overwrite calculated value if we have external power // overwrite calculated value if we have external power
#ifdef HAS_PMU #ifdef HAS_PMU
if (pmu.isVBUSPlug()) if (pmu.isVbusIn())
LMIC_setBatteryLevel(MCMD_DEVS_EXT_POWER); LMIC_setBatteryLevel(MCMD_DEVS_EXT_POWER);
#elif defined HAS_IP5306 #elif defined HAS_IP5306
if (IP5306_GetPowerSource()) if (IP5306_GetPowerSource())

View File

@ -39,7 +39,6 @@ void do_reset(bool warmstart) {
} }
void do_after_reset(void) { void do_after_reset(void) {
struct timeval sleep_stop_time; struct timeval sleep_stop_time;
uint64_t sleep_time_ms; uint64_t sleep_time_ms;
@ -54,7 +53,6 @@ void do_after_reset(void) {
#endif #endif
switch (rtc_get_reset_reason(0)) { switch (rtc_get_reset_reason(0)) {
case POWERON_RESET: // 0x01 Vbat power on reset case POWERON_RESET: // 0x01 Vbat power on reset
case RTCWDT_BROWN_OUT_RESET: // 0x0f Reset when the vdd voltage is not case RTCWDT_BROWN_OUT_RESET: // 0x0f Reset when the vdd voltage is not
// stable // stable
@ -102,24 +100,17 @@ void do_after_reset(void) {
} }
void enter_deepsleep(const uint64_t wakeup_sec, gpio_num_t wakeup_gpio) { void enter_deepsleep(const uint64_t wakeup_sec, gpio_num_t wakeup_gpio) {
ESP_LOGI(TAG, "Preparing to sleep..."); ESP_LOGI(TAG, "Preparing to sleep...");
RTC_runmode = RUNMODE_SLEEP; RTC_runmode = RUNMODE_SLEEP;
int i; int i;
// show message on display
#ifdef HAS_DISPLAY
dp_message("-GOING TO SLEEP-", 7, true);
#endif
// validate wake up pin, if we have // validate wake up pin, if we have
if (!GPIO_IS_VALID_GPIO(wakeup_gpio)) if (!GPIO_IS_VALID_GPIO(wakeup_gpio))
wakeup_gpio = GPIO_NUM_MAX; wakeup_gpio = GPIO_NUM_MAX;
// stop further enqueuing of senddata and MAC processing // stop further enqueuing of senddata and MAC processing
// -> skipped, because shutting down bluedroid stack tends to crash libpax_counter_stop();
// libpax_counter_stop();
// switch off any power consuming hardware // switch off any power consuming hardware
#if (HAS_SDS011) #if (HAS_SDS011)
@ -205,4 +196,6 @@ void enter_deepsleep(const uint64_t wakeup_sec, gpio_num_t wakeup_gpio) {
esp_deep_sleep_start(); esp_deep_sleep_start();
} }
unsigned long long uptime() { return (RTC_millis + esp_timer_get_time() / 1000); } unsigned long long uptime() {
return (RTC_millis + esp_timer_get_time() / 1000);
}

View File

@ -9,7 +9,6 @@ RtcDS3231<TwoWire> Rtc(Wire); // RTC hardware i2c interface
// initialize RTC // initialize RTC
uint8_t rtc_init(void) { uint8_t rtc_init(void) {
Wire.begin(HAS_RTC); Wire.begin(HAS_RTC);
Rtc.Begin(MY_DISPLAY_SDA, MY_DISPLAY_SCL); Rtc.Begin(MY_DISPLAY_SDA, MY_DISPLAY_SCL);
@ -39,11 +38,9 @@ uint8_t rtc_init(void) {
// failure // failure
// return 0 // return 0
} // rtc_init() } // rtc_init()
uint8_t set_rtctime(time_t t) { // t is sec epoch time uint8_t set_rtctime(time_t t) { // t is sec epoch time
#ifdef RTC_INT // sync rtc 1Hz pulse on top of second #ifdef RTC_INT // sync rtc 1Hz pulse on top of second
Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeNone); // off Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeNone); // off
Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeClock); // start Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeClock); // start
@ -51,11 +48,9 @@ uint8_t set_rtctime(time_t t) { // t is sec epoch time
Rtc.SetDateTime(RtcDateTime(t - SECS_YR_2000)); // epoch -> sec2000 Rtc.SetDateTime(RtcDateTime(t - SECS_YR_2000)); // epoch -> sec2000
ESP_LOGI(TAG, "RTC time synced"); ESP_LOGI(TAG, "RTC time synced");
return 1; // success return 1; // success
} // set_rtctime() } // set_rtctime()
time_t get_rtctime(uint16_t *msec) { time_t get_rtctime(uint16_t *msec) {
time_t t = 0; time_t t = 0;
*msec = 0; *msec = 0;
if (Rtc.IsDateTimeValid() && Rtc.GetIsRunning()) { if (Rtc.IsDateTimeValid() && Rtc.GetIsRunning()) {
@ -75,7 +70,6 @@ time_t get_rtctime(uint16_t *msec) {
#endif #endif
return t; return t;
} // get_rtctime() } // get_rtctime()
float get_rtctemp(void) { float get_rtctemp(void) {

View File

@ -67,7 +67,6 @@ int print_to_sd_card(const char *fmt, va_list args) {
#endif #endif
bool openFile(FILE **fd, const char *filename) { bool openFile(FILE **fd, const char *filename) {
char _filename[50]; char _filename[50];
sprintf(_filename, "%s%s", MOUNT_POINT, filename); sprintf(_filename, "%s%s", MOUNT_POINT, filename);
@ -81,7 +80,6 @@ bool openFile(FILE **fd, const char *filename) {
} // openfile } // openfile
bool sdcard_init(bool create) { bool sdcard_init(bool create) {
esp_err_t ret; esp_err_t ret;
// for usage of SD drivers on ESP32 platform see // for usage of SD drivers on ESP32 platform see
@ -171,7 +169,6 @@ bool sdcard_init(bool create) {
snprintf(bufferFilename, sizeof(bufferFilename), "/%s.csv", SDCARD_FILE_NAME); snprintf(bufferFilename, sizeof(bufferFilename), "/%s.csv", SDCARD_FILE_NAME);
if (openFile(&data_file, bufferFilename)) { if (openFile(&data_file, bufferFilename)) {
fpos_t position; fpos_t position;
fgetpos(data_file, &position); fgetpos(data_file, &position);
@ -207,7 +204,6 @@ bool sdcard_init(bool create) {
#endif #endif
return useSDCard; return useSDCard;
} // sdcard_init } // sdcard_init
void sdcard_flush(void) { void sdcard_flush(void) {
@ -236,7 +232,6 @@ void sdcard_close(void) {
void sdcardWriteData(uint16_t noWifi, uint16_t noBle, void sdcardWriteData(uint16_t noWifi, uint16_t noBle,
__attribute__((unused)) uint16_t voltage) { __attribute__((unused)) uint16_t voltage) {
if (!useSDCard) if (!useSDCard)
return; return;

View File

@ -25,7 +25,6 @@ void initSendDataTimer(uint8_t sendcycle) {
// put data to send in RTos Queues used for transmit over channels Lora and SPI // put data to send in RTos Queues used for transmit over channels Lora and SPI
void SendPayload(uint8_t port) { void SendPayload(uint8_t port) {
ESP_LOGD(TAG, "sending Payload for Port %d", port); ESP_LOGD(TAG, "sending Payload for Port %d", port);
MessageBuffer_t SendBuffer; // contains MessageSize, MessagePort, Message[] MessageBuffer_t SendBuffer; // contains MessageSize, MessagePort, Message[]
@ -69,12 +68,10 @@ void SendPayload(uint8_t port) {
#ifdef HAS_MQTT #ifdef HAS_MQTT
mqtt_enqueuedata(&SendBuffer); mqtt_enqueuedata(&SendBuffer);
#endif #endif
} // SendPayload } // SendPayload
// timer triggered function to prepare payload to send // timer triggered function to prepare payload to send
void sendData() { void sendData() {
uint8_t bitmask = cfg.payloadmask; uint8_t bitmask = cfg.payloadmask;
uint8_t mask = 1; uint8_t mask = 1;
@ -93,7 +90,6 @@ void sendData() {
while (bitmask) { while (bitmask) {
switch (bitmask & mask) { switch (bitmask & mask) {
#if ((WIFICOUNTER) || (BLECOUNTER)) #if ((WIFICOUNTER) || (BLECOUNTER))
case COUNT_DATA: case COUNT_DATA:
payload.reset(); payload.reset();
@ -199,7 +195,6 @@ void sendData() {
SendPayload(BATTPORT); SendPayload(BATTPORT);
break; break;
#endif #endif
} // switch } // switch
bitmask &= ~mask; bitmask &= ~mask;
mask <<= 1; mask <<= 1;

View File

@ -9,7 +9,6 @@ static const char TAG[] = __FILE__;
10 // max. size of user sensor data buffer in bytes [default=20] 10 // max. size of user sensor data buffer in bytes [default=20]
void sensor_init(void) { void sensor_init(void) {
// this function is called during device startup // this function is called during device startup
// put your user sensor initialization routines here // put your user sensor initialization routines here
} }
@ -38,14 +37,11 @@ uint8_t sensor_mask(uint8_t sensor_no) {
} }
uint8_t *sensor_read(uint8_t sensor) { uint8_t *sensor_read(uint8_t sensor) {
static uint8_t buf[SENSORBUFFER] = {0}; static uint8_t buf[SENSORBUFFER] = {0};
uint8_t length = 3; uint8_t length = 3;
switch (sensor) { switch (sensor) {
case 1: case 1:
// insert user specific sensor data frames here // insert user specific sensor data frames here
buf[0] = length; buf[0] = length;
buf[1] = 0x01; buf[1] = 0x01;
@ -53,15 +49,12 @@ uint8_t *sensor_read(uint8_t sensor) {
buf[3] = 0x03; buf[3] = 0x03;
break; break;
case 2: case 2:
buf[0] = length; buf[0] = length;
buf[1] = 0x01; buf[1] = 0x01;
buf[2] = 0x02; buf[2] = 0x02;
buf[3] = 0x03; buf[3] = 0x03;
break; break;
case 3: case 3:
buf[0] = length; buf[0] = length;
buf[1] = 0x01; buf[1] = 0x01;
buf[2] = 0x02; buf[2] = 0x02;

View File

@ -332,7 +332,7 @@ time_t compileTime(void) {
if (secs == -1) { if (secs == -1) {
// determine date // determine date
sscanf(__DATE__, "%s %d %d", s_month, &t.tm_mday, &year); sscanf(__DATE__, "%4s %d %d", s_month, &t.tm_mday, &year);
t.tm_mon = (strstr(month_names, s_month) - month_names) / 3; t.tm_mon = (strstr(month_names, s_month) - month_names) / 3;
t.tm_year = year - 1900; t.tm_year = year - 1900;
// determine time // determine time

View File

@ -56,7 +56,6 @@ void timesync_request(void) {
// task for processing time sync request // task for processing time sync request
void timesync_processReq(void *taskparameter) { void timesync_processReq(void *taskparameter) {
uint32_t rcv_seqNo = TIME_SYNC_END_FLAG; uint32_t rcv_seqNo = TIME_SYNC_END_FLAG;
uint32_t time_offset_sec = 0, time_offset_ms = 0; uint32_t time_offset_sec = 0, time_offset_ms = 0;
@ -68,7 +67,6 @@ void timesync_processReq(void *taskparameter) {
// --- asnychronous part: generate and collect timestamps from gateway --- // --- asnychronous part: generate and collect timestamps from gateway ---
while (1) { while (1) {
// wait for kickoff // wait for kickoff
ulTaskNotifyTake(pdFALSE, portMAX_DELAY); ulTaskNotifyTake(pdFALSE, portMAX_DELAY);
@ -85,7 +83,6 @@ void timesync_processReq(void *taskparameter) {
// collect timestamp samples in timestamp array // collect timestamp samples in timestamp array
for (int8_t i = 0; i < TIME_SYNC_SAMPLES; i++) { for (int8_t i = 0; i < TIME_SYNC_SAMPLES; i++) {
// send timesync request // send timesync request
#if (TIME_SYNC_LORASERVER) // ask user's timeserver (for LoRAWAN < 1.0.3) #if (TIME_SYNC_LORASERVER) // ask user's timeserver (for LoRAWAN < 1.0.3)
payload.reset(); payload.reset();
@ -122,7 +119,6 @@ void timesync_processReq(void *taskparameter) {
// if we are not in last cycle, pause until next cycle // if we are not in last cycle, pause until next cycle
if (i < TIME_SYNC_SAMPLES - 1) if (i < TIME_SYNC_SAMPLES - 1)
vTaskDelay(pdMS_TO_TICKS(TIME_SYNC_CYCLE * 1000)); vTaskDelay(pdMS_TO_TICKS(TIME_SYNC_CYCLE * 1000));
} // for i } // for i
// --- time critial part: evaluate timestamps and calculate time --- // --- time critial part: evaluate timestamps and calculate time ---
@ -161,7 +157,6 @@ void timesync_processReq(void *taskparameter) {
// end of time critical section: release app irq lock // end of time critical section: release app irq lock
timeSyncPending = false; timeSyncPending = false;
unmask_user_IRQ(); unmask_user_IRQ();
} // infinite while(1) } // infinite while(1)
} }
@ -174,7 +169,6 @@ void timesync_store(uint32_t timestamp, timesync_t timestamp_type) {
// callback function to receive time answer from network or answer // callback function to receive time answer from network or answer
void timesync_serverAnswer(void *pUserData, int flag) { void timesync_serverAnswer(void *pUserData, int flag) {
#if (HAS_LORA_TIME) #if (HAS_LORA_TIME)
// if no timesync handshake is pending then exit // if no timesync handshake is pending then exit