feat(MP/daemon): display on oled
This commit is contained in:
@@ -1,28 +1,84 @@
|
|||||||
//
|
|
||||||
// Created by fastium on 6/5/26.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "oled.h"
|
#include "oled.h"
|
||||||
|
|
||||||
#include "ssd1306.h"
|
#include "ssd1306.h"
|
||||||
|
|
||||||
int display()
|
#include "oled.h"
|
||||||
{
|
#include "ssd1306.h"
|
||||||
ssd1306_init();
|
#include <pthread.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
ssd1306_set_position (0,0);
|
/* Internal reference to the registered callbacks */
|
||||||
|
static struct oled_callbacks_t* oled_cbs = NULL;
|
||||||
|
|
||||||
|
/* Thread handle for the background update loop */
|
||||||
|
static pthread_t oled_thread;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* display() - Formats and sends dynamic data to the OLED screen.
|
||||||
|
*
|
||||||
|
* This function uses snprintf to convert numerical values into strings
|
||||||
|
* before sending them to the SSD1306 controller.
|
||||||
|
*/
|
||||||
|
static void display(int mode, float temp, uint32_t period_ms) {
|
||||||
|
char buffer[20];
|
||||||
|
|
||||||
|
/* Static header rows */
|
||||||
|
ssd1306_set_position(0, 0);
|
||||||
ssd1306_puts("CSEL1a - SP.07");
|
ssd1306_puts("CSEL1a - SP.07");
|
||||||
ssd1306_set_position (0,1);
|
ssd1306_set_position(0, 1);
|
||||||
ssd1306_puts(" Demo - SW");
|
ssd1306_puts(" WATCHDOG CPU ");
|
||||||
ssd1306_set_position (0,2);
|
ssd1306_set_position(0, 2);
|
||||||
ssd1306_puts("--------------");
|
ssd1306_puts("--------------");
|
||||||
|
|
||||||
ssd1306_set_position (0,3);
|
/* Mode display: switches between AUTO and MANU strings */
|
||||||
ssd1306_puts("Temp: 35'C");
|
ssd1306_set_position(0, 3);
|
||||||
ssd1306_set_position (0,4);
|
snprintf(buffer, sizeof(buffer), "Mode: %s", mode ? "AUTO" : "MANU");
|
||||||
ssd1306_puts("Freq: 1Hz");
|
ssd1306_puts(buffer);
|
||||||
ssd1306_set_position (0,5);
|
|
||||||
ssd1306_puts("Duty: 50%");
|
|
||||||
|
|
||||||
return 0;
|
/* Temperature display: formatted with one decimal precision */
|
||||||
|
ssd1306_set_position(0, 4);
|
||||||
|
snprintf(buffer, sizeof(buffer), "Temp: %.1f'C", temp);
|
||||||
|
ssd1306_puts(buffer);
|
||||||
|
|
||||||
|
/* Period/Frequency display: shows the value in milliseconds */
|
||||||
|
ssd1306_set_position(0, 5);
|
||||||
|
float freq = 1.0f / (period_ms / 1000.0f);
|
||||||
|
snprintf(buffer, sizeof(buffer), "Freq: %.1fHz", freq);
|
||||||
|
ssd1306_puts(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* update_oled_thread() - Continuous loop for screen refreshing.
|
||||||
|
*
|
||||||
|
* Runs at a 250ms interval to provide a responsive display without
|
||||||
|
* overloading the I2C bus.
|
||||||
|
*/
|
||||||
|
static void *update_oled_thread(void* arg) {
|
||||||
|
while (1) {
|
||||||
|
if (oled_cbs != NULL) {
|
||||||
|
/* Fetch fresh data using callbacks and update screen */
|
||||||
|
display(
|
||||||
|
oled_cbs->get_mode(),
|
||||||
|
oled_cbs->get_temperature(),
|
||||||
|
oled_cbs->get_period()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/* Sleep to control refresh rate and save CPU cycles */
|
||||||
|
usleep(250000);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_oled(struct oled_callbacks_t* cbs) {
|
||||||
|
if (cbs != NULL) {
|
||||||
|
oled_cbs = cbs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize the hardware driver */
|
||||||
|
ssd1306_init();
|
||||||
|
|
||||||
|
/* Start the background thread for automatic updates */
|
||||||
|
pthread_create(&oled_thread, NULL, update_oled_thread, NULL);
|
||||||
|
pthread_detach(oled_thread);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,20 @@
|
|||||||
//
|
|
||||||
// Created by fastium on 6/5/26.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef MSE_MA_CSEL_OLED_H
|
#ifndef MSE_MA_CSEL_OLED_H
|
||||||
#define MSE_MA_CSEL_OLED_H
|
#define MSE_MA_CSEL_OLED_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* Callback structure to decouple the OLED module from the application logic */
|
||||||
|
struct oled_callbacks_t {
|
||||||
|
float (*get_temperature)(void);
|
||||||
|
int (*get_mode)(void);
|
||||||
|
uint32_t (*get_period)(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize the SSD1306 display and start the background refresh thread.
|
||||||
|
* The cbs parameter provides the functions needed to fetch real-time data.
|
||||||
|
*/
|
||||||
|
void init_oled(struct oled_callbacks_t* cbs);
|
||||||
|
|
||||||
#endif //MSE_MA_CSEL_OLED_H
|
#endif //MSE_MA_CSEL_OLED_H
|
||||||
Reference in New Issue
Block a user