Skip to content
Snippets Groups Projects
Commit 8427289b authored by egorguslyan's avatar egorguslyan
Browse files

comments and first screens

parent 2b705472
No related branches found
No related tags found
No related merge requests found
......@@ -23,26 +23,55 @@
#include <microLED.h>
/********************************/
/*******microLED library*********/
/*******MHZ19 CO2 library********/
#include <MHZ19_uart.h>
/********************************/
/************Marcos**************/
#include <EEPROM.h>
/*************Marcos*************/
#define timer(tim, del) if(millis() - (tim) > (del))
#define numLeds (WIDTH * HEIGHT)
/********************************/
#define LANG_RU_RU
#define LEDsPin 2
#define CO2RX A0
#define CO2TX A1
#define LBTN 10
#define RBTN 8
// Unified arguments for screen functions
typedef union
{
int8_t i8;
uint8_t ui8;
const void *v;
} Arg;
#define WIDTH 16
#define HEIGHT 9
#define numLeds (WIDTH * HEIGHT)
#define COLOR1 mHEX(0x9aa100)
#define COLOR2 mHEX(0x000aa0)
// Screen entity with transition table
typedef struct
{
void (*func)(const Arg *);
const Arg arg;
const uint8_t nextFunc0;
const uint8_t nextFunc1;
const uint8_t nextFunc2;
} Screen;
// It will be stored in EEPROM with a special key
enum PANEL_ORIENTATION
{
PANEL_UNKNOWN = 0,
PANEL_NORMAL,
PANEL_REVERSE,
};
const uint8_t special_key = 0b11011100; // Just a random number (it's actually the voltage from the outlet)
// Structure for all global variables
struct
{
uint8_t panelOrientation : 2; // Swipe panel orientation
uint8_t currentScreen;
uint8_t currentState;
uint64_t timer;
} globalVars;
#include "screens.h"
#include "config.h"
microLED<numLeds, LEDsPin, MLED_NO_CLOCK, LED_WS2812, ORDER_GRB, CLI_AVER/*, SAVE_MILLIS*/> matrix(WIDTH, HEIGHT, ZIGZAG, RIGHT_TOP, DIR_LEFT);
#include "textbox.h"
......@@ -51,18 +80,25 @@ MHZ19_uart co2;
void setup()
{
// Hardware init
matrix.setBrightness(100);
matrix.clear();
matrix.show();
co2.begin(CO2TX, CO2RX);
co2.setAutoCalibration(false);
Serial.begin(9600);
// For safe debugging
while (!Serial.available()) {}
Serial.println("Hello");
// Reading settings from nonvolatile memory
uint8_t eepromData;
eepromData = EEPROM.read(0);
if((eepromData & 0b11111100 == special_key) && (eepromData & 0b00000011 < 3))
globalVars.panelOrientation = eepromData & 0b00000011;
else globalVars.panelOrientation = PANEL_UNKNOWN;
co2.begin(CO2TX, CO2RX);
co2.setAutoCalibration(false);
delay(500);
tb.setup("Ghbdtn vbh!", 0xFFFF, COLOR1, TB_LOOP_WITH_DELAY, 1, 1, 14, 100, 2000);
}
void loop()
......
#define LANG_RU_RU
#define LEDsPin 2
#define CO2RX A0
#define CO2TX A1
#define LBTN 10
#define RBTN 8
#define WIDTH 16
#define HEIGHT 9
#define COLOR1 mHEX(0x9aa100)
#define COLOR2 mHEX(0x000aa0)
#define startWith SCREEN_WELCOME
// Links
enum SCREENS
{
NONE = 255,
SCREEN_WELCOME = 0,
SCREEN_DASHBOARD,
SCREEN_GRAPH,
SCREEN_POMODORO,
};
const Screen screens[] = {
{ welcome, {.ui8 = globalVars.panelOrientation}, SCREEN_DASHBOARD, NONE, NONE },
{ dashboard, {.ui8 = globalVars.panelOrientation}, SCREEN_DASHBOARD, NONE, NONE },
};
\ No newline at end of file
void welcome(Arg *arg);
void dashboard(Arg *arg);
void welcome(Arg *arg)
{
const uint8_t delayMap[] = {50};
if(millis() - globalVars.timer > delayMap[globalVars.currentState])
digitalWrite(13, 1);
}
void dashboard(Arg *arg)
{
const uint8_t delayMap[] = {50};
if(millis() - globalVars.timer > delayMap[globalVars.currentState])
digitalWrite(13, 1);
}
\ No newline at end of file
#if LANG_RU_RU
char* strings[] = {};
#else
char* strings[] = {"Hello", "<- Swipe left"};
#endif
\ No newline at end of file
......@@ -2,8 +2,9 @@
#include "font.h"
enum TB_MODES {
TB_DISABLED,
enum TB_MODES
{
TB_DISABLED = 0,
TB_STATIC,
TB_REPEAT,
TB_LOOP,
......@@ -11,7 +12,8 @@ enum TB_MODES {
TB_BOUNCE,
};
class textbox {
class textbox
{
private:
/* data */
uint8_t cord_x;
......@@ -42,6 +44,7 @@ public:
uint8_t _reciprocal_speed = 0, uint16_t _delay = 0);
uint8_t render(void);
void disable(void);
void changeCords(uint8_t newx, uint8_t newy);
};
textbox::textbox(void)
......@@ -64,23 +67,29 @@ void textbox::setup(char _text[], uint64_t _langMask,
uint8_t _x, uint8_t _y, uint8_t _w,
uint8_t _reciprocal_speed = 0, uint16_t _delay = 0)
{
// Copy string
memset(text, NULL, 64 * sizeof(char));
strcpy(text, _text);
// Calculating width
textlen = strlen(text);
langMask = _langMask;
textwidth = 0;
for (uint16_t i = 0; i < textlen; i++) {
for (uint16_t i = 0; i < textlen; i++)
{
getLetter(i, true);
textwidth += letter[0] + 1;
}
textwidth--;
// Defining other vars
color = _color;
mode = _mode;
cord_x = _x;
cord_y = _y;
w = _w;
offset = 0;
switch (mode) {
switch (mode)
{
case TB_LOOP:
delay = 0;
goto NO_DELAY;
......@@ -98,41 +107,56 @@ void textbox::setup(char _text[], uint64_t _langMask,
delay = 0;
break;
}
// Reset timer and render
timer0 = 0;
render();
}
uint8_t textbox::render(void)
{
// Do nothing if disabled
if (mode != TB_DISABLED) {
if (timer0 == 0) {
if (mode != TB_DISABLED)
{
// If static or kickstart
if (timer0 == 0 || mode == TB_STATIC)
{
offset = 0 + (mode == TB_REPEAT) * w + 1 * (mode == TB_LOOP);
direction = 0;
timer0 = millis();
} else {
if ((millis() - timer0) > (((mode != TB_LOOP) && !state) ? delay : speed)) {
}
else
{
if ((millis() - timer0) > (((mode != TB_LOOP) && !state) ? delay : speed))
{
state = 1;
timer0 = millis();
if (mode == TB_BOUNCE) {
if ((!direction && offset == -textwidth + w) || (direction && offset == 0)) {
if (mode == TB_BOUNCE)
{
if ((!direction && offset == -textwidth + w) || (direction && offset == 0))
{
direction = !direction;
state = 0;
} else
}
else
offset += direction ? 1 : -1;
} else {
}
else
{
offset += -1;
if (offset < ((int16_t)-textwidth - 2 * (mode == TB_LOOP || mode == TB_LOOP_WITH_DELAY) - w * (mode == TB_REPEAT))) {
if (offset < ((int16_t)-textwidth - 2 * (mode == TB_LOOP || mode == TB_LOOP_WITH_DELAY) - w * (mode == TB_REPEAT)))
{
offset = 0 + (mode == TB_REPEAT) * w;
state = 0;
}
}
} else
}
else
// Draw if kickstart
if(state != 0) return 0;
}
} else
return 0;
}
// Do nothing if disabled
else return 0;
// Clear spot
for (uint8_t i = cord_x; (i < cord_x + w) && (i < WIDTH); i++)
for (uint8_t j = cord_y; (j < cord_y + 7) && (j < HEIGHT); j++)
......@@ -142,7 +166,8 @@ uint8_t textbox::render(void)
int16_t positionX = cord_x + offset;
int16_t positionY = cord_y;
// Draw while in bounds
while ((positionX < cord_x + w) && (index < textlen)) {
while ((positionX < cord_x + w) && (index < textlen))
{
// Recieve letter
getLetter(index);
// Relative X and Y
......@@ -151,9 +176,11 @@ uint8_t textbox::render(void)
// X bound
uint8_t maxX = letter[0];
// Run thougth bytes
for (uint8_t i = 0; (i < letter[2]) && (y < 7); i++) {
for (uint8_t i = 0; (i < letter[2]) && (y < 7); i++)
{
// Run througth bits
for (int8_t j = 7; (j >= 0) && (y < 7); j--) {
for (int8_t j = 7; (j >= 0) && (y < 7); j--)
{
// Set pixel
bool state = bitRead(letter[i + 3], j);
int16_t mx = x + positionX;
......@@ -162,7 +189,8 @@ uint8_t textbox::render(void)
matrix.set(mx, my, color);
// Next pixel
x++;
if (x >= maxX) {
if (x >= maxX)
{
x = 0;
y++;
}
......@@ -171,6 +199,12 @@ uint8_t textbox::render(void)
// Shift X and index
positionX += maxX + 1;
index++;
// Make a loop
if((mode == TB_LOOP || mode == TB_LOOP_WITH_DELAY) && index == textlen)
{
positionX++;
index = 0;
}
}
return 1;
}
......@@ -201,9 +235,13 @@ void textbox::getLetter(uint8_t i, bool skipBitmap = 0)
letter[1] = readed % 7; // offset
letter[2] = readed / 7 % 7; // bytes
// Read bitmaps
if (!skipBitmap) {
for (uint8_t i = 0; i < letter[2]; i++) {
if (!skipBitmap)
for (uint8_t i = 0; i < letter[2]; i++)
letter[i + 3] = pgm_read_byte(font[index] + (i + 1) * sizeof(uint8_t));
}
}
}
void textbox::changeCords(uint8_t newx, uint8_t newy)
{
cord_x = newx;
cord_y = newy;
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment