commit
						8826a26c7a
					
				| @ -42,8 +42,7 @@ | ||||
| #define SCREEN_MODE (0x80) | ||||
| 
 | ||||
| // I2C bus access control
 | ||||
| #define I2C_MUTEX_LOCK()                                                       \ | ||||
|   xSemaphoreTake(I2Caccess, pdMS_TO_TICKS(3 * DISPLAYREFRESH_MS)) == pdTRUE | ||||
| #define I2C_MUTEX_LOCK() xSemaphoreTake(I2Caccess, pdMS_TO_TICKS(10)) == pdTRUE | ||||
| #define I2C_MUTEX_UNLOCK() xSemaphoreGive(I2Caccess) | ||||
| 
 | ||||
| // Struct holding devices's runtime configuration
 | ||||
|  | ||||
| @ -26,6 +26,7 @@ halfile = generic.h | ||||
| ;halfile = lolin32lora.h | ||||
| ;halfile = lolin32lite.h | ||||
| ;halfile = wemos32oled.h | ||||
| ;halfile = wemos32matrix.h | ||||
| ;halfile = octopus32.h | ||||
| 
 | ||||
| [platformio] | ||||
| @ -41,7 +42,7 @@ description = Paxcounter is a device for metering passenger flows in realtime. I | ||||
| 
 | ||||
| [common] | ||||
| ; for release_version use max. 10 chars total, use any decimal format like "a.b.c" | ||||
| release_version = 1.7.8 | ||||
| release_version = 1.7.82 | ||||
| ; 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 | ||||
| debug_level = 3 | ||||
| @ -50,8 +51,6 @@ otakeyfile = ota.conf | ||||
| lorakeyfile = loraconf.h | ||||
| lmicconfigfile = lmic_config.h | ||||
| platform_espressif32 = espressif32@1.9.0 | ||||
| board_build.partitions = min_spiffs.csv | ||||
| board = esp32dev | ||||
| monitor_speed = 115200 | ||||
| upload_speed = 115200 | ||||
| lib_deps_lora = | ||||
| @ -97,11 +96,11 @@ build_flags_all = | ||||
|     -mfix-esp32-psram-cache-issue | ||||
| 
 | ||||
| [env] | ||||
| board = ${common.board} | ||||
| framework = arduino | ||||
| board = esp32dev | ||||
| board_build.partitions = min_spiffs.csv | ||||
| upload_speed = ${common.upload_speed} | ||||
| platform = ${common.platform_espressif32} | ||||
| framework = arduino | ||||
| board_build.partitions = ${common.board_build.partitions} | ||||
| lib_deps = ${common.lib_deps_all} | ||||
| build_flags = ${common.build_flags_all} | ||||
| upload_protocol = ${common.upload_protocol} | ||||
|  | ||||
| @ -28,19 +28,12 @@ void button_init(int pin) { | ||||
| #ifdef HAS_MATRIX_DISPLAY | ||||
|     refreshTheMatrixDisplay(true); // switch to next display page
 | ||||
| #endif | ||||
| 
 | ||||
| #if (!defined HAS_DISPLAY) && (!defined HAS_MATRIX_DISPLAY) | ||||
|     payload.reset(); | ||||
|     payload.addButton(0x01); | ||||
|     SendPayload(BUTTONPORT, prio_normal); | ||||
| #endif | ||||
|   }); | ||||
| 
 | ||||
|   b->setOnHolding([]() { | ||||
| #if (HAS_LORA) | ||||
|     cfg.adrmode = !cfg.adrmode; | ||||
|     LMIC_setAdrMode(cfg.adrmode); | ||||
| #endif | ||||
|     payload.reset(); | ||||
|     payload.addButton(0x01); | ||||
|     SendPayload(BUTTONPORT, prio_normal); | ||||
|   }); | ||||
| 
 | ||||
|   // attach interrupt to the button
 | ||||
