summaryrefslogtreecommitdiff
path: root/src/utils
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils')
-rw-r--r--src/utils/buttons.cpp20
-rw-r--r--src/utils/buttons.h10
-rw-r--r--src/utils/device_check.cpp207
-rw-r--r--src/utils/device_check.h3
-rw-r--r--src/utils/sysinfo.cpp87
-rw-r--r--src/utils/sysinfo.h3
6 files changed, 330 insertions, 0 deletions
diff --git a/src/utils/buttons.cpp b/src/utils/buttons.cpp
new file mode 100644
index 0000000..d3d1020
--- /dev/null
+++ b/src/utils/buttons.cpp
@@ -0,0 +1,20 @@
+#include "buttons.h"
+#include <Arduino.h>
+#include "../config.h"
+
+void buttonsInit()
+{
+ pinMode(BTN_UP, INPUT_PULLUP);
+ pinMode(BTN_DOWN, INPUT_PULLUP);
+ pinMode(BTN_SELECT, INPUT_PULLUP);
+ pinMode(BTN_BACK, INPUT_PULLUP);
+ pinMode(BTN_RIGHT, INPUT_PULLUP);
+ pinMode(BTN_LEFT, INPUT_PULLUP);
+}
+
+bool btnUp() { return !digitalRead(BTN_UP); }
+bool btnDown() { return !digitalRead(BTN_DOWN); }
+bool btnSelect() { return !digitalRead(BTN_SELECT); }
+bool btnBack() { return !digitalRead(BTN_BACK); }
+bool btnRight() { return !digitalRead(BTN_RIGHT); }
+bool btnLeft() { return !digitalRead(BTN_LEFT); }
diff --git a/src/utils/buttons.h b/src/utils/buttons.h
new file mode 100644
index 0000000..cfa9fa3
--- /dev/null
+++ b/src/utils/buttons.h
@@ -0,0 +1,10 @@
+#pragma once
+
+void buttonsInit();
+
+bool btnUp();
+bool btnDown();
+bool btnSelect();
+bool btnBack();
+bool btnRight();
+bool btnLeft();
diff --git a/src/utils/device_check.cpp b/src/utils/device_check.cpp
new file mode 100644
index 0000000..5f63ffe
--- /dev/null
+++ b/src/utils/device_check.cpp
@@ -0,0 +1,207 @@
+#include <Arduino.h>
+#include <SPI.h>
+#include <Wire.h>
+#include <RF24.h>
+#include "../libs/ELECHOUSE_CC1101_SRC_DRV.h"
+
+#include "../ui/display.h"
+#include "buttons.h"
+#include "../config.h"
+
+// ===== EXTERNALS =====
+extern RF24 radio1;
+extern RF24 radio2;
+extern SPIClass *RADIO_SPI;
+extern U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2;
+
+// ===== RESULTS =====
+struct DeviceStatus {
+ bool nrf1 = false;
+ bool nrf2 = false;
+ bool cc1101_1 = false;
+ bool cc1101_2 = false;
+ bool oled = true;
+ bool buttons = false;
+};
+
+// ===== NRF CHECK =====
+//bool checkNRF(RF24 &radio)
+//{
+// // safer: only init if needed
+// if (!radio.isChipConnected()) {
+// if (!radio.begin(RADIO_SPI))
+// return false;
+// }
+//
+// return radio.isChipConnected();
+//}
+
+bool checkNRF(RF24 &radio)
+{
+ radio.powerDown();
+ delay(5);
+
+ if (!radio.begin(RADIO_SPI))
+ return false;
+
+ delay(5);
+
+ return radio.isChipConnected();
+}
+
+// ===== CC1101 CHECK =====
+bool checkCC1101(uint8_t csPin)
+{
+ ELECHOUSE_cc1101.setSpiPin(
+ cc1101_SCK,
+ cc1101_MISO,
+ cc1101_MOSI,
+ csPin
+ );
+
+ delay(5);
+
+ return ELECHOUSE_cc1101.getCC1101();
+}
+
+// ===== BUTTON CHECK =====
+bool checkButtons()
+{
+ u8g2.clearBuffer();
+ u8g2.setFont(u8g2_font_6x10_tr);
+ u8g2.drawStr(0, 20, "Press any button...");
+ u8g2.sendBuffer();
+
+ unsigned long start = millis();
+
+ while (millis() - start < 2000)
+ {
+ if (!digitalRead(BTN_UP) ||
+ !digitalRead(BTN_DOWN) ||
+ !digitalRead(BTN_SELECT) ||
+ !digitalRead(BTN_BACK) ||
+ !digitalRead(BTN_RIGHT) ||
+ !digitalRead(BTN_LEFT))
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// ===== DRAW =====
+#define MAX_ITEMS 6
+#define VISIBLE_ROWS 5
+
+const char* labels[MAX_ITEMS] = {
+ "NRF1",
+ "NRF2",
+ "CC1101-1",
+ "CC1101-2",
+ "BUTTONS",
+ "OLED"
+};
+
+bool values[MAX_ITEMS];
+
+int selectedIndex = 0;
+int offset = 0;
+
+void drawStatus(DeviceStatus &s)
+{
+ values[0] = s.nrf1;
+ values[1] = s.nrf2;
+ values[2] = s.cc1101_1;
+ values[3] = s.cc1101_2;
+ values[4] = s.buttons;
+ values[5] = s.oled;
+
+
+ u8g2.clearBuffer();
+ u8g2.setFont(u8g2_font_6x10_tr);
+
+ // scrolling logic
+ if (selectedIndex < offset)
+ offset = selectedIndex;
+
+ if (selectedIndex >= offset + VISIBLE_ROWS)
+ offset = selectedIndex - VISIBLE_ROWS + 1;
+
+ for (int i = 0; i < VISIBLE_ROWS; i++)
+ {
+ int item = offset + i;
+ if (item >= MAX_ITEMS) break;
+
+ int y = 12 + i * 10;
+
+ if (item == selectedIndex)
+ {
+ u8g2.drawBox(0, y - 9, 128, 10);
+ u8g2.setDrawColor(0);
+ }
+
+ u8g2.drawStr(2, y, labels[item]);
+
+ if (values[item])
+ u8g2.drawStr(80, y, "OK");
+ else
+ u8g2.drawStr(80, y, "FAIL");
+
+ if (item == selectedIndex)
+ u8g2.setDrawColor(1);
+ }
+
+ u8g2.sendBuffer();
+}
+
+// ===== MAIN =====
+void device_check_run()
+{
+ DeviceStatus status;
+
+ Serial.println("Running device diagnostics...");
+
+ // NRF
+ status.nrf1 = checkNRF(radio1);
+ status.nrf2 = checkNRF(radio2);
+
+ // CC1101
+ status.cc1101_1 = checkCC1101(CC1101_CS);
+ status.cc1101_2 = checkCC1101(CC1101_2_CS);
+ //status.cc1101_1 = status.cc1101_2 = false;
+
+ // Buttons
+ status.buttons = checkButtons();
+
+ drawStatus(status);
+
+ Serial.println("Diagnostics complete");
+
+ while (1)
+{
+ drawStatus(status);
+
+ if (btnUp())
+ {
+ selectedIndex--;
+ if (selectedIndex < 0) selectedIndex = MAX_ITEMS - 1;
+ delay(150);
+ }
+
+ if (btnDown())
+ {
+ selectedIndex++;
+ if (selectedIndex >= MAX_ITEMS) selectedIndex = 0;
+ delay(150);
+ }
+
+ if (btnBack())
+ {
+ delay(150);
+ break;
+ }
+}}
+
+
+
diff --git a/src/utils/device_check.h b/src/utils/device_check.h
new file mode 100644
index 0000000..3d6b250
--- /dev/null
+++ b/src/utils/device_check.h
@@ -0,0 +1,3 @@
+#pragma once
+
+void device_check_run();
diff --git a/src/utils/sysinfo.cpp b/src/utils/sysinfo.cpp
new file mode 100644
index 0000000..aad170d
--- /dev/null
+++ b/src/utils/sysinfo.cpp
@@ -0,0 +1,87 @@
+#include <Arduino.h>
+#include "../ui/display.h"
+#include "buttons.h"
+#include <esp_chip_info.h>
+#include <esp_heap_caps.h>
+
+void runSystemInfoFeature()
+{
+ esp_chip_info_t chip_info;
+
+ esp_chip_info(&chip_info);
+
+ while (true)
+ {
+ //u8g2.clearBuffer();
+
+ //char buf[32];
+
+ //sprintf(buf, "Cores: %d", chip_info.cores);
+ //u8g2.drawStr(0, 14, buf);
+
+ //sprintf(buf, "Heap: %d",
+ // heap_caps_get_free_size(MALLOC_CAP_DEFAULT));
+ //u8g2.drawStr(0, 28, buf);
+
+
+ //u8g2.drawStr(0, 60, "BACK to exit");
+
+ // Get RAM info
+ size_t freeHeap = heap_caps_get_free_size(MALLOC_CAP_DEFAULT);
+ size_t totalHeap = heap_caps_get_total_size(MALLOC_CAP_DEFAULT);
+ int ramUsage = 100 - ((freeHeap * 100) / totalHeap);
+
+ // Get Flash info
+ //uint32_t flashSize = spi_flash_get_chip_size();
+ uint32_t flashSize = ESP.getFlashChipSize();
+ uint32_t flashUsed = ESP.getSketchSize();
+ int flashUsage = (flashUsed * 100) / flashSize;
+
+ // Temperature (approx)
+ uint8_t temperature = temperatureRead();
+
+ // Chip info
+ esp_chip_info_t chip_info;
+ esp_chip_info(&chip_info);
+
+ u8g2.clearBuffer();
+ u8g2.setFont(u8g2_font_6x12_tr);
+
+ char buf[32];
+
+ // Box 1 - RAM
+ u8g2.drawFrame(0, 0, 128, 12);
+ sprintf(buf, "RAM: %d%% used", ramUsage);
+ u8g2.drawStr(4, 9, buf);
+
+ // Box 2 - Flash
+ u8g2.drawFrame(0, 12, 128, 12);
+ sprintf(buf, "Flash: %d%% used", flashUsage);
+ u8g2.drawStr(4, 21, buf);
+
+ // Box 3 - Temp (FULL WIDTH now)
+ u8g2.drawFrame(0, 24, 128, 12);
+ sprintf(buf, "Temp: %d C", temperature);
+ u8g2.drawStr(4, 33, buf);
+
+ // Box 4 - Chip info (FULL WIDTH)
+ u8g2.drawFrame(0, 36, 128, 12);
+ sprintf(buf, "Cores: %d Rev: %d", chip_info.cores, chip_info.revision);
+ u8g2.drawStr(4, 45, buf);
+
+ // Box 5 - PSRAM (KB)
+ u8g2.drawFrame(0, 48, 128, 12);
+ sprintf(buf, "PSRAM: %lu KB", heap_caps_get_free_size(MALLOC_CAP_SPIRAM) / 1024);
+ u8g2.drawStr(4, 57, buf);
+
+ u8g2.sendBuffer();
+
+ if (btnBack())
+ {
+ delay(200);
+ return;
+ }
+
+ delay(100);
+ }
+}
diff --git a/src/utils/sysinfo.h b/src/utils/sysinfo.h
new file mode 100644
index 0000000..8a4f176
--- /dev/null
+++ b/src/utils/sysinfo.h
@@ -0,0 +1,3 @@
+#pragma once
+
+void runSystemInfoFeature();