avr_firmware: WIP: UI and settings
This commit is contained in:
@@ -1,8 +1,11 @@
|
|||||||
|
GIT_VERSION := $(shell git describe --dirty=-d --always --tags --abbrev)
|
||||||
|
|
||||||
CC=avr-gcc
|
CC=avr-gcc
|
||||||
#CCOPTS=-mmcu=atmega164a -std=c11 -flto -Os -ggdb -Wall -Wextra -pedantic -DF_CPU=8000000UL
|
#CCOPTS=-mmcu=atmega164a -std=c11 -flto -Os -ggdb -Wall -Wextra -pedantic -DF_CPU=8000000UL
|
||||||
CCOPTS=-mmcu=atmega32 -std=c11 -flto -Os -ggdb -mrelax -Wall -Wextra -pedantic -DF_CPU=8000000UL
|
CCOPTS=-mmcu=atmega32 -std=c11 -flto -Os -ggdb -mrelax -Wall -Wextra -Wno-char-subscripts -pedantic -DF_CPU=8000000UL -DVERSION=\"$(GIT_VERSION)\"
|
||||||
|
|
||||||
CCSRCS ::= uart.c main.c modem.c timer.c lcd.c
|
|
||||||
|
CCSRCS ::= uart.c main.c modem.c timer.c lcd.c ui.c
|
||||||
|
|
||||||
all: fw.elf
|
all: fw.elf
|
||||||
|
|
||||||
|
|||||||
16
avr_firmware/src/eeprom.h
Normal file
16
avr_firmware/src/eeprom.h
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#ifndef DMXGSM_AVR_EEPROM_H
|
||||||
|
#define DMXGSM_AVR_EEPROM_H
|
||||||
|
|
||||||
|
#define EEPROM_SERIAL_OFS ((void*)1)
|
||||||
|
#define EEPROM_OSCCAL_OFS ((void*)0)
|
||||||
|
#define EEPROM_PIN_VALID_OFS ((void*)9)
|
||||||
|
#define EEPROM_PIN_OFS ((void*)10)
|
||||||
|
#define EEPROM_APN_VALID_OFS ((void*)14)
|
||||||
|
#define EEPROM_APN_OFS ((void*)15)
|
||||||
|
#define EEPROM_APN_USER_VALID_OFS ((void*)115)
|
||||||
|
#define EEPROM_APN_USER_OFS ((void*)116)
|
||||||
|
#define EEPROM_APN_PW_VALID_OFS ((void*)148)
|
||||||
|
#define EEPROM_APN_PW_OFS ((cvoid*)149)
|
||||||
|
#define EEPROM_EMPTY ((void*)181)
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -71,6 +71,11 @@ void lcdWrite(bool rs, uint8_t data)
|
|||||||
_lcdWrite(rs, data);
|
_lcdWrite(rs, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lcdWriteChr(char chr)
|
||||||
|
{
|
||||||
|
lcdWrite(true, (uint8_t)chr);
|
||||||
|
}
|
||||||
|
|
||||||
void lcdWriteStr(char const* str)
|
void lcdWriteStr(char const* str)
|
||||||
{
|
{
|
||||||
while (*str != '\0')
|
while (*str != '\0')
|
||||||
@@ -84,6 +89,30 @@ void lcdWriteStrP(char const* str)
|
|||||||
lcdWrite(true, (uint8_t)c);
|
lcdWrite(true, (uint8_t)c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lcdWriteStrFill(char const* str)
|
||||||
|
{
|
||||||
|
char cnt = 0;
|
||||||
|
while (*str != '\0') {
|
||||||
|
lcdWrite(true, (uint8_t)*str++);
|
||||||
|
++cnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(;cnt < 20;++cnt)
|
||||||
|
lcdWrite(true, ' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
void lcdWriteStrFillP(char const* str)
|
||||||
|
{
|
||||||
|
char c, cnt = 0;
|
||||||
|
while ((c = pgm_read_byte(str++)) != '\0') {
|
||||||
|
lcdWrite(true, (uint8_t)c);
|
||||||
|
++cnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(;cnt < 20;++cnt)
|
||||||
|
lcdWrite(true, ' ');
|
||||||
|
}
|
||||||
|
|
||||||
static const uint8_t lineLUT[4] PROGMEM = {0x00, 0x40, 0x14, 0x54};
|
static const uint8_t lineLUT[4] PROGMEM = {0x00, 0x40, 0x14, 0x54};
|
||||||
|
|
||||||
void lcdSetPos(unsigned char x, unsigned char y)
|
void lcdSetPos(unsigned char x, unsigned char y)
|
||||||
@@ -92,6 +121,21 @@ void lcdSetPos(unsigned char x, unsigned char y)
|
|||||||
lcdWrite(false, 0x80 | adr);
|
lcdWrite(false, 0x80 | adr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lcdSetMode(unsigned char mode)
|
||||||
|
{
|
||||||
|
unsigned char reg = 0x0c;
|
||||||
|
if (mode & LCD_CURSOR)
|
||||||
|
reg |= 0x2;
|
||||||
|
if (mode & LCD_CURBLINK)
|
||||||
|
reg |= 0x1;
|
||||||
|
lcdWrite(false, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lcdClear()
|
||||||
|
{
|
||||||
|
lcdWrite(false, 0x01);
|
||||||
|
}
|
||||||
|
|
||||||
char lcdInit()
|
char lcdInit()
|
||||||
{
|
{
|
||||||
LCD_DDDR = 0x00;
|
LCD_DDDR = 0x00;
|
||||||
|
|||||||
@@ -3,9 +3,17 @@
|
|||||||
|
|
||||||
char lcdInit();
|
char lcdInit();
|
||||||
|
|
||||||
|
void lcdWriteChr(char chr);
|
||||||
void lcdWriteStr(char const* str);
|
void lcdWriteStr(char const* str);
|
||||||
void lcdWriteStrP(char const* str);
|
void lcdWriteStrP(char const* str);
|
||||||
|
void lcdWriteStrFill(char const* str);
|
||||||
|
void lcdWriteStrFillP(char const* str);
|
||||||
|
|
||||||
void lcdSetPos(unsigned char x, unsigned char y);
|
void lcdSetPos(unsigned char x, unsigned char y);
|
||||||
|
|
||||||
|
#define LCD_CURSOR 1
|
||||||
|
#define LCD_CURBLINK 2
|
||||||
|
void lcdSetMode(unsigned char mode);
|
||||||
|
|
||||||
|
void lcdClear();
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <ctype.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include <avr/eeprom.h>
|
#include <avr/eeprom.h>
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
@@ -7,14 +8,16 @@
|
|||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
#include <util/delay.h>
|
#include <util/delay.h>
|
||||||
|
|
||||||
|
#include "eeprom.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
#include "modem.h"
|
#include "modem.h"
|
||||||
#include "uart.h"
|
#include "uart.h"
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
|
#include "ui.h"
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
const unsigned char osccal = eeprom_read_byte(0);
|
const unsigned char osccal = eeprom_read_byte(EEPROM_OSCCAL_OFS);
|
||||||
OSCCAL = osccal;
|
OSCCAL = osccal;
|
||||||
|
|
||||||
DDRD = 1<<7;
|
DDRD = 1<<7;
|
||||||
@@ -25,37 +28,19 @@ int main()
|
|||||||
lcdInit();
|
lcdInit();
|
||||||
uart0Init();
|
uart0Init();
|
||||||
|
|
||||||
lcdWriteStrP(PSTR("Hallo, Welt!"));
|
/* char buf[3]; */
|
||||||
|
/* utoa(osccal, buf, 16); */
|
||||||
|
|
||||||
lcdSetPos(0, 1);
|
/* lcdWriteStr(buf); */
|
||||||
|
|
||||||
char buf[6];
|
screenHandler(0, KEY_NONE);
|
||||||
utoa(osccal, buf, 16);
|
|
||||||
|
|
||||||
lcdWriteStrP(PSTR("OSCCAL = 0x"));
|
|
||||||
lcdWriteStr(buf);
|
|
||||||
|
|
||||||
unsigned oldSeconds = 0;
|
|
||||||
while (true) {
|
while (true) {
|
||||||
sleep_mode();
|
sleep_mode();
|
||||||
|
|
||||||
unsigned seconds = timerGetSeconds();
|
|
||||||
if (seconds != oldSeconds) {
|
|
||||||
utoa(seconds, buf, 10);
|
|
||||||
lcdSetPos(0,2);
|
|
||||||
lcdWriteStr(buf);
|
|
||||||
oldSeconds = seconds;
|
|
||||||
}
|
|
||||||
|
|
||||||
char key, action = getKey(&key);
|
char key, action = getKey(&key);
|
||||||
if (action != KEY_NONE) {
|
if (action != KEY_NONE) {
|
||||||
lcdSetPos(0, 3);
|
screenHandler(key, action);
|
||||||
utoa(key, buf, 10);
|
|
||||||
lcdWriteStr(buf);
|
|
||||||
if (action == KEY_PRESSED)
|
|
||||||
lcdWriteStrP(PSTR(" pressed! "));
|
|
||||||
else if (action == KEY_RELEASED)
|
|
||||||
lcdWriteStrP(PSTR(" released!"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
399
avr_firmware/src/ui.c
Normal file
399
avr_firmware/src/ui.c
Normal file
@@ -0,0 +1,399 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
#include <avr/eeprom.h>
|
||||||
|
|
||||||
|
#include "eeprom.h"
|
||||||
|
#include "lcd.h"
|
||||||
|
#include "timer.h"
|
||||||
|
|
||||||
|
void writeStatusScreen()
|
||||||
|
{
|
||||||
|
lcdClear();
|
||||||
|
lcdWriteStrP(PSTR("DMXGSM"));
|
||||||
|
lcdSetPos(0, 1);
|
||||||
|
lcdWriteStrP(PSTR("No connection"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeInfoScreen(char page)
|
||||||
|
{
|
||||||
|
char buf[8];
|
||||||
|
|
||||||
|
lcdClear();
|
||||||
|
switch (page) {
|
||||||
|
case 0:
|
||||||
|
lcdWriteStrP(PSTR("Software version:"));
|
||||||
|
lcdSetPos(1, 1);
|
||||||
|
lcdWriteStrP(PSTR(VERSION));
|
||||||
|
lcdSetPos(0, 2);
|
||||||
|
lcdWriteStrP(PSTR("Serial number:"));
|
||||||
|
lcdSetPos(1, 3);
|
||||||
|
eeprom_read_block(buf, EEPROM_SERIAL_OFS, 8);
|
||||||
|
for(char i = 0;i < 8;++i)
|
||||||
|
lcdWriteChr(buf[i]+'0');
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
lcdWriteStrP(PSTR("OSCCAL:"));
|
||||||
|
lcdSetPos(1, 1);
|
||||||
|
utoa(OSCCAL, buf, 16);
|
||||||
|
lcdWriteStrP(PSTR("0x"));
|
||||||
|
lcdWriteChr(toupper(buf[0]));
|
||||||
|
lcdWriteChr(toupper(buf[1]));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void genSIMPINMenuStr(char *buf)
|
||||||
|
{
|
||||||
|
strcpy_P(buf, PSTR("PIN: "));
|
||||||
|
if (eeprom_read_byte(EEPROM_PIN_VALID_OFS) == 1)
|
||||||
|
strcpy_P(buf+5, PSTR("****"));
|
||||||
|
else {
|
||||||
|
buf[5] = '?';
|
||||||
|
buf[6] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void genAPNNameMenuStr(char *buf)
|
||||||
|
{
|
||||||
|
strcpy_P(buf, PSTR("APN: "));
|
||||||
|
if (eeprom_read_byte(EEPROM_APN_VALID_OFS) == 1) {
|
||||||
|
eeprom_read_block(buf+5, EEPROM_APN_OFS, 13);
|
||||||
|
buf[18] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void genAPNUserMenuStr(char *buf)
|
||||||
|
{
|
||||||
|
strcpy_P(buf, PSTR("User: "));
|
||||||
|
if (eeprom_read_byte(EEPROM_APN_USER_VALID_OFS) == 1) {
|
||||||
|
eeprom_read_block(buf+6, EEPROM_APN_USER_OFS, 12);
|
||||||
|
buf[18] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void genAPNPWMenuStr(char *buf)
|
||||||
|
{
|
||||||
|
strcpy_P(buf, PSTR("Passwd: "));
|
||||||
|
if (eeprom_read_byte(EEPROM_APN_PW_VALID_OFS) == 1)
|
||||||
|
strcpy_P(buf+8, PSTR("********"));
|
||||||
|
else {
|
||||||
|
buf[8] = '?';
|
||||||
|
buf[9] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
enum states {
|
||||||
|
S_NONE,
|
||||||
|
S_STATUS,
|
||||||
|
S_MENU,
|
||||||
|
S_INFO,
|
||||||
|
S_EDITSIMPIN,
|
||||||
|
S_EDITAPNNAME,
|
||||||
|
S_EDITAPNUSER,
|
||||||
|
S_EDITAPNPW
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef void (*DynamicMenuEntryFn)(char *);
|
||||||
|
|
||||||
|
struct MenuEntry {
|
||||||
|
enum states tgtState;
|
||||||
|
const struct MenuEntry *tgtMenu;
|
||||||
|
DynamicMenuEntryFn dynFn;
|
||||||
|
PGM_P title;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct MenuEntry Menu[];
|
||||||
|
|
||||||
|
const char strMainMenu_Info[] PROGMEM = "Info";
|
||||||
|
const char strMainMenu_Settings[] PROGMEM = "Settings";
|
||||||
|
const char strSettingsMenu_SIM[] PROGMEM = "SIM Settings";
|
||||||
|
const char strSettingsMenu_APN[] PROGMEM = "APN Settings";
|
||||||
|
|
||||||
|
static const Menu PROGMEM APNMenu = {
|
||||||
|
{S_EDITAPNNAME, NULL, &genAPNNameMenuStr, NULL},
|
||||||
|
{S_EDITAPNUSER, NULL, &genAPNUserMenuStr, NULL},
|
||||||
|
{S_EDITAPNPW, NULL, &genAPNPWMenuStr, NULL},
|
||||||
|
{S_NONE, NULL, NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const Menu PROGMEM SIMMenu = {
|
||||||
|
{S_EDITSIMPIN, NULL, &genSIMPINMenuStr, NULL},
|
||||||
|
{S_NONE, NULL, NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const Menu PROGMEM SettingsMenu = {
|
||||||
|
{S_NONE, SIMMenu, NULL, strSettingsMenu_SIM},
|
||||||
|
{S_NONE, APNMenu, NULL, strSettingsMenu_APN},
|
||||||
|
{S_NONE, NULL, NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const Menu PROGMEM MainMenu = {
|
||||||
|
{S_INFO, NULL, NULL, strMainMenu_Info},
|
||||||
|
{S_NONE, SettingsMenu, NULL, strMainMenu_Settings},
|
||||||
|
{S_NONE, NULL, NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
static unsigned char menuPos = 0, menuSPtr = 0;
|
||||||
|
static const struct MenuEntry* curMenu = MainMenu;
|
||||||
|
static const struct MenuEntry* stackMenu[4];
|
||||||
|
|
||||||
|
void writeMenu(unsigned char pos)
|
||||||
|
{
|
||||||
|
char buf[19];
|
||||||
|
|
||||||
|
lcdClear();
|
||||||
|
for(char line = 0;line < 4;++line) {
|
||||||
|
if (pos == line) {
|
||||||
|
lcdSetPos(0, line);
|
||||||
|
lcdWriteChr(0x7e);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *str = pgm_read_ptr(&curMenu[line].title);
|
||||||
|
DynamicMenuEntryFn dynFn = pgm_read_ptr(&curMenu[line].dynFn);
|
||||||
|
|
||||||
|
lcdSetPos(2, line);
|
||||||
|
if (str)
|
||||||
|
lcdWriteStrP(str);
|
||||||
|
else if (dynFn) {
|
||||||
|
dynFn(buf);
|
||||||
|
lcdWriteStr(buf);
|
||||||
|
} else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum states menuHandler(char key, char action)
|
||||||
|
{
|
||||||
|
unsigned char newMenuPos = menuPos;
|
||||||
|
if (action == KEY_PRESSED) {
|
||||||
|
if (key == 1) {
|
||||||
|
newMenuPos = (menuPos==0)?0:(menuPos-1);
|
||||||
|
} else if (key == 3) {
|
||||||
|
if (((pgm_read_ptr(&curMenu[menuPos+1].title)) != NULL) ||
|
||||||
|
((pgm_read_ptr(&curMenu[menuPos+1].dynFn)) != NULL))
|
||||||
|
newMenuPos = menuPos+1;
|
||||||
|
} else if (key == 5) {
|
||||||
|
const struct MenuEntry* newMenu = pgm_read_ptr(&curMenu[menuPos].tgtMenu);
|
||||||
|
if (newMenu) {
|
||||||
|
stackMenu[menuSPtr++] = curMenu;
|
||||||
|
curMenu = newMenu;
|
||||||
|
newMenuPos = 0;
|
||||||
|
writeMenu(0);
|
||||||
|
} else
|
||||||
|
return pgm_read_byte(&curMenu[menuPos].tgtState);
|
||||||
|
} else if (key == 6) {
|
||||||
|
if (menuSPtr > 0) {
|
||||||
|
curMenu = stackMenu[--menuSPtr];
|
||||||
|
newMenuPos = 0;
|
||||||
|
writeMenu(0);
|
||||||
|
} else
|
||||||
|
return S_STATUS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (newMenuPos != menuPos) {
|
||||||
|
lcdSetPos(0, menuPos);
|
||||||
|
lcdWriteChr(' ');
|
||||||
|
lcdSetPos(0, newMenuPos);
|
||||||
|
lcdWriteChr(0x7e);
|
||||||
|
menuPos = newMenuPos;
|
||||||
|
}
|
||||||
|
return S_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char numberEntryBuf[4];
|
||||||
|
static unsigned char numberEntryPos, numberEntryX, numberEntryY;
|
||||||
|
char numberEntryHandler(char key, char action)
|
||||||
|
{
|
||||||
|
if (action == KEY_PRESSED) {
|
||||||
|
if (key == 1) {
|
||||||
|
numberEntryBuf[numberEntryPos] = (numberEntryBuf[numberEntryPos]==0)?9:(numberEntryBuf[numberEntryPos]-1);
|
||||||
|
lcdSetPos(numberEntryX+numberEntryPos, numberEntryY);
|
||||||
|
lcdWriteChr(numberEntryBuf[numberEntryPos]+'0');
|
||||||
|
lcdSetPos(numberEntryX+numberEntryPos, numberEntryY);
|
||||||
|
} else if (key == 3) {
|
||||||
|
numberEntryBuf[numberEntryPos] = (numberEntryBuf[numberEntryPos]==9)?0:(numberEntryBuf[numberEntryPos]+1);
|
||||||
|
lcdSetPos(numberEntryX+numberEntryPos, numberEntryY);
|
||||||
|
lcdWriteChr(numberEntryBuf[numberEntryPos]+'0');
|
||||||
|
lcdSetPos(numberEntryX+numberEntryPos, numberEntryY);
|
||||||
|
} else if (key == 0) {
|
||||||
|
numberEntryPos = (numberEntryPos==0)?0:(numberEntryPos-1);
|
||||||
|
lcdSetPos(numberEntryX+numberEntryPos, numberEntryY);
|
||||||
|
} else if (key == 4) {
|
||||||
|
numberEntryPos = (numberEntryPos==3)?3:(numberEntryPos+1);
|
||||||
|
lcdSetPos(numberEntryX+numberEntryPos, numberEntryY);
|
||||||
|
} else if (key == 5)
|
||||||
|
return 1;
|
||||||
|
else if (key == 6)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char textEntryBuf[32];
|
||||||
|
static unsigned char textEntryPos, textEntryX, textEntryY;
|
||||||
|
char textEntryHandler(char key, char action)
|
||||||
|
{
|
||||||
|
if (action == KEY_PRESSED) {
|
||||||
|
if (key == 1) {
|
||||||
|
if (textEntryBuf[textEntryPos] == ' ')
|
||||||
|
textEntryBuf[textEntryPos] = 'z';
|
||||||
|
else if (textEntryBuf[textEntryPos] == 'a')
|
||||||
|
textEntryBuf[textEntryPos] = 'Z';
|
||||||
|
else
|
||||||
|
--textEntryBuf[textEntryPos];
|
||||||
|
lcdSetPos(textEntryX+textEntryPos, textEntryY);
|
||||||
|
lcdWriteChr(textEntryBuf[textEntryPos]);
|
||||||
|
lcdSetPos(textEntryX+textEntryPos, textEntryY);
|
||||||
|
} else if (key == 3) {
|
||||||
|
if (textEntryBuf[textEntryPos] == 'Z')
|
||||||
|
textEntryBuf[textEntryPos] = 'a';
|
||||||
|
else if (textEntryBuf[textEntryPos] == 'z')
|
||||||
|
textEntryBuf[textEntryPos] = ' ';
|
||||||
|
else
|
||||||
|
++textEntryBuf[textEntryPos];
|
||||||
|
lcdSetPos(textEntryX+textEntryPos, textEntryY);
|
||||||
|
lcdWriteChr(textEntryBuf[textEntryPos]);
|
||||||
|
lcdSetPos(textEntryX+textEntryPos, textEntryY);
|
||||||
|
} else if (key == 0) {
|
||||||
|
textEntryPos = (textEntryPos==0)?0:(textEntryPos-1);
|
||||||
|
lcdSetPos(textEntryX+textEntryPos, textEntryY);
|
||||||
|
} else if (key == 4) {
|
||||||
|
textEntryPos = (textEntryPos==10)?10:(textEntryPos+1);
|
||||||
|
lcdSetPos(textEntryX+textEntryPos, textEntryY);
|
||||||
|
} else if (key == 5)
|
||||||
|
return 1;
|
||||||
|
else if (key == 6)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned char curPage;
|
||||||
|
void enterState(enum states state)
|
||||||
|
{
|
||||||
|
switch (state) {
|
||||||
|
case S_STATUS:
|
||||||
|
lcdSetMode(0);
|
||||||
|
writeStatusScreen();
|
||||||
|
break;
|
||||||
|
case S_MENU:
|
||||||
|
lcdSetMode(0);
|
||||||
|
writeMenu(menuPos);
|
||||||
|
break;
|
||||||
|
case S_INFO:
|
||||||
|
lcdSetMode(0);
|
||||||
|
curPage = 0;
|
||||||
|
writeInfoScreen(0);
|
||||||
|
break;
|
||||||
|
case S_EDITSIMPIN:
|
||||||
|
numberEntryPos = 0;
|
||||||
|
for (char i = 0;i < 4;++i)
|
||||||
|
numberEntryBuf[i] = 0;
|
||||||
|
numberEntryX = 7;
|
||||||
|
numberEntryY = 0;
|
||||||
|
lcdSetMode(LCD_CURBLINK);
|
||||||
|
lcdSetPos(numberEntryX, numberEntryY);
|
||||||
|
lcdWriteStrP(PSTR("0000"));
|
||||||
|
lcdSetPos(numberEntryX, numberEntryY);
|
||||||
|
break;
|
||||||
|
case S_EDITAPNNAME:
|
||||||
|
textEntryPos = 0;
|
||||||
|
memset(textEntryBuf, ' ', 32);
|
||||||
|
textEntryX = 7;
|
||||||
|
textEntryY = 0;
|
||||||
|
lcdSetMode(LCD_CURBLINK);
|
||||||
|
lcdSetPos(textEntryX, textEntryY);
|
||||||
|
break;
|
||||||
|
case S_EDITAPNUSER:
|
||||||
|
textEntryPos = 0;
|
||||||
|
memset(textEntryBuf, ' ', 32);
|
||||||
|
textEntryX = 8;
|
||||||
|
textEntryY = 1;
|
||||||
|
lcdSetMode(LCD_CURBLINK);
|
||||||
|
lcdSetPos(textEntryX, textEntryY);
|
||||||
|
break;
|
||||||
|
case S_EDITAPNPW:
|
||||||
|
textEntryPos = 0;
|
||||||
|
memset(textEntryBuf, ' ', 32);
|
||||||
|
textEntryX = 10;
|
||||||
|
textEntryY = 2;
|
||||||
|
lcdSetMode(LCD_CURBLINK);
|
||||||
|
lcdSetPos(textEntryX, textEntryY);
|
||||||
|
lcdWriteStrP(PSTR(" "));
|
||||||
|
lcdSetPos(textEntryX, textEntryY);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
lcdSetMode(0);
|
||||||
|
lcdClear();
|
||||||
|
lcdWriteStrP(PSTR("NYI"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void screenHandler(char key, char action)
|
||||||
|
{
|
||||||
|
static enum states state = S_NONE;
|
||||||
|
enum states newState = state;
|
||||||
|
char ret;
|
||||||
|
|
||||||
|
switch (state) {
|
||||||
|
case S_NONE:
|
||||||
|
newState = S_STATUS;
|
||||||
|
break;
|
||||||
|
case S_STATUS:
|
||||||
|
if (action == KEY_PRESSED) {
|
||||||
|
newState = S_MENU;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case S_MENU:
|
||||||
|
newState = menuHandler(key, action);
|
||||||
|
if (newState == S_NONE)
|
||||||
|
newState = state;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case S_INFO:
|
||||||
|
if (action == KEY_PRESSED) {
|
||||||
|
if (key == 6) {
|
||||||
|
newState = S_MENU;
|
||||||
|
} else if ((key == 3) && (curPage < 1)) {
|
||||||
|
writeInfoScreen(++curPage);
|
||||||
|
} else if ((key == 1) && (curPage > 0)) {
|
||||||
|
writeInfoScreen(--curPage);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case S_EDITSIMPIN:
|
||||||
|
ret = numberEntryHandler(key, action);
|
||||||
|
if (ret == -1)
|
||||||
|
newState = S_MENU;
|
||||||
|
else if (ret == 1) {
|
||||||
|
eeprom_update_block(numberEntryBuf, EEPROM_PIN_OFS, 4);
|
||||||
|
eeprom_update_byte(EEPROM_PIN_VALID_OFS, 1);
|
||||||
|
newState = S_MENU;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case S_EDITAPNNAME:
|
||||||
|
case S_EDITAPNUSER:
|
||||||
|
case S_EDITAPNPW:
|
||||||
|
ret = textEntryHandler(key, action);
|
||||||
|
if (ret == -1)
|
||||||
|
newState = S_MENU;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (action == KEY_PRESSED) {
|
||||||
|
if (key == 6) {
|
||||||
|
newState = S_MENU;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newState != state) {
|
||||||
|
enterState(newState);
|
||||||
|
state = newState;
|
||||||
|
}
|
||||||
|
}
|
||||||
6
avr_firmware/src/ui.h
Normal file
6
avr_firmware/src/ui.h
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#ifndef DMXGSM_AVR_UI_H
|
||||||
|
#define DMXGSM_AVR_UI_H
|
||||||
|
|
||||||
|
void screenHandler(char key, char action);
|
||||||
|
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user