commit 09d8d41d51e8f222efa1281a4f7563a9c0c628f8
parent d111705216ed3edd035a6a31063aee40e87060a4
Author: Tonton <tonterface@proton.me>
Date: Sat, 4 Jul 2026 15:22:50 +0200
add sensor functions
add get average function and make get_interval use average
refactor return types to separate row in function definitions
Diffstat:
4 files changed, 126 insertions(+), 53 deletions(-)
diff --git a/include/sensor.h b/include/sensor.h
@@ -4,5 +4,6 @@
void sensor_init(void);
int sensor_read(int);
int sensor_analyze(void);
+void sensor_set_limit(int, int, int, int);
#endif // !MENU_H
diff --git a/src/display.cpp b/src/display.cpp
@@ -25,7 +25,8 @@ Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, SCREEN_RESET);
/* function declarations */
/* function implementations */
-void dsp_print_result(int res)
+void
+dsp_print_result(int res)
{
display.clearDisplay();
dsp_write("RESULT:", 0, 0);
@@ -34,7 +35,8 @@ void dsp_print_result(int res)
display.display();
}
-void dsp_print_main(void)
+void
+dsp_print_main(void)
{
display.clearDisplay();
dsp_write("1. Analyze", 0, 0);
@@ -43,12 +45,14 @@ void dsp_print_main(void)
display.display();
}
-void dsp_print_gotomain(void)
+void
+dsp_print_gotomain(void)
{
dsp_write("Continue?", 0, SCREEN_ROW * 3);
}
-void dsp_print_menu1(void)
+void
+dsp_print_menu1(void)
{
display.clearDisplay();
dsp_write("Wait for", 0, 0);
@@ -56,19 +60,22 @@ void dsp_print_menu1(void)
}
-void dsp_print_menu2(void)
+void
+dsp_print_menu2(void)
{
display.clearDisplay();
dsp_write("Menu 2", 0, 0);
}
-void dsp_print_menu3(void)
+void
+dsp_print_menu3(void)
{
display.clearDisplay();
dsp_write("Menu 3", 0, 0);
}
-void dsp_init(void)
+void
+dsp_init(void)
{
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println("Allocation failed");
@@ -81,7 +88,8 @@ void dsp_init(void)
display.setTextSize(2);
}
-void dsp_write(char str[], int x, int y)
+void
+dsp_write(char str[], int x, int y)
{
display.setCursor(x, y);
display.print(str);
diff --git a/src/menu.cpp b/src/menu.cpp
@@ -19,23 +19,24 @@ static void menu_item3(void);
static void print_live(void);
/* function implementations */
-static int get_input(void)
+static int
+get_input(void)
{
/* implement handling of physical buttons */
- int input;
+ int input = 0;
while (Serial.available() <= 0) { delay(100); }
- /* always read to not clog buffer */
if (Serial.available() > 0)
input = Serial.parseInt();
return input;
}
-static int goto_main(void)
+static int
+goto_main(void)
{
- char input;
+ char input = 0;
dsp_print_gotomain();
do {
@@ -46,7 +47,8 @@ static int goto_main(void)
menu_main();
}
-static void print_main(void)
+static void
+print_main(void)
{
dsp_print_main();
Serial.print("\e[1;1H\e[2J");
@@ -56,7 +58,8 @@ static void print_main(void)
Serial.print("3. Params\n\r");
}
-static void select_menu_item(int input)
+static void
+select_menu_item(int input)
{
switch (input) {
case 1:
@@ -75,9 +78,10 @@ static void select_menu_item(int input)
}
}
-static void menu_item1(void)
+static void
+menu_item1(void)
{
- int res;
+ int res = 0;
Serial.print("\e[1;1H\e[2J");
dsp_print_menu1();
@@ -87,7 +91,8 @@ static void menu_item1(void)
goto_main();
}
-static void menu_item2(void)
+static void
+menu_item2(void)
{
Serial.print("\e[1;1H\e[2J");
dsp_print_menu2();
@@ -96,7 +101,8 @@ static void menu_item2(void)
goto_main();
}
-static void menu_item3(void)
+static void
+menu_item3(void)
{
Serial.print("\e[1;1H\e[2J");
dsp_print_menu3();
@@ -104,10 +110,12 @@ static void menu_item3(void)
goto_main();
}
-static void print_live(void)
+static void
+print_live(void)
{
- int rx, in;
+ int rx, in = 0;
+ /* implement for loop to print from all sensors */
while (Serial.available() <= 0) {
rx = sensor_read(0);
dsp_print_result(rx);
@@ -124,9 +132,11 @@ static void print_live(void)
Serial.print("\n\r");
}
-void menu_main(void)
+void
+menu_main(void)
{
- int input;
+ int input = 0;
+
print_main();
input = get_input();
select_menu_item(input);
diff --git a/src/sensor.cpp b/src/sensor.cpp
@@ -21,6 +21,12 @@ struct interval {
int upper_limit;
};
+/* function definitions*/
+static int *read_series(int sensor);
+static int find_interval(int *series, int sensor);
+static int in_range(int num, int u_lim, int l_lim);
+static int get_average(int *series);
+
/* variables */
struct interval sensor1_intervals[INTERVAL_NUMBER];
struct interval sensor2_intervals[INTERVAL_NUMBER];
@@ -41,15 +47,14 @@ static int sens_arr[] = {
SENSOR_4
};
-
-/* function definitions*/
-static int *read_series(int sensor);
-static int find_interval(int *series, int sensor);
-
/* function implementations */
-static int *read_series(int sensor)
+
+/* get a series of readings from a sensor */
+static int *
+read_series(int sensor)
{
- int *ser;
+ int *ser = NULL;
+
ser = (int*)malloc(SAMPLE_NUMBER * sizeof(int));
if (ser == NULL) {
@@ -66,7 +71,8 @@ static int *read_series(int sensor)
return ser;
}
-static int in_range(int num, int u_lim, int l_lim)
+static int
+in_range(int num, int u_lim, int l_lim)
{
if (l_lim < num && num < u_lim) {
return 1;
@@ -74,39 +80,79 @@ static int in_range(int num, int u_lim, int l_lim)
return 0;
}
-static int find_interval(int *series, int sensor)
+static int
+get_average(int *series, int size)
+{
+ int avg = 0;
+ int tmp = 0;
+
+ for (int i = 0; i < size; i++) {
+ tmp += series[i];
+ }
+
+ avg = tmp / size;
+
+ Serial.print("Average: ");
+ Serial.print(avg);
+ Serial.print("\n\r");
+ return avg;
+}
+
+/* find which interval of a specific sensor an int is in */
+static int
+find_interval(int in, int sensor)
{
/* only checks a single int currently */
- struct interval *sen;
- int *ser;
- int u_lim, l_lim;
+ /* maybe make this receive an avg of series??*/
+ struct interval *ivl= NULL;
+ int u_lim, l_lim = 0;
- ser = series;
- sen = all_intervals[sensor];
+ ivl = all_intervals[sensor];
for (int i = 0; i < INTERVAL_NUMBER; ++i) {
- l_lim = sen[i].lower_limit;
- u_lim = sen[i].upper_limit;
- if (in_range(ser[0], u_lim, l_lim)) {
- Serial.print("In interval 1\n\r");
+ l_lim = ivl[i].lower_limit;
+ u_lim = ivl[i].upper_limit;
+ if (in_range(in, u_lim, l_lim)) {
+ Serial.print("In interval: ");
} else {
- Serial.print("Not in interval 1\n\r");
+ Serial.print("Not in interval: ");
}
+ Serial.print(i + 1);
+ Serial.print("\n\r");
}
return 0;
}
-int sensor_read(int sensor)
+void
+sensor_init(void)
+{
+ pinMode(SENSOR_1, INPUT);
+ pinMode(SENSOR_2, INPUT);
+ pinMode(SENSOR_3, INPUT);
+ pinMode(SENSOR_4, INPUT);
+
+ /* testing */
+ sensor_set_limit(0, 0, 1500, 1300);
+ // all_intervals[0]->lower_limit = 1300;
+ // all_intervals[0]->upper_limit = 1500;
+}
+
+int
+sensor_read(int sensor)
{
- int rx;
+ int rx = 0;
rx = analogRead(sens_arr[sensor]);
return rx;
}
-int sensor_analyze()
+/* return which item sensors indicate */
+int
+sensor_analyze(void)
{
- int *ser;
- int res;
+ int *ser, res, avg;
+
+ ser = NULL;
+ res = avg = 0;
for (int i = 0; i < SENSOR_NUMBER; ++i) {
ser = read_series(i);
@@ -115,20 +161,28 @@ int sensor_analyze()
res = -1;
goto out_free_ser;
}
- find_interval(ser, i);
+ avg = get_average(ser, SAMPLE_NUMBER);
+ find_interval(avg, i);
}
+
+ /* temp */
res = 1;
out_free_ser:
free(ser);
+ ser = NULL;
return res;
}
-void sensor_init(void)
+void
+sensor_set_limit(int sensor, int interval, int upper, int lower)
{
- pinMode(SENSOR_1, INPUT);
- pinMode(SENSOR_2, INPUT);
- pinMode(SENSOR_3, INPUT);
- pinMode(SENSOR_4, INPUT);
+ struct interval *ivl;
+
+ ivl = all_intervals[sensor];
+
+ ivl[interval].upper_limit = upper;
+ ivl[interval].lower_limit = lower;
+
}