Files
blk_box_control/main/main.cpp
T
2026-07-20 15:48:07 -05:00

156 lines
5.2 KiB
C++

#include "freertos/FreeRTOS.h"
#include <stdio.h>
#include <inttypes.h>
#include "esp_wifi_types_generic.h"
#include "freertos/projdefs.h"
#include "sdkconfig.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"
#include "blk_box.h"
#include "blk_box_drivers/i2c.h"
#include "blk_box_drivers/inputs.hpp"
#include "blk_box_drivers/leds.hpp"
#include "blk_box_drivers/char_lcd.hpp"
#include "blk_box_drivers/ssegs.hpp"
#include "blk_box_drivers/helpers.hpp"
#include "blk_box_drivers/tft.hpp"
#include "blk_box_drivers/bbnow.hpp"
#include <lvgl.h>
#include "esp_log.h"
#include "esp_event.h"
#include "esp_netif.h"
#include "esp_wifi.h"
#include "esp_log.h"
#include "esp_mac.h"
#include "esp_now.h"
#include "esp_crc.h"
#include "nvs_flash.h"
const static char TAG[] = "main";
extern "C" void app_main(void) {
BlkBoxInitConfig blk_box_cfg = {};
init_blk_box(blk_box_cfg);
LCDController::set_backlight(true);
lcd_do_splash();
lvgl_lock(portMAX_DELAY);
// Get the default screen
lv_obj_t * scr = lv_scr_act();
// Create a title label
lv_obj_t * title = lv_label_create(scr);
lv_label_set_text(title, "Display Test");
lv_obj_align(title, LV_ALIGN_TOP_MID, 0, 10);
lv_obj_set_style_text_font(title, &lv_font_montserrat_24, 0);
// Create a status label
lv_obj_t * status = lv_label_create(scr);
lv_label_set_text(status, "Testing display...");
lv_obj_align(status, LV_ALIGN_CENTER, 0, -20);
// Create a progress bar
lv_obj_t * bar = lv_bar_create(scr);
lv_obj_set_size(bar, 200, 20);
lv_obj_align(bar, LV_ALIGN_CENTER, 0, 30);
lv_bar_set_value(bar, 50, LV_ANIM_OFF);
// Create a button with callback
lv_obj_t * btn = lv_btn_create(scr);
lv_obj_set_size(btn, 100, 40);
lv_obj_align(btn, LV_ALIGN_BOTTOM_MID, 0, -20);
lv_obj_t * btn_label = lv_label_create(btn);
lv_label_set_text(btn_label, "Test");
lv_obj_center(btn_label);
// Create a color test area
lv_obj_t * color_test = lv_obj_create(scr);
lv_obj_set_size(color_test, 80, 60);
lv_obj_align(color_test, LV_ALIGN_BOTTOM_LEFT, 10, -20);
lv_obj_set_style_bg_color(color_test, lv_color_hex(0xFF0000), 0); // Red
lvgl_unlock();
LCDController::set_resting_cursor_mode(CursorMode::Show);
LCDController::set_resting_cursor_pos(0, 0);
SSegController::enable_game_timer();
SSegController::enable_module_timer();
// uint8_t mac[6];
// ESP_ERROR_CHECK(esp_wifi_get_mac(WIFI_IF_STA, mac));
// ESP_LOGI(TAG, "My MAC: %02X:%02X:%02X:%02X:%02X:%02X",
// mac[0], mac[1], mac[2],
// mac[3], mac[4], mac[5]);
// BBNowPubPacket tens_discovery_packet = BBNowPubPacket::new_discovery(BlkBoxNowPubDiscoveryData {
// .expantion_type = BlkBoxExpantion::TENS,
// });
// while (1) {
// auto buf = tens_discovery_packet.serialize();
// ESP_LOGI(TAG, "sending packet of size %d from main", buf.size());
// ESP_ERROR_CHECK(esp_now_send(BROADCAST_MAC, buf.data(), buf.size()));
// vTaskDelay(pdMS_TO_TICKS(1000));
// }
uint32_t i = 0;
while (1) {
if (InputsController::has_button_press()) {
Button b = InputsController::wait_button_press();
printf("Button pressed: %d\n", raw_value(b));
if (b == Button::GREEN) {
LEDController::set_indicator(static_cast<IndicatorLED>(i + LED_SHAPE_COUNT), LEDColor::GREEN);
LEDController::flush();
} else if (b == Button::YELLOW) {
LEDController::set_indicator(static_cast<IndicatorLED>(i + LED_SHAPE_COUNT), LEDColor::YELLOW);
LEDController::flush();
} else if (b == Button::RED) {
i = (i + 1) % LED_INDICATOR_COUNT;
LCDController::set_resting_cursor_pos(0, i % 20);
} else if (b == Button::BLUE) {
i = (i + LED_INDICATOR_COUNT - 1) % LED_INDICATOR_COUNT;
LCDController::set_resting_cursor_pos(0, i % 20);
}
}
if (InputsController::has_switch_flip()) {
SwitchFlip flip = InputsController::wait_switch_flip();
printf("Switch flipped: %d, new state: %d\n", raw_value(flip.get_switch()), flip.is_up());
if (flip.get_switch() == Switch::S1) {
SSegController::set_game_time(SSegController::get_game_time() + 10000);
}
if (flip.get_switch() == Switch::S2) {
SSegController::set_module_time(SSegController::get_module_time() + 10000);
}
if (flip.get_switch() == Switch::S3) {
SSegController::start_game_timer();
}
if (flip.get_switch() == Switch::S4) {
if (flip.is_up()) {
SSegController::start_module_timer();
} else {
SSegController::stop_module_timer();
}
}
}
if (InputsController::has_keypad_press()) {
KeypadKey k = InputsController::wait_keypad_press();
printf("Keypad key pressed: %c\n", keypad_key_to_char(k));
LEDController::flush();
}
vTaskDelay(10 / portTICK_PERIOD_MS);
}
}