aboutsummaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorRenze Nicolai <renze@rnplus.nl>2022-06-04 02:30:23 +0200
committerRenze Nicolai <renze@rnplus.nl>2022-06-04 02:30:23 +0200
commit3da15dd4edea3e00845ef2083e1fbdc32735705b (patch)
treea7ff165ad2a5a5142935b03e2ead1ab5ed3685b2 /main
parent6eaa8ccd89b6d3803f6158fb6a47d34951b1d61a (diff)
downloadmch2022-3da15dd4edea3e00845ef2083e1fbdc32735705b.tar.gz
mch2022-3da15dd4edea3e00845ef2083e1fbdc32735705b.tar.bz2
mch2022-3da15dd4edea3e00845ef2083e1fbdc32735705b.zip
Add ADC reading
Diffstat (limited to 'main')
-rw-r--r--main/CMakeLists.txt1
-rw-r--r--main/adc_test.c76
-rw-r--r--main/include/adc_test.h9
-rw-r--r--main/menus/dev.c7
-rw-r--r--main/menus/start.c48
5 files changed, 130 insertions, 11 deletions
diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt
index 02468fc..a381bbb 100644
--- a/main/CMakeLists.txt
+++ b/main/CMakeLists.txt
@@ -24,6 +24,7 @@ idf_component_register(
"factory_test.c"
"animation.c"
"button_test.c"
+ "adc_test.c"
INCLUDE_DIRS "."
"include"
"menus"
diff --git a/main/adc_test.c b/main/adc_test.c
new file mode 100644
index 0000000..c5db933
--- /dev/null
+++ b/main/adc_test.c
@@ -0,0 +1,76 @@
+#include <stdio.h>
+#include <sdkconfig.h>
+#include <freertos/FreeRTOS.h>
+#include <freertos/task.h>
+#include <freertos/queue.h>
+#include "ili9341.h"
+#include "pax_gfx.h"
+#include "rp2040.h"
+#include "hardware.h"
+
+void test_adc(xQueueHandle buttonQueue, pax_buf_t* pax_buffer, ILI9341* ili9341) {
+ bool quit = false;
+
+ RP2040* rp2040 = get_rp2040();
+ const pax_font_t* font = pax_get_font("saira regular");
+
+ while (!quit) {
+ bool error = false;
+
+ float vbat = 0;
+ if (rp2040_read_vbat(rp2040, &vbat) != ESP_OK) {
+ error = true;
+ }
+
+ float vusb = 0;
+ if (rp2040_read_vusb(rp2040, &vusb) != ESP_OK) {
+ error = true;
+ }
+
+ /*uint16_t raw_temperature = 0;
+ if (rp2040_read_temp(rp2040, &raw_temperature) != ESP_OK) {
+ error = true;
+ }
+
+ uint8_t charging = 0;
+ if (rp2040_get_charging(rp2040, &charging) != ESP_OK) {
+ error = true;
+ }*/
+
+ //const float conversion_factor = 3.3f / (1 << 12); // 12-bit ADC with 3.3v vref
+ //float vtemperature = raw_temperature * conversion_factor; // Inside of RP2040 chip
+ //float temperature = 27 - (vtemperature - 0.706) / 0.001721; // From https://raspberrypi.github.io/pico-sdk-doxygen/group__hardware__adc.html
+
+
+ pax_noclip(pax_buffer);
+ pax_background(pax_buffer, 0x325aa8);
+ pax_draw_text(pax_buffer, 0xFFFFFFFF, font, 18, 0, 20*0, "Analog inputs");
+ char buffer[64];
+ snprintf(buffer, sizeof(buffer), "Battery voltage %f v", vbat);
+ pax_draw_text(pax_buffer, 0xFFFFFFFF, font, 18, 0, 20*1, buffer);
+ snprintf(buffer, sizeof(buffer), "USB voltage %f v", vusb);
+ pax_draw_text(pax_buffer, 0xFFFFFFFF, font, 18, 0, 20*2, buffer);
+ /*snprintf(buffer, sizeof(buffer), "Temperature %f *c", temperature);
+ pax_draw_text(pax_buffer, 0xFFFFFFFF, font, 18, 0, 20*3, buffer);
+ snprintf(buffer, sizeof(buffer), "Charging %02X", charging);
+ pax_draw_text(pax_buffer, 0xFFFFFFFF, font, 18, 0, 20*4, buffer);*/
+ pax_draw_text(pax_buffer, 0xFFFFFFFF, font, 18, 0, 20*5, (error ? "ERROR" : ""));
+ ili9341_write(ili9341, pax_buffer->buf);
+
+ rp2040_input_message_t buttonMessage = {0};
+ if (xQueueReceive(buttonQueue, &buttonMessage, 250 / portTICK_PERIOD_MS) == pdTRUE) {
+ uint8_t pin = buttonMessage.input;
+ bool value = buttonMessage.state;
+ if (value) {
+ switch(pin) {
+ case RP2040_INPUT_BUTTON_HOME:
+ case RP2040_INPUT_BUTTON_BACK:
+ quit = true;
+ default:
+ break;
+ }
+ }
+ }
+ }
+}
+
diff --git a/main/include/adc_test.h b/main/include/adc_test.h
new file mode 100644
index 0000000..1a6e19d
--- /dev/null
+++ b/main/include/adc_test.h
@@ -0,0 +1,9 @@
+#include <stdio.h>
+#include <sdkconfig.h>
+#include <freertos/FreeRTOS.h>
+#include <freertos/task.h>
+#include <freertos/queue.h>
+#include "ili9341.h"
+#include "pax_gfx.h"
+
+void test_adc(xQueueHandle buttonQueue, pax_buf_t* pax_buffer, ILI9341* ili9341);
diff --git a/main/menus/dev.c b/main/menus/dev.c
index 2db34b2..25e6126 100644
--- a/main/menus/dev.c
+++ b/main/menus/dev.c
@@ -22,6 +22,7 @@
#include "fpga_test.h"
#include "animation.h"
#include "button_test.h"
+#include "adc_test.h"
extern const uint8_t dev_png_start[] asm("_binary_dev_png_start");
extern const uint8_t dev_png_end[] asm("_binary_dev_png_end");
@@ -34,7 +35,8 @@ typedef enum action {
ACTION_FILE_BROWSER,
ACTION_FILE_BROWSER_INT,
ACTION_ANIMATION,
- ACTION_BUTTON_TEST
+ ACTION_BUTTON_TEST,
+ ACTION_ADC_TEST
} menu_dev_action_t;
void render_dev_help(pax_buf_t* pax_buffer) {
@@ -68,6 +70,7 @@ void menu_dev(xQueueHandle buttonQueue, pax_buf_t* pax_buffer, ILI9341* ili9341)
menu_insert_item(menu, "File browser (internal)", NULL, (void*) ACTION_FILE_BROWSER_INT, -1);
menu_insert_item(menu, "Animation", NULL, (void*) ACTION_ANIMATION, -1);
menu_insert_item(menu, "Button test", NULL, (void*) ACTION_BUTTON_TEST, -1);
+ menu_insert_item(menu, "Analog inputs", NULL, (void*) ACTION_ADC_TEST, -1);
bool render = true;
menu_dev_action_t action = ACTION_NONE;
@@ -130,6 +133,8 @@ void menu_dev(xQueueHandle buttonQueue, pax_buf_t* pax_buffer, ILI9341* ili9341)
display_animation(pax_buffer, ili9341);
} else if (action == ACTION_BUTTON_TEST) {
test_buttons(buttonQueue, pax_buffer, ili9341);
+ } else if (action == ACTION_ADC_TEST) {
+ test_adc(buttonQueue, pax_buffer, ili9341);
} else if (action == ACTION_BACK) {
break;
}
diff --git a/main/menus/start.c b/main/menus/start.c
index 4f1854b..fa6e54a 100644
--- a/main/menus/start.c
+++ b/main/menus/start.c
@@ -17,6 +17,8 @@
#include "settings.h"
#include "dev.h"
#include "bootscreen.h"
+#include "hardware.h"
+#include "math.h"
extern const uint8_t home_png_start[] asm("_binary_home_png_start");
extern const uint8_t home_png_end[] asm("_binary_home_png_end");
@@ -41,17 +43,13 @@ typedef enum action {
ACTION_SETTINGS
} menu_start_action_t;
-void render_start_help(pax_buf_t* pax_buffer, const char* version) {
+void render_start_help(pax_buf_t* pax_buffer, const char* text) {
const pax_font_t *font = pax_get_font("saira regular");
pax_background(pax_buffer, 0xFFFFFF);
pax_noclip(pax_buffer);
pax_draw_text(pax_buffer, 0xFF491d88, font, 18, 5, 240 - 18, "[A] accept");
-
- char version_text[64];
- snprintf(version_text, sizeof(version_text), "v%s", version);
-
- pax_vec1_t version_size = pax_text_size(font, 18, version_text);
- pax_draw_text(pax_buffer, 0xFF491d88, font, 18, 320 - 5 - version_size.x, 240 - 18, version_text);
+ pax_vec1_t version_size = pax_text_size(font, 18, text);
+ pax_draw_text(pax_buffer, 0xFF491d88, font, 18, 320 - 5 - version_size.x, 240 - 18, text);
}
void menu_start(xQueueHandle buttonQueue, pax_buf_t* pax_buffer, ILI9341* ili9341, const char* version) {
@@ -88,12 +86,21 @@ void menu_start(xQueueHandle buttonQueue, pax_buf_t* pax_buffer, ILI9341* ili934
bool render = true;
menu_start_action_t action = ACTION_NONE;
+
+ uint8_t analogReadTimer = 0;
+ float battery_voltage = 0;
+ float usb_voltage = 0;
+ //uint8_t rp2040_usb = 0;
- render_start_help(pax_buffer, version);
+ // Calculated:
+ uint8_t battery_percent = 0;
+ bool battery_charging = false;
+
+ RP2040* rp2040 = get_rp2040();
while (1) {
rp2040_input_message_t buttonMessage = {0};
- if (xQueueReceive(buttonQueue, &buttonMessage, 16 / portTICK_PERIOD_MS) == pdTRUE) {
+ if (xQueueReceive(buttonQueue, &buttonMessage, 100 / portTICK_PERIOD_MS) == pdTRUE) {
uint8_t pin = buttonMessage.input;
bool value = buttonMessage.state;
switch(pin) {
@@ -122,7 +129,29 @@ void menu_start(xQueueHandle buttonQueue, pax_buf_t* pax_buffer, ILI9341* ili934
}
}
+ if (analogReadTimer > 0) {
+ analogReadTimer--;
+ } else {
+ analogReadTimer = 10; // No need to update these values really quickly
+ if (rp2040_read_vbat(rp2040, &battery_voltage) != ESP_OK) {
+ battery_voltage = 0;
+ }
+ if (rp2040_read_vusb(rp2040, &usb_voltage) != ESP_OK) {
+ usb_voltage = 0;
+ }
+
+ battery_percent = ((battery_voltage - 3.7) * 100) / (4.1 - 3.7);
+ if (battery_percent > 100) battery_percent = 100;
+
+ battery_charging = (usb_voltage > 4.0) && (battery_percent < 100);
+
+ render = true;
+ }
+
if (render) {
+ char textBuffer[64];
+ snprintf(textBuffer, sizeof(textBuffer), "B%1.1fv U%1.1fv %03u%%%c v%s", battery_voltage, usb_voltage, battery_percent, battery_charging ? '+' : ' ', version);
+ render_start_help(pax_buffer, textBuffer);
menu_render(pax_buffer, menu, 0, 0, 320, 220, 0xFF491d88);
ili9341_write(ili9341, pax_buffer->buf);
render = false;
@@ -141,7 +170,6 @@ void menu_start(xQueueHandle buttonQueue, pax_buf_t* pax_buffer, ILI9341* ili934
}
action = ACTION_NONE;
render = true;
- render_start_help(pax_buffer, version);
}
}