Krolyxon
Commit bd12e09

Branches

Tags

Refs →

orion-rffirmwaredevice_check.cpp

193 lines · 3.5 KB · C++

1#include <Arduino.h>
2#include <SPI.h>
3#include <Wire.h>
4#include <RF24.h>
5#include "ELECHOUSE_CC1101_SRC_DRV.h"
6
7#include "display.h"
8#include "buttons.h"
9#include "config.h"
10
11// ===== EXTERNALS =====
12extern RF24 radio1;
13extern RF24 radio2;
14extern SPIClass *RADIO_SPI;
15extern U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2;
16
17// ===== RESULTS =====
18struct DeviceStatus {
19 bool nrf1 = false;
20 bool nrf2 = false;
21 bool cc1101_1 = false;
22 bool cc1101_2 = false;
23 bool oled = true;
24 bool buttons = false;
25};
26
27// ===== NRF CHECK =====
28bool checkNRF(RF24 &radio)
29{
30 // safer: only init if needed
31 if (!radio.isChipConnected()) {
32 if (!radio.begin(RADIO_SPI))
33 return false;
34 }
35
36 return radio.isChipConnected();
37}
38
39// ===== CC1101 CHECK =====
40bool checkCC1101(uint8_t csPin)
41{
42 ELECHOUSE_cc1101.setSpiPin(
43 cc1101_SCK,
44 cc1101_MISO,
45 cc1101_MOSI,
46 csPin
47 );
48
49 delay(5);
50
51 return ELECHOUSE_cc1101.getCC1101();
52}
53
54// ===== BUTTON CHECK =====
55bool checkButtons()
56{
57 u8g2.clearBuffer();
58 u8g2.setFont(u8g2_font_6x10_tr);
59 u8g2.drawStr(0, 20, "Press any button...");
60 u8g2.sendBuffer();
61
62 unsigned long start = millis();
63
64 while (millis() - start < 2000)
65 {
66 if (!digitalRead(BTN_UP) ||
67 !digitalRead(BTN_DOWN) ||
68 !digitalRead(BTN_SELECT) ||
69 !digitalRead(BTN_BACK) ||
70 !digitalRead(BTN_RIGHT) ||
71 !digitalRead(BTN_LEFT))
72 {
73 return true;
74 }
75 }
76
77 return false;
78}
79
80// ===== DRAW =====
81#define MAX_ITEMS 6
82#define VISIBLE_ROWS 5
83
84const char* labels[MAX_ITEMS] = {
85 "NRF1",
86 "NRF2",
87 "CC1101-1",
88 "CC1101-2",
89 "BUTTONS",
90 "OLED"
91};
92
93bool values[MAX_ITEMS];
94
95int selectedIndex = 0;
96int offset = 0;
97
98void drawStatus(DeviceStatus &s)
99{
100 values[0] = s.nrf1;
101 values[1] = s.nrf2;
102 values[2] = s.cc1101_1;
103 values[3] = s.cc1101_2;
104 values[4] = s.buttons;
105 values[5] = s.oled;
106
107
108 u8g2.clearBuffer();
109 u8g2.setFont(u8g2_font_6x10_tr);
110
111 // scrolling logic
112 if (selectedIndex < offset)
113 offset = selectedIndex;
114
115 if (selectedIndex >= offset + VISIBLE_ROWS)
116 offset = selectedIndex - VISIBLE_ROWS + 1;
117
118 for (int i = 0; i < VISIBLE_ROWS; i++)
119 {
120 int item = offset + i;
121 if (item >= MAX_ITEMS) break;
122
123 int y = 12 + i * 10;
124
125 if (item == selectedIndex)
126 {
127 u8g2.drawBox(0, y - 9, 128, 10);
128 u8g2.setDrawColor(0);
129 }
130
131 u8g2.drawStr(2, y, labels[item]);
132
133 if (values[item])
134 u8g2.drawStr(80, y, "OK");
135 else
136 u8g2.drawStr(80, y, "FAIL");
137
138 if (item == selectedIndex)
139 u8g2.setDrawColor(1);
140 }
141
142 u8g2.sendBuffer();
143}
144
145// ===== MAIN =====
146void device_check_run()
147{
148 DeviceStatus status;
149
150 Serial.println("Running device diagnostics...");
151
152 // NRF
153 status.nrf1 = checkNRF(radio1);
154 status.nrf2 = checkNRF(radio2);
155
156 // CC1101
157 status.cc1101_1 = checkCC1101(CC1101_CS);
158 status.cc1101_2 = checkCC1101(CC1101_2_CS);
159
160 // Buttons
161 status.buttons = checkButtons();
162
163 drawStatus(status);
164
165 Serial.println("Diagnostics complete");
166
167 while (1)
168{
169 drawStatus(status);
170
171 if (btnUp())
172 {
173 selectedIndex--;
174 if (selectedIndex < 0) selectedIndex = MAX_ITEMS - 1;
175 delay(150);
176 }
177
178 if (btnDown())
179 {
180 selectedIndex++;
181 if (selectedIndex >= MAX_ITEMS) selectedIndex = 0;
182 delay(150);
183 }
184
185 if (btnBack())
186 {
187 delay(150);
188 break;
189 }
190}}
191
192
193