cooking continues

This commit is contained in:
2026-05-04 23:04:43 +02:00
parent a82fdd3d33
commit cab3c32c63
2 changed files with 26 additions and 31 deletions

View File

@@ -60,7 +60,7 @@ void lcd_set_cursor(struct lcd_t* lcd, const uint8_t row, const uint8_t col) {
/* reconsider so im not writing every time. prepend custom chars to the write buffer? */
void lcd_set_custom_char(struct lcd_t* lcd, const uint8_t index, const lcd_glyph_t* glyph) {
uint8_t cmdbuf[] = {254, 78, index, 0, 0, 0, 0, 0, 0, 0, 0};
memcpy(&cmdbuf[3], &glyph, sizeof(glyph));
memcpy(&cmdbuf[3], &glyph, sizeof(lcd_glyph_t));
lcd_write(lcd, cmdbuf, sizeof(cmdbuf));
}
@@ -83,32 +83,29 @@ void lcd_write_buf(struct lcd_t* lcd, const uint8_t row, const uint8_t col, cons
len = MIN(len, sizeof(lcd->writebuf) - col);
uint8_t pos = 4 + col + (LCD_COLS * (row % 2)); // skip 4 bytes to leave room for set cursor command
if (row >= 2) pos += 2 * LCD_COLS + 4; // if we're writing to disp2, skip another 4 bytes for set cursor command and 2*40 bytes of disp 1
memcpy(&lcd->writebuf[pos], str, len);
memcpy(lcd->writebuf + pos, str, len);
}
int lcd_writef(struct lcd_t *lcd, uint8_t offset, const char *fmt, ...)
__attribute__((format(printf, 3, 4)));
int lcd_writef(struct lcd_t *lcd, uint8_t offset, const char *fmt, ...) {
/* hyperoptimized function to write a formatted string to lcd buffer. */
/* we cant just snprintf to the buffer directly bc it null terminates */
inline void lcd_writef(struct lcd_t *lcd, const uint8_t x, const uint8_t y, const char *fmt, ...) {
char tmp[LCD_COLS + 1];
va_list ap;
va_start(ap, fmt);
int len = vsnprintf(tmp, sizeof(tmp), fmt, ap);
uint8_t len = vsnprintf(tmp, sizeof(tmp), fmt, ap); // print fmt and ap to a temporary buffer
va_end(ap);
if (len <= 0) return -1;
if (offset + len > LCD_COLS) len = LCD_COLS - offset; /* clamp to buffer */
memcpy(lcd->writebuf + offset, tmp, len);
return len;
len = MIN(len, LCD_COLS - x);
uint8_t pos = 4 + x + (LCD_COLS * (y % 2)); // skip 4 bytes to leave room for set cursor command
if (y >= 2) pos += 2 * LCD_COLS + 4; // if we're writing to disp2, skip another 4 bytes for set cursor command and 2*40 bytes of disp 1
memcpy(lcd->writebuf + pos, tmp, len); // copy to lcd writebuffer address + whatever pos is
}
void lcd_clear_buf(struct lcd_t* lcd) {
inline void lcd_clear_buf(struct lcd_t* lcd) {
memset(lcd->writebuf, ' ', sizeof(lcd->writebuf));
}
/* flushes writebuffer to lcd, hyperoptmized, flushes buffer and commands in a single write operation */
void lcd_flush_buf(struct lcd_t* lcd) {
inline void lcd_flush_buf(struct lcd_t* lcd) {
constexpr uint8_t set_disp[] = {254, 71, 1, 1}; // set cursor to char 1, line 1
memcpy(&lcd->writebuf[0], set_disp, 4);
memcpy(&lcd->writebuf[2 * LCD_COLS + 4], set_disp, 4);
@@ -118,7 +115,7 @@ void lcd_flush_buf(struct lcd_t* lcd) {
// i have a whole flushbuf func to avoid too many writes, but im writing on every bar, need to rethink this.
// we could have a separate pre-char buffer and put all the setCustomChar commands to that?
char lcd_bar(struct lcd_t* lcd, const uint8_t char_id, const double value) {
inline char lcd_bar(struct lcd_t* lcd, const uint8_t char_id, const double value) {
uint8_t b[8];
memset(b, 0b01110, sizeof(b));
for (uint8_t i = 0; i < (1.0 - value) * 8; i++)
@@ -134,8 +131,6 @@ int lcd_init(struct lcd_t* lcd) {
return -1;
}
applog(LOG_INF, "ret %d, fd %d", ret, lcd->fd);
struct termios term = {};
term.c_cflag = lcd->baud | CS8 | CLOCAL | CREAD;

View File

@@ -4,9 +4,9 @@
#include "log.h"
#include <unistd.h>
#include <stdatomic.h>
#include <stdio.h>
#include <sys/signalfd.h>
#include "lcd.h"
#include "sys.h"
static void timespec_add_ms(struct timespec *ts, const uint16_t ms) {
ts->tv_nsec += ms * 1000000L;
@@ -26,7 +26,7 @@ struct control_t {
} control;
struct sensors_t {
// sys::TimeDate td;
struct time_date_t td;
double loadavg[3];
// sys::Memory ram;
// sys::Disk home;
@@ -62,22 +62,20 @@ static void *display_thread(void *arg) {
lcd_flush_buf(&lcd);
lcd_clear_buf(&lcd);
static int i = 0;
while (g_running) { // NOLINT its updated globally bud
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
timespec_add_ms(&ts, (uint16_t)(refresh_interval_ms * 1.25));
pthread_mutex_lock(&control.sensors_mtx);
pthread_cond_timedwait(&control.sensors_ready, &control.sensors_mtx, &ts);
pthread_mutex_lock(&control.sensors_mtx); // lock sensor struct
pthread_cond_timedwait(&control.sensors_ready, &control.sensors_mtx, &ts); // wait until data ready
lcd_clear_buf(&lcd);
lcd_writef(&lcd, 0, 0, "%s %s", sensors->td.date, sensors->td.time);
lcd_writef(&lcd, 26, 0, "%.2f %.2f %.2f", sensors->loadavg[0], sensors->loadavg[1], sensors->loadavg[2]);
lcd_writef(&lcd, 44, "write %6d", i);
lcd_flush_buf(&lcd);
pthread_mutex_unlock(&control.sensors_mtx);
applog(LOG_WRN, "disp tock");
pthread_mutex_unlock(&control.sensors_mtx); // unlock sensor struct
}
lcd_close(&lcd);
@@ -95,12 +93,14 @@ static void *sensors_thread(void *arg) {
while (g_running) { // NOLINT
timespec_add_ms(&next, refresh_interval_ms);
pthread_mutex_lock(&control.sensors_mtx);
sensors->hass_state = 2.3;
sys_get_load_avg(sensors->loadavg);
sys_get_time(&sensors->td);
pthread_cond_signal(&control.sensors_ready);
pthread_mutex_unlock(&control.sensors_mtx);
clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &next, nullptr);
applog(LOG_WRN, "sensors tick");
}