resolved merge conflicts
This commit is contained in:
commit
a839f5ea68
@ -126,8 +126,8 @@ Note: all settings are stored in NVRAM and will be reloaded when device starts.
|
||||
0x07 set LoRa Adaptive Data Rate mode
|
||||
|
||||
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.
|
||||
|
||||
0x08 do nothing
|
||||
@ -165,6 +165,11 @@ Note: all settings are stored in NVRAM and will be reloaded when device starts.
|
||||
0 = internal antenna [default]
|
||||
1 = external antenna
|
||||
|
||||
0x0F set RGB led luminosity (works on LoPy/LoPy4 and LoRaNode32 shield only)
|
||||
|
||||
0 ... 100 percentage of luminosity (100% = full light)
|
||||
e.g. 40 -> 40% of luminosity
|
||||
|
||||
0x80 get device configuration
|
||||
|
||||
device answers with it's current configuration:
|
||||
|
@ -10,9 +10,9 @@
|
||||
|
||||
; ---> SELECT TARGET PLATFORM HERE! <---
|
||||
[platformio]
|
||||
;env_default = heltec_wifi_lora_32
|
||||
env_default = heltec_wifi_lora_32
|
||||
;env_default = ttgov1
|
||||
env_default = ttgov2
|
||||
;env_default = ttgov2
|
||||
;env_default = lopy
|
||||
;env_default = lopy4
|
||||
;env_default = lolin32lite_lora
|
||||
@ -95,7 +95,7 @@ monitor_baud = 115200
|
||||
lib_deps =
|
||||
U8g2@>2.21.7
|
||||
ESP32 BLE Arduino@>=0.4.9
|
||||
; NeoPixelBus
|
||||
SmartLeds
|
||||
build_flags =
|
||||
;set log level, we need build_flag for this, otherwise we can't use ESP_LOGx in arduino framework
|
||||
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE
|
||||
@ -118,8 +118,8 @@ monitor_baud = 115200
|
||||
lib_deps =
|
||||
U8g2@>2.21.7
|
||||
ESP32 BLE Arduino@>=0.4.9
|
||||
; NeoPixelBus
|
||||
build_flags =
|
||||
SmartLeds
|
||||
build_flags =
|
||||
;set log level, we need build_flag for this, otherwise we can't use ESP_LOGx in arduino framework
|
||||
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE
|
||||
; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE
|
||||
@ -142,8 +142,8 @@ upload_speed = 256000
|
||||
lib_deps =
|
||||
U8g2
|
||||
ESP32 BLE Arduino@>=0.4.9
|
||||
; NeoPixelBus
|
||||
build_flags =
|
||||
SmartLeds
|
||||
build_flags =
|
||||
;set log level, we need build_flag for this, otherwise we can't use ESP_LOGx in arduino framework
|
||||
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE
|
||||
; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE
|
||||
@ -166,8 +166,8 @@ upload_speed = 921600
|
||||
lib_deps =
|
||||
U8g2
|
||||
ESP32 BLE Arduino@>=0.4.9
|
||||
; NeoPixelBus
|
||||
build_flags =
|
||||
SmartLeds
|
||||
build_flags =
|
||||
;set log level, we need build_flag for this, otherwise we can't use ESP_LOGx in arduino framework
|
||||
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE
|
||||
; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE
|
||||
@ -180,4 +180,3 @@ build_flags =
|
||||
-include "src/hal/lolin32_lora.h"
|
||||
;FreeRTOS single core operation, switches off core 1 (see arduino-esp32/cores/esp32/main.cpp)
|
||||
; -DCONFIG_FREERTOS_UNICORE
|
||||
|
||||
|
@ -31,6 +31,8 @@ void defaultConfig() {
|
||||
cfg.blescancycle = BLESCANTIME; // BLE scan cycle [seconds]
|
||||
cfg.blescan = 0; // 0=disabled, 1=enabled
|
||||
cfg.wifiant = 0; // 0=internal, 1=external (for LoPy/LoPy4)
|
||||
cfg.rgblum = RGBLUMINOSITY; // RGB Led luminosity (0 100%)
|
||||
|
||||
strncpy( cfg.version, PROGVERSION, sizeof(cfg.version)-1 );
|
||||
}
|
||||
|
||||
@ -47,7 +49,7 @@ void open_storage() {
|
||||
// Open
|
||||
ESP_LOGI(TAG, "Opening NVS");
|
||||
err = nvs_open("config", NVS_READWRITE, &my_handle);
|
||||
if (err != ESP_OK)
|
||||
if (err != ESP_OK)
|
||||
ESP_LOGI(TAG, "Error (%d) opening NVS handle", err);
|
||||
else
|
||||
ESP_LOGI(TAG, "Done");
|
||||
@ -56,14 +58,14 @@ void open_storage() {
|
||||
// erase all keys and values in NVRAM
|
||||
void eraseConfig() {
|
||||
ESP_LOGI(TAG, "Clearing settings in NVS");
|
||||
open_storage();
|
||||
open_storage();
|
||||
if (err == ESP_OK) {
|
||||
nvs_erase_all(my_handle);
|
||||
nvs_commit(my_handle);
|
||||
nvs_close(my_handle);
|
||||
ESP_LOGI(TAG, "Done");}
|
||||
else {
|
||||
ESP_LOGW(TAG, "NVS erase failed"); }
|
||||
ESP_LOGI(TAG, "Done");}
|
||||
else {
|
||||
ESP_LOGW(TAG, "NVS erase failed"); }
|
||||
}
|
||||
|
||||
// save current configuration from RAM to NVRAM
|
||||
@ -75,10 +77,10 @@ void saveConfig() {
|
||||
int16_t flash16 = 0;
|
||||
size_t required_size;
|
||||
char storedversion[10];
|
||||
|
||||
|
||||
if( nvs_get_str(my_handle, "version", storedversion, &required_size) != ESP_OK || strcmp(storedversion, cfg.version) != 0 )
|
||||
nvs_set_str(my_handle, "version", cfg.version);
|
||||
|
||||
|
||||
if( nvs_get_i8(my_handle, "lorasf", &flash8) != ESP_OK || flash8 != cfg.lorasf )
|
||||
nvs_set_i8(my_handle, "lorasf", cfg.lorasf);
|
||||
|
||||
@ -110,11 +112,14 @@ void saveConfig() {
|
||||
nvs_set_i8(my_handle, "blescanmode", cfg.blescan);
|
||||
|
||||
if( nvs_get_i8(my_handle, "wifiant", &flash8) != ESP_OK || flash8 != cfg.wifiant )
|
||||
nvs_set_i8(my_handle, "wifiant", cfg.wifiant);
|
||||
nvs_set_i8(my_handle, "wifiant", cfg.wifiant);
|
||||
|
||||
if( nvs_get_i8(my_handle, "rgblum", &flash8) != ESP_OK || flash8 != cfg.rgblum )
|
||||
nvs_set_i8(my_handle, "rgblum", cfg.rgblum);
|
||||
|
||||
if( nvs_get_i16(my_handle, "rssilimit", &flash16) != ESP_OK || flash16 != cfg.rssilimit )
|
||||
nvs_set_i16(my_handle, "rssilimit", cfg.rssilimit);
|
||||
|
||||
|
||||
err = nvs_commit(my_handle);
|
||||
nvs_close(my_handle);
|
||||
if ( err == ESP_OK ) {
|
||||
@ -146,7 +151,7 @@ void loadConfig() {
|
||||
int8_t flash8 = 0;
|
||||
int16_t flash16 = 0;
|
||||
size_t required_size;
|
||||
|
||||
|
||||
// check if configuration stored in NVRAM matches PROGVERSION
|
||||
if( nvs_get_str(my_handle, "version", NULL, &required_size) == ESP_OK ) {
|
||||
nvs_get_str(my_handle, "version", cfg.version, &required_size);
|
||||
@ -227,7 +232,7 @@ void loadConfig() {
|
||||
ESP_LOGI(TAG, "WIFI channel cycle set to default %i", cfg.wifichancycle);
|
||||
saveConfig();
|
||||
}
|
||||
|
||||
|
||||
if( nvs_get_i8(my_handle, "wifiant", &flash8) == ESP_OK ) {
|
||||
cfg.wifiant = flash8;
|
||||
ESP_LOGI(TAG, "wifiantenna = %i", flash8);
|
||||
@ -236,6 +241,14 @@ void loadConfig() {
|
||||
saveConfig();
|
||||
}
|
||||
|
||||
if( nvs_get_i8(my_handle, "rgblum", &flash8) == ESP_OK ) {
|
||||
cfg.rgblum = flash8;
|
||||
ESP_LOGI(TAG, "rgbluminosity = %i", flash8);
|
||||
} else {
|
||||
ESP_LOGI(TAG, "RGB luminosity set to default %i", cfg.rgblum);
|
||||
saveConfig();
|
||||
}
|
||||
|
||||
if( nvs_get_i8(my_handle, "blescancycle", &flash8) == ESP_OK ) {
|
||||
cfg.blescancycle = flash8;
|
||||
ESP_LOGI(TAG, "blescancycle = %i", flash8);
|
||||
@ -251,7 +264,7 @@ void loadConfig() {
|
||||
ESP_LOGI(TAG, "BLEscanmode set to default %i", cfg.blescan);
|
||||
saveConfig();
|
||||
}
|
||||
|
||||
|
||||
if( nvs_get_i16(my_handle, "rssilimit", &flash16) == ESP_OK ) {
|
||||
cfg.rssilimit = flash16;
|
||||
ESP_LOGI(TAG, "rssilimit = %i", flash16);
|
||||
@ -259,7 +272,7 @@ void loadConfig() {
|
||||
ESP_LOGI(TAG, "rssilimit set to default %i", cfg.rssilimit);
|
||||
saveConfig();
|
||||
}
|
||||
|
||||
|
||||
nvs_close(my_handle);
|
||||
ESP_LOGI(TAG, "Done");
|
||||
|
||||
@ -268,5 +281,5 @@ void loadConfig() {
|
||||
#ifdef HAS_ANTENNA_SWITCH // set antenna type, if device has one
|
||||
antenna_select(cfg.wifiant);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,6 +3,8 @@
|
||||
|
||||
// std::set for unified array functions
|
||||
#include <set>
|
||||
#include <array>
|
||||
#include <algorithm>
|
||||
|
||||
// OLED Display
|
||||
#include <U8x8lib.h>
|
||||
@ -11,6 +13,12 @@
|
||||
#include <lmic.h>
|
||||
#include <hal/hal.h>
|
||||
|
||||
#ifdef HAS_RGB_LED
|
||||
#include <SmartLeds.h>
|
||||
#endif
|
||||
#include "rgb_led.h"
|
||||
#include "macsniff.h"
|
||||
|
||||
// Struct holding devices's runtime configuration
|
||||
typedef struct {
|
||||
int8_t lorasf; // 7-12, lora spreadfactor
|
||||
@ -25,6 +33,7 @@ typedef struct {
|
||||
int8_t blescancycle; // BLE scan cycle [seconds]
|
||||
int8_t blescan; // 0=disabled, 1=enabled
|
||||
int8_t wifiant; // 0=internal, 1=external (for LoPy/LoPy4)
|
||||
int8_t rgblum; // RGB Led luminosity (0 100%)
|
||||
char version[10]; // Firmware version
|
||||
} configData_t;
|
||||
|
||||
@ -32,9 +41,9 @@ extern configData_t cfg;
|
||||
extern uint8_t mydata[];
|
||||
extern uint64_t uptimecounter;
|
||||
extern osjob_t sendjob;
|
||||
extern uint16_t macnum, blenum, salt;
|
||||
extern int countermode, screensaver, adrmode, lorasf, txpower, rlim;
|
||||
extern int countermode, screensaver, adrmode, lorasf, txpower, rlim, salt;
|
||||
extern bool joinstate;
|
||||
extern std::set<uint16_t> wifis;
|
||||
extern std::set<uint16_t> macs;
|
||||
|
||||
#ifdef HAS_DISPLAY
|
||||
@ -45,4 +54,5 @@ extern std::set<uint16_t> macs;
|
||||
|
||||
#ifdef BLECOUNTER
|
||||
extern int scanTime;
|
||||
#endif
|
||||
extern std::set<uint32_t> bles;
|
||||
#endif
|
||||
|
@ -6,6 +6,7 @@
|
||||
|
||||
#define HAS_DISPLAY U8X8_SSD1306_128X64_NONAME_HW_I2C // OLED-Display on board
|
||||
#define HAS_LED NOT_A_PIN // Led os on same pin than Lora SS pin, to avoid pb, we don't use it
|
||||
#define LED_ACTIVE_LOW 1 // Onboard LED is active when pin is LOW
|
||||
// Anyway shield is on over the LoLin32 board, so we won't be able to see this LED
|
||||
#define HAS_RGB_LED 13 // ESP32 GPIO13 (pin13) On Board Shield WS2812B RGB LED
|
||||
#define HAS_BUTTON 15 // ESP32 GPIO15 (pin15) Button is on the LoraNode32 shield
|
||||
@ -30,4 +31,3 @@
|
||||
#define OLED_RST U8X8_PIN_NONE // Not reset pin
|
||||
#define OLED_SDA 21 // ESP32 GPIO21 (Pin21) -- OLED SDA
|
||||
#define OLED_SCL 22 // ESP32 GPIO22 (Pin22) -- OLED SCL
|
||||
|
||||
|
@ -5,8 +5,8 @@
|
||||
#define DISABLE_BROWNOUT 1 // comment out if you want to keep brownout feature
|
||||
|
||||
#define HAS_DISPLAY U8X8_SSD1306_128X64_NONAME_HW_I2C // OLED-Display on board
|
||||
#define HAS_LED NOT_A_PIN // Led os on same pin than Lora SS pin, to avoid pb, we don't use it
|
||||
// Anyway shield is on over the LoLin32 board, so we won't be able to see this LED
|
||||
#define HAS_LED 22 // ESP32 GPIO12 (pin22) On Board LED
|
||||
#define LED_ACTIVE_LOW 1 // Onboard LED is active when pin is LOW
|
||||
#define HAS_RGB_LED 13 // ESP32 GPIO13 (pin13) On Board Shield WS2812B RGB LED
|
||||
#define HAS_BUTTON 15 // ESP32 GPIO15 (pin15) Button is on the LoraNode32 shield
|
||||
#define BUTTON_PULLUP 1 // Button need pullup instead of default pulldown
|
||||
@ -30,4 +30,3 @@
|
||||
#define OLED_RST U8X8_PIN_NONE // Not reset pin
|
||||
#define OLED_SDA 14 // ESP32 GPIO14 (Pin14) -- OLED SDA
|
||||
#define OLED_SCL 12 // ESP32 GPIO12 (Pin12) -- OLED SCL
|
||||
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
#define HAS_DISPLAY U8X8_SSD1306_128X64_NONAME_HW_I2C // OLED-Display on board
|
||||
#define HAS_LED GPIO_NUM_2 // white LED on board
|
||||
#define LED_ACTIVE_LOW 1 // Onboard LED is active when pin is LOW
|
||||
#define HAS_BUTTON GPIO_NUM_0 // button "PRG" on board
|
||||
|
||||
// re-define pin definitions of pins_arduino.h
|
||||
@ -21,4 +22,4 @@
|
||||
// Hardware pin definitions for TTGOv1 Board with OLED SSD1306 I2C Display
|
||||
#define OLED_RST 16 // ESP32 GPIO16 (Pin16) -- SD1306 Reset
|
||||
#define OLED_SDA 4 // ESP32 GPIO4 (Pin4) -- SD1306 Data
|
||||
#define OLED_SCL 15 // ESP32 GPIO15 (Pin15) -- SD1306 Clock
|
||||
#define OLED_SCL 15 // ESP32 GPIO15 (Pin15) -- SD1306 Clock
|
||||
|
@ -79,10 +79,22 @@ void printKeys(void) {
|
||||
#endif // VERBOSE
|
||||
|
||||
void do_send(osjob_t* j){
|
||||
mydata[0] = (macnum & 0xff00) >> 8;
|
||||
mydata[1] = macnum & 0x00ff;
|
||||
mydata[2] = (blenum & 0xff00) >> 8;
|
||||
mydata[3] = blenum & 0x00ff;
|
||||
uint16_t data;
|
||||
// Total of differents MAC seen (BLE+WiFi)
|
||||
data = (uint16_t) macs.size();
|
||||
mydata[0] = (data & 0xff00) >> 8;
|
||||
mydata[1] = data & 0xff;
|
||||
|
||||
// Total of differents MAC seen BLE Only
|
||||
data = (uint16_t) bles.size();
|
||||
mydata[2] = (data & 0xff00) >> 8;
|
||||
mydata[3] = data & 0xff;
|
||||
|
||||
// Total of differents MAC seen Wifi Only
|
||||
// TBD ?
|
||||
//data = (uint16_t) wifis.size();
|
||||
//mydata[4] = (data & 0xff00) >> 8;
|
||||
//mydata[5] = data & 0xff;
|
||||
|
||||
// Check if there is not a current TX/RX job running
|
||||
if (LMIC.opmode & OP_TXRXPEND) {
|
||||
@ -95,7 +107,6 @@ void do_send(osjob_t* j){
|
||||
ESP_LOGI(TAG, "Packet queued");
|
||||
u8x8.clearLine(7);
|
||||
u8x8.drawString(0, 7, "PACKET QUEUED");
|
||||
set_onboard_led(1);
|
||||
}
|
||||
// Next TX is scheduled after TX_COMPLETE event.
|
||||
}
|
||||
@ -162,7 +173,6 @@ void onEvent (ev_t ev) {
|
||||
ESP_LOGI(TAG, "EV_TXCOMPLETE (includes waiting for RX windows)");
|
||||
u8x8.clearLine(7);
|
||||
u8x8.drawString(0, 7, "TX COMPLETE");
|
||||
set_onboard_led(0);
|
||||
if (LMIC.txrxFlags & TXRX_ACK) {
|
||||
ESP_LOGI(TAG, "Received ack");
|
||||
u8x8.clearLine(7);
|
||||
@ -176,7 +186,7 @@ void onEvent (ev_t ev) {
|
||||
u8x8.clearLine(7);
|
||||
u8x8.setCursor(0, 7);
|
||||
// LMIC.snr = SNR twos compliment [dB] * 4
|
||||
// LMIC.rssi = RSSI [dBm] (-196...+63)
|
||||
// LMIC.rssi = RSSI [dBm] (-196...+63)
|
||||
u8x8.printf("RSSI %d SNR %d", LMIC.rssi, (signed char)LMIC.snr / 4);
|
||||
// check if payload received on command port, then call remote command interpreter
|
||||
if ( (LMIC.txrxFlags & TXRX_PORT) && (LMIC.frame[LMIC.dataBeg-1] == RCMDPORT ) ) {
|
||||
@ -223,4 +233,5 @@ void onEvent (ev_t ev) {
|
||||
u8x8.printf("UNKNOWN EVENT %d", ev);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
146
src/macsniff.cpp
Normal file
146
src/macsniff.cpp
Normal file
@ -0,0 +1,146 @@
|
||||
|
||||
// Basic Config
|
||||
#include "main.h"
|
||||
#include "globals.h"
|
||||
|
||||
#ifdef BLECOUNTER
|
||||
#include <BLEDevice.h>
|
||||
#include <BLEUtils.h>
|
||||
#include <BLEScan.h>
|
||||
#include <BLEAdvertisedDevice.h>
|
||||
#endif
|
||||
|
||||
#ifdef VENDORFILTER
|
||||
#include <array>
|
||||
#include <algorithm>
|
||||
#include "vendor_array.h"
|
||||
#endif
|
||||
|
||||
// Local logging tag
|
||||
static const char *TAG = "macsniff";
|
||||
|
||||
static wifi_country_t wifi_country = {.cc=WIFI_MY_COUNTRY, .schan=WIFI_CHANNEL_MIN, .nchan=WIFI_CHANNEL_MAX, .policy=WIFI_COUNTRY_POLICY_MANUAL};
|
||||
|
||||
uint16_t currentScanDevice = 0;
|
||||
|
||||
bool mac_add(uint8_t *paddr, int8_t rssi, bool sniff_type) {
|
||||
|
||||
char counter [6]; // uint16_t -> 2 byte -> 5 decimals + '0' terminator -> 6 chars
|
||||
char macbuf [21]; // uint64_t -> 8 byte -> 20 decimals + '0' terminator -> 21 chars
|
||||
char typebuff[8] ;
|
||||
bool added = false;
|
||||
uint64_t addr2int;
|
||||
uint32_t vendor2int;
|
||||
uint16_t hashedmac;
|
||||
std::pair<std::set<uint16_t>::iterator, bool> newmac;
|
||||
|
||||
addr2int = ( (uint64_t)paddr[0] ) | ( (uint64_t)paddr[1] << 8 ) | ( (uint64_t)paddr[2] << 16 ) | \
|
||||
( (uint64_t)paddr[3] << 24 ) | ( (uint64_t)paddr[4] << 32 ) | ( (uint64_t)paddr[5] << 40 );
|
||||
|
||||
#ifdef VENDORFILTER
|
||||
vendor2int = ( (uint32_t)paddr[2] ) | ( (uint32_t)paddr[1] << 8 ) | ( (uint32_t)paddr[0] << 16 );
|
||||
// No vendor filter for BLE
|
||||
if ( (sniff_type==MAC_SNIFF_BLE) || std::find(vendors.begin(), vendors.end(), vendor2int) != vendors.end() ) {
|
||||
#endif
|
||||
|
||||
// salt and hash MAC, and if new unique one, store identifier in container and increment counter on display
|
||||
// https://en.wikipedia.org/wiki/MAC_Address_Anonymization
|
||||
|
||||
addr2int |= (uint64_t) salt << 48; // prepend 16-bit salt to 48-bit MAC
|
||||
snprintf(macbuf, 21, "%llx", addr2int); // convert unsigned 64-bit salted MAC to 16 digit hex string
|
||||
hashedmac = rokkit(macbuf, 5); // hash MAC string, use 5 chars to fit hash in uint16_t container
|
||||
newmac = macs.insert(hashedmac); // store hashed MAC only if first time seen
|
||||
|
||||
if (sniff_type == MAC_SNIFF_WIFI ) {
|
||||
newmac = wifis.insert(hashedmac); // store hashed MAC if new unique
|
||||
strcpy(typebuff, "WiFi");
|
||||
} else if (sniff_type == MAC_SNIFF_BLE ) {
|
||||
newmac = bles.insert(hashedmac); // store hashed MAC if new unique
|
||||
strcpy(typebuff, "BLE ");
|
||||
}
|
||||
|
||||
if (newmac.second) { // first time seen this WIFI/BLE MAC
|
||||
// Insert to global counter
|
||||
macs.insert(hashedmac);
|
||||
added = true;
|
||||
snprintf(counter, 6, "%i", macs.size()); // convert 16-bit MAC counter to decimal counter value
|
||||
//itoa(macs.size(), counter, 10); // base 10 decimal counter value
|
||||
u8x8.draw2x2String(0, 0, counter);
|
||||
ESP_LOGI(TAG, "%s RSSI %04d -> Hash %04x -> #%05i", typebuff, rssi, hashedmac, macs.size());
|
||||
} else {
|
||||
ESP_LOGI(TAG, "%s RSSI %04d -> already seen", typebuff, rssi);
|
||||
}
|
||||
|
||||
#ifdef VENDORFILTER
|
||||
} else {
|
||||
// Very noisy
|
||||
//ESP_LOGI(TAG, "Filtered MAC %02X:%02X:%02X:%02X:%02X:%02X", paddr[0],paddr[1],paddr[2],paddr[3],paddr[5],paddr[5]);
|
||||
}
|
||||
#endif
|
||||
|
||||
// True if MAC (WiFi/BLE was new)
|
||||
return added;
|
||||
}
|
||||
|
||||
#ifdef BLECOUNTER
|
||||
|
||||
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
|
||||
void onResult(BLEAdvertisedDevice advertisedDevice) {
|
||||
uint8_t *p = (uint8_t *) advertisedDevice.getAddress().getNative();
|
||||
|
||||
// Current devices seen on this scan session
|
||||
currentScanDevice++;
|
||||
mac_add(p, advertisedDevice.getRSSI(), MAC_SNIFF_BLE);
|
||||
u8x8.setCursor(12,3);
|
||||
u8x8.printf("%d", currentScanDevice);
|
||||
}
|
||||
};
|
||||
|
||||
void BLECount() {
|
||||
int blenum = 0; // Total device seen on this scan session
|
||||
currentScanDevice = 0; // Set 0 seen device on this scan session
|
||||
u8x8.clearLine(3);
|
||||
u8x8.drawString(0,3,"BLE Scan...");
|
||||
BLEDevice::init(PROGNAME);
|
||||
BLEScan* pBLEScan = BLEDevice::getScan(); //create new scan
|
||||
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
|
||||
pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
|
||||
BLEScanResults foundDevices = pBLEScan->start(cfg.blescancycle);
|
||||
blenum=foundDevices.getCount();
|
||||
u8x8.clearLine(3);
|
||||
u8x8.setCursor(0,3);
|
||||
u8x8.printf("BLE#: %-5i %-3i",bles.size(), blenum);
|
||||
}
|
||||
#endif
|
||||
|
||||
void wifi_sniffer_init(void) {
|
||||
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
||||
cfg.nvs_enable = 0; // we don't need any wifi settings from NVRAM
|
||||
wifi_promiscuous_filter_t filter = {.filter_mask = WIFI_PROMIS_FILTER_MASK_MGMT}; // we need only MGMT frames
|
||||
ESP_ERROR_CHECK(esp_wifi_init(&cfg)); // configure Wifi with cfg
|
||||
ESP_ERROR_CHECK(esp_wifi_set_country(&wifi_country)); // set locales for RF and channels
|
||||
ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM)); // we don't need NVRAM
|
||||
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_NULL));
|
||||
ESP_ERROR_CHECK(esp_wifi_set_promiscuous_filter(&filter)); // set MAC frame filter
|
||||
ESP_ERROR_CHECK(esp_wifi_set_promiscuous_rx_cb(&wifi_sniffer_packet_handler));
|
||||
ESP_ERROR_CHECK(esp_wifi_set_promiscuous(true)); // now switch on monitor mode
|
||||
}
|
||||
|
||||
void wifi_sniffer_set_channel(uint8_t channel) {
|
||||
esp_wifi_set_channel(channel, WIFI_SECOND_CHAN_NONE);
|
||||
}
|
||||
|
||||
void wifi_sniffer_packet_handler(void* buff, wifi_promiscuous_pkt_type_t type) {
|
||||
const wifi_promiscuous_pkt_t *ppkt = (wifi_promiscuous_pkt_t *)buff;
|
||||
const wifi_ieee80211_packet_t *ipkt = (wifi_ieee80211_packet_t *)ppkt->payload;
|
||||
const wifi_ieee80211_mac_hdr_t *hdr = &ipkt->hdr;
|
||||
|
||||
if (( cfg.rssilimit == 0 ) || (ppkt->rx_ctrl.rssi > cfg.rssilimit )) { // rssi is negative value
|
||||
uint8_t *p = (uint8_t *) hdr->addr2;
|
||||
mac_add(p, ppkt->rx_ctrl.rssi, MAC_SNIFF_WIFI) ;
|
||||
} else {
|
||||
ESP_LOGI(TAG, "WiFi RSSI %04d -> ignoring (limit: %i)", ppkt->rx_ctrl.rssi, cfg.rssilimit);
|
||||
}
|
||||
yield();
|
||||
}
|
||||
|
28
src/macsniff.h
Normal file
28
src/macsniff.h
Normal file
@ -0,0 +1,28 @@
|
||||
// ESP32 Functions
|
||||
#include <esp_wifi.h>
|
||||
|
||||
#define MAC_SNIFF_WIFI 0
|
||||
#define MAC_SNIFF_BLE 1
|
||||
|
||||
typedef struct {
|
||||
unsigned frame_ctrl:16;
|
||||
unsigned duration_id:16;
|
||||
uint8_t addr1[6]; /* receiver address */
|
||||
uint8_t addr2[6]; /* sender address */
|
||||
uint8_t addr3[6]; /* filtering address */
|
||||
unsigned sequence_ctrl:16;
|
||||
uint8_t addr4[6]; /* optional */
|
||||
} wifi_ieee80211_mac_hdr_t;
|
||||
|
||||
typedef struct {
|
||||
wifi_ieee80211_mac_hdr_t hdr;
|
||||
uint8_t payload[0]; /* network data ended with 4 bytes csum (CRC32) */
|
||||
} wifi_ieee80211_packet_t;
|
||||
|
||||
void BLECount();
|
||||
void wifi_sniffer_init(void);
|
||||
void wifi_sniffer_set_channel(uint8_t channel);
|
||||
void wifi_sniffer_packet_handler(void *buff, wifi_promiscuous_pkt_type_t type);
|
||||
|
||||
// function defined in rokkithash.cpp
|
||||
uint32_t rokkit(const char * , int );
|
151
src/main.cpp
151
src/main.cpp
@ -25,6 +25,9 @@ Refer to LICENSE.txt file in repository for more details.
|
||||
#include "main.h"
|
||||
#include "globals.h"
|
||||
|
||||
// std::set for unified array functions
|
||||
#include <set>
|
||||
|
||||
// OLED driver
|
||||
#include <U8x8lib.h>
|
||||
|
||||
@ -42,11 +45,17 @@ configData_t cfg; // struct holds current device configuration
|
||||
osjob_t sendjob, initjob; // LMIC
|
||||
|
||||
// Initialize global variables
|
||||
uint16_t macnum = 0, blenum = 0, salt;
|
||||
uint16_t macnum = 0, salt;
|
||||
uint64_t uptimecounter = 0;
|
||||
bool joinstate = false;
|
||||
|
||||
std::set<uint16_t> macs; // associative container holds filtered MAC adresses
|
||||
std::set<uint16_t> macs; // associative container holds filtered total unique MAC adress hashes (Wifi + BLE)
|
||||
std::set<uint16_t> wifis; // associative container holds filtered Wifi MAC adress hashes
|
||||
|
||||
#ifdef BLECOUNTER
|
||||
std::set<uint16_t> bles; // associative container holds filtered BLE MAC adresses hashes
|
||||
int scanTime;
|
||||
#endif
|
||||
|
||||
// this variable will be changed in the ISR, and read in main loop
|
||||
static volatile bool ButtonTriggered = false;
|
||||
@ -67,29 +76,19 @@ void eraseConfig(void);
|
||||
void saveConfig(void);
|
||||
void loadConfig(void);
|
||||
|
||||
/* begin LMIC specific parts ------------------------------------------------------------ */
|
||||
#ifdef HAS_LED
|
||||
void set_onboard_led(int st);
|
||||
#endif
|
||||
|
||||
// LMIC enhanced Pin mapping
|
||||
const lmic_pinmap lmic_pins = {
|
||||
.mosi = PIN_SPI_MOSI,
|
||||
.miso = PIN_SPI_MISO,
|
||||
.sck = PIN_SPI_SCK,
|
||||
.nss = PIN_SPI_SS,
|
||||
.rxtx = LMIC_UNUSED_PIN,
|
||||
.rst = RST,
|
||||
.dio = {DIO0, DIO1, DIO2}
|
||||
};
|
||||
/* begin LMIC specific parts ------------------------------------------------------------ */
|
||||
|
||||
// defined in lorawan.cpp
|
||||
void gen_lora_deveui(uint8_t * pdeveui);
|
||||
void RevBytes(unsigned char* b, size_t c);
|
||||
|
||||
#ifdef VERBOSE
|
||||
void printKeys(void);
|
||||
#endif
|
||||
|
||||
// LMIC functions
|
||||
void onEvent(ev_t ev);
|
||||
void do_send(osjob_t* j);
|
||||
#endif // VERBOSE
|
||||
|
||||
// LMIC callback functions
|
||||
void os_getDevKey (u1_t *buf) {
|
||||
@ -112,6 +111,21 @@ void os_getDevEui (u1_t* buf) {
|
||||
gen_lora_deveui(buf); // generate DEVEUI from device's MAC
|
||||
}
|
||||
|
||||
// LMIC enhanced Pin mapping
|
||||
const lmic_pinmap lmic_pins = {
|
||||
.mosi = PIN_SPI_MOSI,
|
||||
.miso = PIN_SPI_MISO,
|
||||
.sck = PIN_SPI_SCK,
|
||||
.nss = PIN_SPI_SS,
|
||||
.rxtx = LMIC_UNUSED_PIN,
|
||||
.rst = RST,
|
||||
.dio = {DIO0, DIO1, DIO2}
|
||||
};
|
||||
|
||||
// LMIC functions
|
||||
void onEvent(ev_t ev);
|
||||
void do_send(osjob_t* j);
|
||||
|
||||
// LoRaWAN Initjob
|
||||
static void lora_init (osjob_t* j) {
|
||||
// reset MAC state
|
||||
@ -125,8 +139,48 @@ static void lora_init (osjob_t* j) {
|
||||
// LMIC Task
|
||||
void lorawan_loop(void * pvParameters) {
|
||||
configASSERT( ( ( uint32_t ) pvParameters ) == 1 ); // FreeRTOS check
|
||||
|
||||
static bool led_state ;
|
||||
bool new_led_state ;
|
||||
|
||||
while(1) {
|
||||
uint16_t color;
|
||||
os_runloop_once();
|
||||
|
||||
// All follow is Led management
|
||||
// Let join at the begining of if sequence,
|
||||
// is prior to send because joining state send data
|
||||
if ( LMIC.opmode & (OP_JOINING | OP_REJOIN) ) {
|
||||
color = COLOR_YELLOW;
|
||||
// Joining Quick blink 20ms on each 1/5 second
|
||||
new_led_state = ((millis() % 200) < 20) ? HIGH : LOW;
|
||||
|
||||
// Small blink 10ms on each 1/2sec (not when joining)
|
||||
} else if (LMIC.opmode & (OP_TXDATA | OP_TXRXPEND)) {
|
||||
color = COLOR_BLUE;
|
||||
new_led_state = ((millis() % 500) < 20) ? HIGH : LOW;
|
||||
|
||||
// This should not happen so indicate a pb
|
||||
} else if ( LMIC.opmode & (OP_TXDATA | OP_TXRXPEND | OP_JOINING | OP_REJOIN) == 0 ) {
|
||||
color = COLOR_RED;
|
||||
// Heartbeat long blink 200ms on each 2 seconds
|
||||
new_led_state = ((millis() % 2000) < 200) ? HIGH : LOW;
|
||||
} else {
|
||||
rgb_set_color(COLOR_NONE);
|
||||
}
|
||||
// led need to change state ?
|
||||
// avoid digitalWrite() for nothing
|
||||
if (led_state != new_led_state) {
|
||||
if (new_led_state == HIGH) {
|
||||
set_onboard_led(1);
|
||||
rgb_set_color(color);
|
||||
} else {
|
||||
set_onboard_led(0);
|
||||
rgb_set_color(COLOR_NONE);
|
||||
}
|
||||
led_state = new_led_state;
|
||||
}
|
||||
|
||||
vTaskDelay(10/portTICK_PERIOD_MS);
|
||||
yield();
|
||||
}
|
||||
@ -159,12 +213,18 @@ void lorawan_loop(void * pvParameters) {
|
||||
void set_onboard_led(int st){
|
||||
#ifdef HAS_LED
|
||||
switch (st) {
|
||||
case 1: digitalWrite(HAS_LED, HIGH); break;
|
||||
case 0: digitalWrite(HAS_LED, LOW); break;
|
||||
#ifdef LED_ACTIVE_LOW
|
||||
case 1: digitalWrite(HAS_LED, LOW); break;
|
||||
case 0: digitalWrite(HAS_LED, HIGH); break;
|
||||
#else
|
||||
case 1: digitalWrite(HAS_LED, HIGH); break;
|
||||
case 0: digitalWrite(HAS_LED, LOW); break;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
#ifdef HAS_BUTTON
|
||||
// Button Handling, board dependent -> perhaps to be moved to hal/<$board.h>
|
||||
// IRAM_ATTR necessary here, see https://github.com/espressif/arduino-esp32/issues/855
|
||||
@ -191,34 +251,48 @@ void wifi_sniffer_loop(void * pvParameters) {
|
||||
|
||||
while (true) {
|
||||
nloop++;
|
||||
vTaskDelay(cfg.wifichancycle*10 / portTICK_PERIOD_MS);
|
||||
vTaskDelay(cfg.wifichancycle*10 / portTICK_PERIOD_MS);
|
||||
yield();
|
||||
wifi_sniffer_set_channel(channel);
|
||||
channel = (channel % WIFI_CHANNEL_MAX) + 1;
|
||||
wifi_sniffer_set_channel(channel);
|
||||
channel = (channel % WIFI_CHANNEL_MAX) + 1;
|
||||
ESP_LOGI(TAG, "Wifi set channel %d", channel);
|
||||
|
||||
u8x8.setCursor(0,5);
|
||||
u8x8.printf(!cfg.rssilimit ? "RLIM: off" : "RLIM: %4i", cfg.rssilimit);
|
||||
u8x8.setCursor(11,5);
|
||||
u8x8.printf("ch:%02i", channel);
|
||||
u8x8.setCursor(0,4);
|
||||
u8x8.printf("MAC#: %-5i", wifis.size());
|
||||
|
||||
// execute BLE count if BLE function is enabled
|
||||
#ifdef BLECOUNTER
|
||||
// Once 2 full Wifi Channels scan, do a BLE scan
|
||||
if (nloop % (WIFI_CHANNEL_MAX*2) == 0 ) {
|
||||
// execute BLE count if BLE function is enabled
|
||||
if (cfg.blescan)
|
||||
BLECount();
|
||||
}
|
||||
#endif
|
||||
|
||||
// duration of one wifi scan loop reached? then send data and begin new scan cycle
|
||||
if( nloop >= ((100 / cfg.wifichancycle) * (cfg.wifiscancycle * 2)) ) {
|
||||
u8x8.setPowerSave(!cfg.screenon); // set display on if enabled
|
||||
nloop = 0; // reset wlan sniffing loop counter
|
||||
|
||||
// execute BLE count if BLE function is enabled
|
||||
#ifdef BLECOUNTER
|
||||
if (cfg.blescan)
|
||||
BLECount();
|
||||
#endif
|
||||
|
||||
// Prepare and execute LoRaWAN data upload
|
||||
u8x8.setCursor(0,4);
|
||||
u8x8.printf("MAC#: %-5i", macnum);
|
||||
do_send(&sendjob); // send payload
|
||||
vTaskDelay(500/portTICK_PERIOD_MS);
|
||||
yield();
|
||||
|
||||
// clear counter if not in cumulative counter mode
|
||||
if (cfg.countermode != 1) {
|
||||
macs.clear(); // clear macs container
|
||||
macs.clear(); // clear all macs container
|
||||
wifis.clear(); // clear Wifi macs couner
|
||||
#ifdef BLECOUNTER
|
||||
bles.clear(); // clear BLE macs counter
|
||||
#endif
|
||||
|
||||
salt = random(65536); // get new 16bit random for salting hashes
|
||||
macnum = 0;
|
||||
u8x8.clearLine(0); u8x8.clearLine(1); // clear Display counter
|
||||
}
|
||||
|
||||
@ -237,8 +311,10 @@ void wifi_sniffer_loop(void * pvParameters) {
|
||||
}
|
||||
|
||||
u8x8.clearLine(6);
|
||||
|
||||
if (cfg.screenon && cfg.screensaver) vTaskDelay(2000/portTICK_PERIOD_MS); // pause for displaying results
|
||||
|
||||
if (cfg.screenon && cfg.screensaver) {
|
||||
vTaskDelay(2000/portTICK_PERIOD_MS); // pause for displaying results
|
||||
}
|
||||
yield();
|
||||
u8x8.setPowerSave(1 && cfg.screensaver); // set display off if screensaver is enabled
|
||||
}
|
||||
@ -336,7 +412,8 @@ void setup() {
|
||||
#endif
|
||||
|
||||
ESP_LOGI(TAG, "Starting %s %s", PROGNAME, PROGVERSION);
|
||||
|
||||
rgb_set_color(COLOR_NONE);
|
||||
|
||||
// system event handler for wifi task, needed for wifi_sniffer_init()
|
||||
esp_event_loop_init(NULL, NULL);
|
||||
|
||||
@ -355,7 +432,7 @@ void setup() {
|
||||
|
||||
// Read settings from NVRAM
|
||||
loadConfig(); // includes initialize if necessary
|
||||
|
||||
|
||||
// initialize hardware
|
||||
#ifdef HAS_LED
|
||||
// initialize LED
|
||||
|
12
src/main.h
12
src/main.h
@ -10,22 +10,26 @@
|
||||
#define BLECOUNTER 1 // comment out if you don't want BLE count
|
||||
|
||||
// BLE scan time
|
||||
#define BLESCANTIME 30 // [seconds]
|
||||
#define BLESCANTIME 15 // [seconds]
|
||||
|
||||
// WiFi Sniffer cycle interval
|
||||
#define SEND_SECS 120 // [seconds/2] -> 240 sec.
|
||||
//#define SEND_SECS 30 // [seconds/2] -> 60 sec.
|
||||
|
||||
// WiFi sniffer config
|
||||
#define WIFI_CHANNEL_MIN 1 // start channel number where scan begings
|
||||
#define WIFI_CHANNEL_MAX 13 // total channel number to scan
|
||||
#define WIFI_MY_COUNTRY "EU" // for Wifi RF settings
|
||||
#define WIFI_CHANNEL_SWITCH_INTERVAL 50 // [seconds/100] -> 0,5 sec.
|
||||
#define WIFI_CHANNEL_SWITCH_INTERVAL 50 // [seconds/100] -> 0,5 sec.
|
||||
|
||||
// Default LoRa Spreadfactor
|
||||
#define LORASFDEFAULT 9 // 7 ... 12
|
||||
#define MAXLORARETRY 500 // maximum count of TX retries if LoRa busy
|
||||
#define RCMDPORT 2 // LoRaWAN Port on which device listenes for remote commands
|
||||
|
||||
// Default RGB LED luminosity (in %)
|
||||
#define RGBLUMINOSITY 50 // 50%
|
||||
|
||||
// LMIC settings
|
||||
// define hardware independent LMIC settings here, settings of standard library in /lmic/config.h will be ignored
|
||||
// define hardware specifics settings in platformio.ini as build_flag for hardware environment
|
||||
@ -99,10 +103,10 @@
|
||||
// implementation is optimized for speed on 32-bit processors using
|
||||
// fairly big lookup tables, but it takes up big amounts of flash on the
|
||||
// AVR architecture.
|
||||
// #define USE_ORIGINAL_AES
|
||||
#define USE_ORIGINAL_AES
|
||||
//
|
||||
// This selects the AES implementation written by Ideetroon for their
|
||||
// own LoRaWAN library. It also uses lookup tables, but smaller
|
||||
// byte-oriented ones, making it use a lot less flash space (but it is
|
||||
// also about twice as slow as the original).
|
||||
#define USE_IDEETRON_AES
|
||||
// #define USE_IDEETRON_AES
|
||||
|
@ -67,8 +67,9 @@ void set_reset(int val) {
|
||||
break;
|
||||
case 1: // reset MAC counter
|
||||
ESP_LOGI(TAG, "Remote command: reset MAC counter");
|
||||
macs.clear(); // clear macs container
|
||||
macnum = 0;
|
||||
macs.clear(); // clear all macs container
|
||||
wifis.clear(); // clear Wifi macs container
|
||||
bles.clear(); // clear BLE macs container
|
||||
salt = random(65536); // get new 16bit random for salting hashes
|
||||
u8x8.clearLine(0); u8x8.clearLine(1); // clear Display counter
|
||||
u8x8.clearLine(5);
|
||||
@ -140,7 +141,7 @@ void set_display(int val) {
|
||||
case 1: cfg.screenon = val; break;
|
||||
default: cfg.screenon = 0; break;
|
||||
}
|
||||
u8x8.setPowerSave(!cfg.screenon); // set display 0=on / 1=off
|
||||
u8x8.setPowerSave(!cfg.screenon); // set display 0=on / 1=off
|
||||
};
|
||||
|
||||
void set_lorasf(int val) {
|
||||
@ -161,8 +162,8 @@ void set_blescan(int val) {
|
||||
ESP_LOGI(TAG, "Remote command: set BLE scan mode to %s", val ? "on" : "off");
|
||||
switch (val) {
|
||||
case 1: cfg.blescan = val; break;
|
||||
default:
|
||||
cfg.blescan = 0;
|
||||
default:
|
||||
cfg.blescan = 0;
|
||||
btStop();
|
||||
u8x8.clearLine(3); // clear BLE results from display
|
||||
break;
|
||||
@ -180,6 +181,12 @@ void set_wifiant(int val) {
|
||||
#endif
|
||||
};
|
||||
|
||||
void set_rgblum(int val) {
|
||||
// Avoid wrong parameters
|
||||
cfg.rgblum = (val>=0 && val<=100) ? (uint8_t) val : RGBLUMINOSITY;
|
||||
ESP_LOGI(TAG, "Remote command: set RGB Led luminosity %d", cfg.rgblum);
|
||||
};
|
||||
|
||||
void set_lorapower(int val) {
|
||||
ESP_LOGI(TAG, "Remote command: set LoRa TXPOWER to %i", val);
|
||||
switch_lora(cfg.lorasf, val);
|
||||
@ -240,13 +247,14 @@ cmd_t table[] = {
|
||||
{0x0c, set_blescancycle, true},
|
||||
{0x0d, set_blescan, true},
|
||||
{0x0e, set_wifiant, true},
|
||||
{0x0f, set_rgblum, true},
|
||||
{0x80, get_config, false},
|
||||
{0x81, get_uptime, false},
|
||||
{0x82, get_cputemp, false}
|
||||
};
|
||||
|
||||
// check and execute remote command
|
||||
void rcommand(int cmd, int arg) {
|
||||
void rcommand(int cmd, int arg) {
|
||||
int i = sizeof(table) / sizeof(table[0]); // number of commands in command table
|
||||
bool store_flag = false;
|
||||
while(i--) {
|
||||
|
87
src/rgb_led.cpp
Normal file
87
src/rgb_led.cpp
Normal file
@ -0,0 +1,87 @@
|
||||
// Basic Config
|
||||
#include "main.h"
|
||||
#include "globals.h"
|
||||
|
||||
#ifdef HAS_RGB_LED
|
||||
|
||||
// RGB Led instance
|
||||
SmartLed rgb_led(LED_WS2812, 1, HAS_RGB_LED);
|
||||
|
||||
// Luminosity from 0 to 100%
|
||||
uint8_t rgb_luminosity = 50 ;
|
||||
|
||||
float rgb_CalcColor(float p, float q, float t)
|
||||
{
|
||||
if (t < 0.0f)
|
||||
t += 1.0f;
|
||||
if (t > 1.0f)
|
||||
t -= 1.0f;
|
||||
|
||||
if (t < 1.0f / 6.0f)
|
||||
return p + (q - p) * 6.0f * t;
|
||||
|
||||
if (t < 0.5f)
|
||||
return q;
|
||||
|
||||
if (t < 2.0f / 3.0f)
|
||||
return p + ((q - p) * (2.0f / 3.0f - t) * 6.0f);
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// Hue, Saturation, Lightness color members
|
||||
// HslColor using H, S, L values (0.0 - 1.0)
|
||||
// L should be limited to between (0.0 - 0.5)
|
||||
// ------------------------------------------------------------------------
|
||||
RGBColor rgb_hsl2rgb(float h, float s, float l)
|
||||
{
|
||||
RGBColor RGB_color;
|
||||
float r;
|
||||
float g;
|
||||
float b;
|
||||
|
||||
if (s == 0.0f || l == 0.0f)
|
||||
{
|
||||
r = g = b = l; // achromatic or black
|
||||
}
|
||||
else
|
||||
{
|
||||
float q = l < 0.5f ? l * (1.0f + s) : l + s - (l * s);
|
||||
float p = 2.0f * l - q;
|
||||
r = rgb_CalcColor(p, q, h + 1.0f / 3.0f);
|
||||
g = rgb_CalcColor(p, q, h);
|
||||
b = rgb_CalcColor(p, q, h - 1.0f / 3.0f);
|
||||
}
|
||||
|
||||
RGB_color.R = (uint8_t)(r * 255.0f);
|
||||
RGB_color.G = (uint8_t)(g * 255.0f);
|
||||
RGB_color.B = (uint8_t)(b * 255.0f);
|
||||
|
||||
return RGB_color;
|
||||
}
|
||||
|
||||
void rgb_set_color(uint16_t hue) {
|
||||
if (hue == COLOR_NONE) {
|
||||
// Off
|
||||
rgb_led[0] = Rgb(0,0,0);
|
||||
} else {
|
||||
// see http://www.workwithcolor.com/blue-color-hue-range-01.htm
|
||||
// H (is color from 0..360) should be between 0.0 and 1.0
|
||||
// S is saturation keep it to 1
|
||||
// L is brightness should be between 0.0 and 0.5
|
||||
// rgb_luminosity is between 0 and 100 (percent)
|
||||
RGBColor target = rgb_hsl2rgb( hue / 360.0f, 1.0f, 0.005f * cfg.rgblum);
|
||||
//uint32_t color = target.R<<16 | target.G<<8 | target.B;
|
||||
rgb_led[0] = Rgb(target.R, target.G, target.B);
|
||||
}
|
||||
// Show
|
||||
rgb_led.show();
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
// No RGB LED empty functions
|
||||
void rgb_set_color(uint16_t hue) {}
|
||||
|
||||
#endif
|
30
src/rgb_led.h
Normal file
30
src/rgb_led.h
Normal file
@ -0,0 +1,30 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
// value for HSL color
|
||||
// see http://www.workwithcolor.com/blue-color-hue-range-01.htm
|
||||
#define COLOR_RED 0
|
||||
#define COLOR_ORANGE 30
|
||||
#define COLOR_ORANGE_YELLOW 45
|
||||
#define COLOR_YELLOW 60
|
||||
#define COLOR_YELLOW_GREEN 90
|
||||
#define COLOR_GREEN 120
|
||||
#define COLOR_GREEN_CYAN 165
|
||||
#define COLOR_CYAN 180
|
||||
#define COLOR_CYAN_BLUE 210
|
||||
#define COLOR_BLUE 240
|
||||
#define COLOR_BLUE_MAGENTA 275
|
||||
#define COLOR_MAGENTA 300
|
||||
#define COLOR_PINK 350
|
||||
#define COLOR_WHITE 360
|
||||
#define COLOR_NONE 999
|
||||
|
||||
struct RGBColor
|
||||
{
|
||||
uint8_t R;
|
||||
uint8_t G;
|
||||
uint8_t B;
|
||||
};
|
||||
|
||||
// Exported Functions
|
||||
void rgb_set_color(uint16_t hue);
|
2870
src/vendor_array.h
2870
src/vendor_array.h
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user