|  | ||||
| @ -22,14 +22,14 @@ void defaultConfig() { | ||||
|       WIFI_CHANNEL_SWITCH_INTERVAL; // wifi channel switch cycle [seconds/100]
 | ||||
|   cfg.blescantime = | ||||
|       BLESCANINTERVAL / | ||||
|       10;          // BT channel scan cycle [seconds/100], default 1 (= 10ms)
 | ||||
|   cfg.blescan = 0; // 0=disabled, 1=enabled
 | ||||
|   cfg.wifiant = 0; // 0=internal, 1=external (for LoPy/LoPy4)
 | ||||
|   cfg.vendorfilter = 1;       // 0=disabled, 1=enabled
 | ||||
|   cfg.rgblum = RGBLUMINOSITY; // RGB Led luminosity (0..100%)
 | ||||
|   cfg.monitormode = 0;        // 0=disabled, 1=enabled
 | ||||
|   cfg.runmode = 0;            // 0=normal, 1=update
 | ||||
|   cfg.payloadmask = 0xFF;     // all payload switched on
 | ||||
|       10; // BT channel scan cycle [seconds/100], default 1 (= 10ms)
 | ||||
|   cfg.blescan = BLECOUNTER;        // 0=disabled, 1=enabled
 | ||||
|   cfg.wifiant = 0;                 // 0=internal, 1=external (for LoPy/LoPy4)
 | ||||
|   cfg.vendorfilter = VENDORFILTER; // 0=disabled, 1=enabled
 | ||||
|   cfg.rgblum = RGBLUMINOSITY;      // RGB Led luminosity (0..100%)
 | ||||
|   cfg.monitormode = 0;             // 0=disabled, 1=enabled
 | ||||
|   cfg.runmode = 0;                 // 0=normal, 1=update
 | ||||
|   cfg.payloadmask = 0xFF;          // all payload switched on
 | ||||
|   cfg.bsecstate[BSEC_MAX_STATE_BLOB_SIZE] = { | ||||
|       0}; // init BSEC state for BME680 sensor
 | ||||
| 
 | ||||
|  | ||||
| @ -306,12 +306,12 @@ void draw_page(time_t t, uint8_t page) { | ||||
|         wasnofix = false; | ||||
|       } | ||||
|       // line 3-4: GPS latitude
 | ||||
|       snprintf(buff, sizeof(buff), "%c%-07.4f", | ||||
|       snprintf(buff, sizeof(buff), "%c%07.4f", | ||||
|                gps.location.rawLat().negative ? 'S' : 'N', gps.location.lat()); | ||||
|       u8x8.draw2x2String(0, 3, buff); | ||||
| 
 | ||||
|       // line 6-7: GPS longitude
 | ||||
|       snprintf(buff, sizeof(buff), "%c%-07.4f", | ||||
|       snprintf(buff, sizeof(buff), "%c%07.4f", | ||||
|                gps.location.rawLat().negative ? 'W' : 'E', gps.location.lng()); | ||||
|       u8x8.draw2x2String(0, 6, buff); | ||||
| 
 | ||||
| @ -334,7 +334,7 @@ void draw_page(time_t t, uint8_t page) { | ||||
| 
 | ||||
| #if (HAS_BME) | ||||
|     // line 2-3: Temp
 | ||||
|     snprintf(buff, sizeof(buff), "TMP:%--4.1f", bme_status.temperature); | ||||
|     snprintf(buff, sizeof(buff), "TMP:%-4.1f", bme_status.temperature); | ||||
|     u8x8.draw2x2String(0, 2, buff); | ||||
| 
 | ||||
|     // line 4-5: Hum
 | ||||
|  | ||||
| @ -79,13 +79,12 @@ void IRAM_ATTR gps_storetime(gpsStatus_t &gps_store) { | ||||
| 
 | ||||
|   if (gps.time.isUpdated() && gps.date.isValid() && (gps.time.age() < 1000)) { | ||||
| 
 | ||||
|     /* nmea telegram serial delay compensation; not sure if we need this?
 | ||||
|     // nmea telegram serial delay compensation; not sure if we need this?
 | ||||
| 
 | ||||
|         if (gps.time.age() > nmea_txDelay_ms) | ||||
|           gps_store.timedate.Second = gps.time.second() + 1; | ||||
|         else | ||||
|           gps_store.timedate.Second = gps.time.second(); | ||||
|     */ | ||||
|     if (gps.time.age() > nmea_txDelay_ms) | ||||
|       gps_store.timedate.Second = gps.time.second() + 1; | ||||
|     else | ||||
|       gps_store.timedate.Second = gps.time.second(); | ||||
| 
 | ||||
|     gps_store.timedate.Second = gps.time.second(); | ||||
|     gps_store.timedate.Minute = gps.time.minute(); | ||||
|  | ||||
							
								
								
									
										47
									
								
								src/hal/wemos32matrix.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								src/hal/wemos32matrix.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,47 @@ | ||||
| // clang-format off
 | ||||
| // upload_speed 921600
 | ||||
| // board lolin32
 | ||||
| 
 | ||||
| #ifndef _WEMOS32MATRIX_H | ||||
| #define _WEMOS32MATRIX_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #define HAS_LED NOT_A_PIN // no LED
 | ||||
| 
 | ||||
| // LED Matrix display settings
 | ||||
| #define HAS_MATRIX_DISPLAY              1       // Uncomment to enable LED matrix display output
 | ||||
| #define LED_MATRIX_WIDTH                64      // Width in pixels (LEDs) of your display
 | ||||
| #define LED_MATRIX_HEIGHT               16      // Height in pixels (LEDs ) of your display
 | ||||
| 
 | ||||
| // Pin numbers work fine for Wemos Lolin32 board (all used pins are on 1 side of the board)
 | ||||
| // Explanation of pin signals see https://learn.adafruit.com/32x16-32x32-rgb-led-matrix/new-wiring
 | ||||
| #define MATRIX_DISPLAY_SCAN_US          500     // Matrix display scan rate in microseconds (1ms is about 'acceptable')
 | ||||
| #define LED_MATRIX_LATCHPIN             13      // LAT (or STB = Strobe)
 | ||||
| #define LED_MATRIX_CLOCKPIN             32      // CLK
 | ||||
| #define LED_MATRIX_EN_74138             12      // EN (or OE)
 | ||||
| #define LED_MATRIX_LA_74138             14      // LA (or A)
 | ||||
| #define LED_MATRIX_LB_74138             27      // LB (or B)
 | ||||
| #define LED_MATRIX_LC_74138             25      // LC (or C)
 | ||||
| #define LED_MATRIX_LD_74138             26      // LD (or D)
 | ||||
| #define LED_MATRIX_DATA_R1              33      // R1 (or R0)
 | ||||
| 
 | ||||
| // CLK: The clock signal moves the data bits from pin R1 ("red") in the shift registers
 | ||||
| // LAT: The latch signal enables LEDs according to the shift register's contents
 | ||||
| // Line Selects: LA, LB, LC, LD select which rows of the display are currently lit (0 .. 15)
 | ||||
| // OE: Output enable switches the LEDs on/off while transitioning from one row to the next
 | ||||
| 
 | ||||
| /*
 | ||||
| How it works: | ||||
| 
 | ||||
| 1. clock out 8 bytes for columns via R1 and CLK (8 * 8 bit -> 64 columns) | ||||
| 2. OE disable (LEDs off) | ||||
| 3. select line to lit with LA/LB/LC/LD hex coded (4 bit -> 16 rows) | ||||
| 4. latch data from shift registers to columns | ||||
| 5. OE enable (LEDs on) | ||||
| 6. repeat with step1 for next line | ||||
| */ | ||||
| 
 | ||||
| #define DISABLE_BROWNOUT 1 // comment out if you want to keep brownout feature
 | ||||
| 
 | ||||
| #endif | ||||
| @ -7,41 +7,14 @@ | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| // Hardware related definitions for TTGO T-Beam board
 | ||||
| // (only) for older T-Beam version T22_V05 eternal wiring LORA_IO1 to GPIO33 is needed!
 | ||||
| //
 | ||||
| // pinouts taken from http://tinymicros.com/wiki/TTGO_T-Beam
 | ||||
| 
 | ||||
| #define HAS_LED NOT_A_PIN // no LED
 | ||||
| 
 | ||||
| //#define HAS_LORA 1       // comment out if device shall not send data via LoRa
 | ||||
| //#define CFG_sx1276_radio 1 // HPD13A LoRa SoC
 | ||||
| //#define BOARD_HAS_PSRAM // use extra 4MB external RAM
 | ||||
| //#define HAS_BUTTON GPIO_NUM_39 // on board button (next to reset)
 | ||||
| //#define BAT_MEASURE_ADC ADC1_GPIO35_CHANNEL // battery probe GPIO pin -> ADC1_CHANNEL_7
 | ||||
| //#define BAT_VOLTAGE_DIVIDER 2 // voltage divider 100k/100k on board
 | ||||
| 
 | ||||
| // GPS settings
 | ||||
| //#define HAS_GPS 1 // use on board GPS
 | ||||
| //#define GPS_SERIAL 9600, SERIAL_8N1, GPIO_NUM_12, GPIO_NUM_15 // UBlox NEO 6M
 | ||||
| //#define GPS_INT GPIO_NUM_34 // 30ns accurary timepulse, to be external wired on pcb: NEO 6M Pin#3 -> GPIO34
 | ||||
| 
 | ||||
| // enable only if device has these sensors, otherwise comment these lines
 | ||||
| // BME680 sensor on I2C bus
 | ||||
| //#define HAS_BME 1 // Enable BME sensors in general
 | ||||
| //#define HAS_BME680 SDA, SCL
 | ||||
| //#define BME680_ADDR BME680_I2C_ADDR_PRIMARY // !! connect SDIO of BME680 to GND !!
 | ||||
| 
 | ||||
| // display (if connected)
 | ||||
| #define HAS_DISPLAY U8X8_SSD1306_128X64_NONAME_HW_I2C | ||||
| #define MY_OLED_SDA (5) | ||||
| #define MY_OLED_SCL (4) | ||||
| #define MY_OLED_RST U8X8_PIN_NONE | ||||
| #define DISPLAY_FLIP  1 // use if display is rotated
 | ||||
| 
 | ||||
| // user defined sensors (if connected)
 | ||||
| //#define HAS_SENSORS 1 // comment out if device has user defined sensors
 | ||||
| 
 | ||||
| #define DISABLE_BROWNOUT 1 // comment out if you want to keep brownout feature
 | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
| @ -121,13 +121,16 @@ void IRAM_ATTR GpsIRQ() { | ||||
| 
 | ||||
| int mask_user_IRQ() { | ||||
|   // begin of time critical section: lock I2C bus to ensure accurate timing
 | ||||
|   if (!I2C_MUTEX_LOCK()) | ||||
|   if (I2C_MUTEX_LOCK()) { | ||||
|     xTaskNotify(irqHandlerTask, MASK_IRQ, eSetBits); | ||||
|     return 0; | ||||
|   } else | ||||
|     return 1; // failure
 | ||||
|   xTaskNotify(irqHandlerTask, MASK_IRQ, eSetBits); | ||||
| } | ||||
| 
 | ||||
| int unmask_user_IRQ() { | ||||
|   // end of time critical section: release I2C bus
 | ||||
|   I2C_MUTEX_UNLOCK(); | ||||
|   xTaskNotify(irqHandlerTask, UNMASK_IRQ, eSetBits); | ||||
| } | ||||
|   return 0; | ||||
| } | ||||
| @ -21,9 +21,9 @@ uint8_t displaybuf[LED_MATRIX_WIDTH * LED_MATRIX_HEIGHT / NUMCHARS]; | ||||
| 
 | ||||
| // --- SELECT YOUR FONT HERE ---
 | ||||
| const FONT_INFO *ActiveFontInfo = &digital7_18ptFontInfo; | ||||
| //const FONT_INFO *ActiveFontInfo = &arialNarrow_17ptFontInfo;
 | ||||
| //const FONT_INFO *ActiveFontInfo = &gillSansMTCondensed_18ptFontInfo;
 | ||||
| //const FONT_INFO *ActiveFontInfo = &gillSansMTCondensed_16ptFontInfo;
 | ||||
| // const FONT_INFO *ActiveFontInfo = &arialNarrow_17ptFontInfo;
 | ||||
| // const FONT_INFO *ActiveFontInfo = &gillSansMTCondensed_18ptFontInfo;
 | ||||
| // const FONT_INFO *ActiveFontInfo = &gillSansMTCondensed_16ptFontInfo;
 | ||||
| 
 | ||||
| const uint8_t *iaActiveFont = ActiveFontInfo->Bitmap; | ||||
| const FONT_CHAR_INFO *ActiveFontCharInfo = ActiveFontInfo->Descriptors; | ||||
| @ -68,6 +68,7 @@ void refreshTheMatrixDisplay(bool nextPage) { | ||||
|       matrix.clear(); | ||||
|       DrawNumber(String(ulLastNumMacs)); | ||||
|     } | ||||
|     break; | ||||
| 
 | ||||
|   case 1: | ||||
| 
 | ||||
| @ -79,6 +80,7 @@ void refreshTheMatrixDisplay(bool nextPage) { | ||||
|                second(t)); | ||||
|       DrawNumber(String(buff)); | ||||
|     } | ||||
|     break; | ||||
| 
 | ||||
|   } // switch page
 | ||||
| 
 | ||||
|  | ||||
| @ -183,7 +183,6 @@ void showLoraKeys(void) { | ||||
| 
 | ||||
| void onEvent(ev_t ev) { | ||||
|   char buff[24] = ""; | ||||
|   uint32_t now_micros = 0; | ||||
| 
 | ||||
|   switch (ev) { | ||||
| 
 | ||||
| @ -421,7 +420,7 @@ esp_err_t lora_stack_init() { | ||||
|     return ESP_FAIL; | ||||
|   } | ||||
|   ESP_LOGI(TAG, "LORA send queue created, size %d Bytes", | ||||
|            SEND_QUEUE_SIZE * PAYLOAD_BUFFER_SIZE); | ||||
|            SEND_QUEUE_SIZE * sizeof(MessageBuffer_t)); | ||||
| 
 | ||||
|   ESP_LOGI(TAG, "Starting LMIC..."); | ||||
| 
 | ||||
| @ -460,7 +459,7 @@ void lora_enqueuedata(MessageBuffer_t *message, sendprio_t prio) { | ||||
|   switch (prio) { | ||||
|   case prio_high: | ||||
|     // clear space in queue if full, then fallthrough to normal
 | ||||
|     if (uxQueueSpacesAvailable == 0) | ||||
|     if (uxQueueSpacesAvailable(LoraSendQueue) == 0) | ||||
|       xQueueReceive(LoraSendQueue, &DummyBuffer, (TickType_t)0); | ||||
|   case prio_normal: | ||||
|     ret = xQueueSendToFront(LoraSendQueue, (void *)message, (TickType_t)0); | ||||
|  | ||||
| @ -106,21 +106,4 @@ | ||||
| #define CAYENNE_ACTUATOR                10	    // actuator commands | ||||
| #define CAYENNE_DEVICECONFIG            11	    // device period configuration | ||||
| #define CAYENNE_SENSORREAD              13	    // sensor period configuration | ||||
| #define CAYENNE_SENSORENABLE            14	    // sensor enable configuration | ||||
| 
 | ||||
| // LED Matrix display settings.  | ||||
| // Note: LED Matrix will only show number of found devices, no other information will be shown for now | ||||
| //#define HAS_MATRIX_DISPLAY              1       // Uncomment to enable LED matrix display output | ||||
| #define LED_MATRIX_WIDTH                64      // Width in pixels (LEDs) of your display | ||||
| #define LED_MATRIX_HEIGHT               16      // Height in pixels (LEDs ) of your display | ||||
| 
 | ||||
| // Pin numbers work fine for Wemos Lolin32 board (all used pins are on 1 side of the board) | ||||
| #define MATRIX_DISPLAY_SCAN_US          500     // Matrix display scan rate in microseconds (1ms is about 'acceptable') | ||||
| #define LED_MATRIX_LATCHPIN             13      // Connects to LAT pin on display | ||||
| #define LED_MATRIX_CLOCKPIN             32      // Connects to CLK pin on display | ||||
| #define LED_MATRIX_EN_74138             12      // Connects to OE pin on display | ||||
| #define LED_MATRIX_LA_74138             14      // Connects to LA pin on display | ||||
| #define LED_MATRIX_LB_74138             27      // Connects to LB pin on display | ||||
| #define LED_MATRIX_LC_74138             25      // Connects to LC pin on display | ||||
| #define LED_MATRIX_LD_74138             26      // Connects to LD pin on display | ||||
| #define LED_MATRIX_DATA_R1              33      // Connects to R1 pin on display | ||||
| #define CAYENNE_SENSORENABLE            14	    // sensor enable configuration | ||||
| @ -47,21 +47,23 @@ IRAM_ATTR void wifi_sniffer_packet_handler(void *buff, | ||||
| 
 | ||||
| // Software-timer driven Wifi channel rotation callback function
 | ||||
| void switchWifiChannel(TimerHandle_t xTimer) { | ||||
|     channel = | ||||
|         (channel % WIFI_CHANNEL_MAX) + 1; // rotate channel 1..WIFI_CHANNEL_MAX
 | ||||
|     esp_wifi_set_channel(channel, WIFI_SECOND_CHAN_NONE); | ||||
|   } | ||||
|   channel = | ||||
|       (channel % WIFI_CHANNEL_MAX) + 1; // rotate channel 1..WIFI_CHANNEL_MAX
 | ||||
|   esp_wifi_set_channel(channel, WIFI_SECOND_CHAN_NONE); | ||||
| } | ||||
| 
 | ||||
| void wifi_sniffer_init(void) { | ||||
|   wifi_init_config_t wificfg = WIFI_INIT_CONFIG_DEFAULT(); | ||||
|   wificfg.nvs_enable = 0;        // we don't need any wifi settings from NVRAM
 | ||||
|   wificfg.wifi_task_core_id = 0; // we want wifi task running on core 0
 | ||||
|   wifi_promiscuous_filter_t filter = { | ||||
|       // .filter_mask = WIFI_PROMIS_FILTER_MASK_MGMT}; // only MGMT frames
 | ||||
|       .filter_mask = WIFI_PROMIS_FILTER_MASK_ALL}; // we use all frames
 | ||||
| 
 | ||||
|   ESP_ERROR_CHECK(esp_coex_preference_set( | ||||
|       ESP_COEX_PREFER_BALANCE)); // configure Wifi/BT coexist lib
 | ||||
|   // wifi_promiscuous_filter_t filter = {
 | ||||
|   // .filter_mask = WIFI_PROMIS_FILTER_MASK_MGMT}; // only MGMT frames
 | ||||
|   // .filter_mask = WIFI_PROMIS_FILTER_MASK_ALL}; // we use all frames
 | ||||
| 
 | ||||
|   wifi_promiscuous_filter_t filter = {.filter_mask = | ||||
|                                           WIFI_PROMIS_FILTER_MASK_MGMT | | ||||
|                                           WIFI_PROMIS_FILTER_MASK_DATA}; | ||||
| 
 | ||||
|   ESP_ERROR_CHECK(esp_wifi_init(&wificfg)); // configure Wifi with cfg
 | ||||
|   ESP_ERROR_CHECK( | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user