diff --git a/BadgeBLE.md b/BadgeBLE.md index e250fa4..de5ad68 100644 --- a/BadgeBLE.md +++ b/BadgeBLE.md @@ -75,9 +75,11 @@ The "mode" bytes are a combination of two 4 bit values. The high nibble describe - Service-UUID: 0xF055 (128-bit equivalent: 0000f055-0000-1000-8000-00805f9b34fb) +- Characteristic: 0xF057 (128-bit equivalent: + 0000f057-0000-1000-8000-00805f9b34fb) + - Write property: to receive controls and configs - Characteristic: 0xF056 (128-bit equivalent: 0000f056-0000-1000-8000-00805f9b34fb) - - Write property: to receive controls and configs - Notify property: to return error codes - Read property: to be implemented @@ -98,6 +100,7 @@ Supported functions/commands: - flash_splash_screen - save_cfg - load_fallback_cfg +- Miscellaneous configs The client app should enable notifications for the characteristic to receive the returned error code (e.g., by using setCharacteristicNotification() on Android). @@ -213,3 +216,18 @@ Function/Command code: `0x07`. Returns: - Success: `0x00`. + +##### Miscellaneous configs + +Function/Command code: `0x08`. + +Parameters: + +- Adjust splash screen speed: `[0x00, speed_ms]`. `speed_ms` (16-bit) is the delay of each frame in milliseconds and must not be lower than 10 ms. +- Adjust LED brightness: `[0x01, brightness_level]`. `brightness_level` has a value from 0 to 3. + +Returns: + +- Parameters out of range: `0xff`. +- `speed_ms` or `brightness_level` is out of allowed range: `0x02`. +- Success: `0x00`. diff --git a/src/config.c b/src/config.c index 44c7c7c..ac91b85 100644 --- a/src/config.c +++ b/src/config.c @@ -19,7 +19,7 @@ badge_cfg_t badge_cfg; /* In case of first time firmware upgrading */ void cfg_fallback() { - badge_cfg.ble_always_on = 1; + badge_cfg.ble_always_on = 0; memcpy(badge_cfg.ble_devname, "LED Badge Magic\0\0\0\0", 20); /* OEM app testing: */ // memcpy(badge_cfg.ble_devname, "LSLED\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 20); diff --git a/src/config.h b/src/config.h index b6ce545..64a4755 100644 --- a/src/config.h +++ b/src/config.h @@ -6,6 +6,8 @@ #include "xbm.h" #include "leddrv.h" +#define SPLASH_MIN_SPEED_T (10) // ms + #define SPLASH_MAX_WIDTH (48) // pixels #define SPLASH_MAX_HEIGHT (44) // pixels #define SPLASH_MAX_SIZE (ALIGN_1BYTE(SPLASH_MAX_WIDTH) * SPLASH_MAX_HEIGHT) diff --git a/src/leddrv.h b/src/leddrv.h index b9be6ba..2e03c8d 100644 --- a/src/leddrv.h +++ b/src/leddrv.h @@ -6,6 +6,8 @@ #define LED_COLS 44 #define LED_ROWS 11 +#define BRIGHTNESS_LEVELS (4) + void led_init(); void leds_releaseall(); void led_write2dcol(int dcol, uint16_t col1_val, uint16_t col2_val); diff --git a/src/main.c b/src/main.c index 82a2a95..33a1a34 100644 --- a/src/main.c +++ b/src/main.c @@ -33,8 +33,6 @@ enum MODES { MODES_COUNT, }; -#define BRIGHTNESS_LEVELS (4) - #define ANI_BASE_SPEED_T (200000) // uS #define ANI_MARQUE_SPEED_T (100000) // uS #define ANI_FLASH_SPEED_T (500000) // uS @@ -52,12 +50,12 @@ enum MODES { static tmosTaskID common_taskid = INVALID_TASK_ID ; volatile uint16_t fb[LED_COLS] = {0}; -volatile int mode, is_play_sequentially = 1, brightness = 0; +volatile int mode, is_play_sequentially = 1; __HIGH_CODE static void change_brightness() { - NEXT_STATE(brightness, 0, BRIGHTNESS_LEVELS); + NEXT_STATE(badge_cfg.led_brightness, 0, BRIGHTNESS_LEVELS); } static void mode_setup_download(); @@ -471,7 +469,7 @@ void TMR0_IRQHandler(void) i = 0; led_write2dcol(i >> 2, fb[i >> 1], fb[(i >> 1) + 1]); } - else if (state > (brightness&3)) + else if (state > (badge_cfg.led_brightness&3)) leds_releaseall(); TMR0_ClearITFlag(TMR0_3_IT_CYC_END); diff --git a/src/ngctrl.c b/src/ngctrl.c index 88eb7ee..5e78cbb 100644 --- a/src/ngctrl.c +++ b/src/ngctrl.c @@ -7,6 +7,7 @@ #include "power.h" #include "debug.h" #include "config.h" +#include "leddrv.h" // TODO: Some of configs can be added, just listing: // - Remote brighness adjusting @@ -127,6 +128,50 @@ uint8_t load_fallback_cfg(uint8_t *val, uint16_t len) cfg_fallback(&badge_cfg); return 0; } + +static uint8_t cfg_splash_speed(uint8_t *val, uint16_t len) +{ + PRINT(__func__); + PRINT("\n"); + + uint16_t ms = *((uint16_t *)val); + if (ms < SPLASH_MIN_SPEED_T) + return -2; + + badge_cfg.splash_speedT = ms; + return 0; +} + +static uint8_t cfg_led_brightness(uint8_t *val, uint16_t len) +{ + PRINT(__func__); + PRINT("\n"); + + uint8_t lvl = val[0]; + if (lvl >= BRIGHTNESS_LEVELS) + return -2; + + badge_cfg.led_brightness = lvl; + return 0; +} + +uint8_t misc(uint8_t *val, uint16_t len) +{ + PRINT(__func__); + PRINT("\n"); + + const uint8_t (*misc_cmd[])(uint8_t *, uint16_t) = { + cfg_splash_speed, + cfg_led_brightness, + }; + + uint8_t fn = val[0]; + if (fn >= (sizeof(misc_cmd) / sizeof(misc_cmd[0]))) + return -1; + + return misc_cmd[fn](&val[1], len - 1); +} + /* TODO: add a way to read configs */ const uint8_t (*cmd_lut[])(uint8_t *val, uint16_t len) = { next_packet, // Unsure if we need this @@ -137,6 +182,7 @@ const uint8_t (*cmd_lut[])(uint8_t *val, uint16_t len) = { flash_splash_screen, save_cfg, load_fallback_cfg, + misc, }; #define CMD_LUT_LEN (sizeof(cmd_lut) / sizeof(cmd_lut[0]))