1
0
mirror of https://github.com/mist-devel/mist-firmware.git synced 2026-04-17 00:15:25 +00:00

menu: add an RTC config page

This commit is contained in:
Gyorgy Szombathelyi
2021-08-25 02:09:00 +02:00
parent 77b4d41ee4
commit fb2997991b
5 changed files with 124 additions and 22 deletions

132
menu.c
View File

@@ -29,7 +29,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdio.h"
#include "string.h"
#include "errors.h"
#include "mmc.h"
#include "utils.h"
#include "fat_compat.h"
#include "osd.h"
#include "state.h"
@@ -120,6 +120,7 @@ char *config_button_turbo_msg[] = {"OFF", "FAST", "MEDIUM", "SLOW"};
char *config_button_turbo_choice_msg[] = {"A only", "B only", "A & B"};
const char *config_audio_filter_msg[] = {"switchable", "always off", "always on"};
const char *config_power_led_off_msg[] = {"dim", "off"};
const char *days[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
enum HelpText_Message {HELPTEXT_NONE,HELPTEXT_MAIN,HELPTEXT_HARDFILE,HELPTEXT_CHIPSET,HELPTEXT_MEMORY,HELPTEXT_VIDEO,HELPTEXT_FEATURES};
@@ -1130,28 +1131,31 @@ void HandleUI(void)
menustate = MENU_NONE1;
break;
case MENU_8BIT_SYSTEM1:
case MENU_8BIT_SYSTEM1: {
uint8_t date[7];
char have_rtc = GetRTC((uint8_t*)&date);
helptext=helptexts[HELPTEXT_MAIN];
m = 0;
if (user_io_core_type()==CORE_TYPE_MINIMIG || user_io_core_type()==CORE_TYPE_MINIMIG2)
m = 1;
menumask = m ? 0x1f : 0x3f; // 5 selections + Exit
OsdSetTitle("System", OSD_ARROW_LEFT);
menumask = m ? 0x3f : 0x7f; // 5 selections + Exit
if (!have_rtc) menumask &= ~0x02;
OsdSetTitle("System", OSD_ARROW_LEFT);
menustate = MENU_8BIT_SYSTEM2;
parentstate = MENU_8BIT_SYSTEM1;
OsdWrite(0, "", 0, 0);
OsdWrite(1, " Firmware & Core \x16", menusub == 0,0);
OsdWrite(2, " Input Devices \x16", menusub == 1,0);
OsdWrite(3, m ? " Reset" : " Reset settings", menusub == 2,0);
OsdWrite(0, " Firmware & Core \x16", menusub == 0,0);
OsdWrite(1, " Date & Time \x16", menusub == 1 && have_rtc, !have_rtc);
OsdWrite(2, " Input Devices \x16", menusub == 2,0);
OsdWrite(3, m ? " Reset" : " Reset settings", menusub == 3,0);
if(m)
OsdWrite(4, "", 0,0);
else
OsdWrite(4, " Save settings", menusub == 3, 0); // Minimig saves settings elsewhere
OsdWrite(5, " About", menusub == (4-m),0);
OsdWrite(6, "", 0,0);
OsdWrite(7, STD_EXIT, menusub == (5-m),0);
OsdWrite(4, " Save settings", menusub == 4, 0); // Minimig saves settings elsewhere
OsdWrite(5, " About", menusub == (5-m),0);
OsdWrite(6, "", 0, 0);
OsdWrite(7, STD_EXIT, menusub == (6-m),0);
break;
}
case MENU_8BIT_SYSTEM2 :
m = 0;
if (user_io_core_type()==CORE_TYPE_MINIMIG || user_io_core_type()==CORE_TYPE_MINIMIG2)
@@ -1167,15 +1171,20 @@ void HandleUI(void)
menusub = 1;
break;
case 1:
// RTC submenu
menustate = MENU_RTC1;
menusub = 0;
break;
case 2:
// Input tests and settings
menustate = MENU_8BIT_CONTROLLERS1;
menusub = 0;
break;
case 2:
case 3:
menustate = MENU_RESET1;
menusub = 1;
break;
case 3:
case 4:
if(m) {
menustate = MENU_8BIT_ABOUT1;
menusub = 0;
@@ -1199,7 +1208,7 @@ void HandleUI(void)
}
}
break;
case 4:
case 5:
if(m) {
menustate=MENU_NONE1;
menusub = 0;
@@ -1209,7 +1218,7 @@ void HandleUI(void)
menusub = 0;
}
break;
case 5:
case 6:
// Exit
menustate=MENU_NONE1;
menusub = 0;
@@ -1273,20 +1282,20 @@ void HandleUI(void)
// menu key closes menu
if (menu) {
menustate = MENU_8BIT_SYSTEM1;
menusub = 3;
menusub = 4;
}
if(select) {
//iprintf("Selected", 0);
if (menusub==0) {
menustate = MENU_8BIT_SYSTEM1;
menusub = 3;
menusub = 4;
}
}
else {
if (left)
{
menustate = MENU_8BIT_SYSTEM1;
menusub = 3;
menusub = 4;
}
}
break;
@@ -1311,7 +1320,7 @@ void HandleUI(void)
case MENU_8BIT_CONTROLLERS2:
// menu key goes back to previous menu
if (menu) {
menusub = 1;
menusub = 2;
menustate = MENU_8BIT_SYSTEM1;
}
if(select) {
@@ -3655,6 +3664,87 @@ void HandleUI(void)
}
break;
/******************************************************************/
/* RTC menu */
/******************************************************************/
case MENU_RTC1: {
uint8_t date[7]; //year,month,date,hour,min,sec,day
helptext=helptexts[HELPTEXT_NONE];
parentstate=menustate;
menumask = 0xff;
if (GetRTC((uint8_t*)&date)) {
OsdSetTitle("Clock",0);
siprintf(s, " Year %4d", 1900+date[0]);
OsdWrite(0, s, menusub == 0, 0);
siprintf(s, " Month %2d", date[1]);
OsdWrite(1, s, menusub == 1, 0);
siprintf(s, " Date %2d", date[2]);
OsdWrite(2, s, menusub == 2, 0);
siprintf(s, " Hour %2d", date[3]);
OsdWrite(3, s, menusub == 3, 0);
siprintf(s, " Minute %2d", date[4]);
OsdWrite(4, s, menusub == 4, 0);
siprintf(s, " Second %2d", date[5]);
OsdWrite(5, s, menusub == 5, 0);
siprintf(s, " Day %9s", date[6] <= 7 ? days[date[6]-1] : "--------");
OsdWrite(6, s, menusub == 6, 0);
OsdWrite(7, STD_EXIT, menusub == 7, 0);
menustate = MENU_RTC2;
} else {
menustate = MENU_8BIT_SYSTEM1;
}
break;
}
case MENU_RTC2: {
uint8_t date[7]; //year,month,date,hour,min,sec,day
static const char mdays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int year;
uint8_t is_leap, month, maxday;
static unsigned long timer = 0;
if (CheckTimer(timer)) {
timer = GetTimer(1000);
menustate = MENU_RTC1;
break;
}
if (menu) {
menusub = 1;
menustate = MENU_8BIT_SYSTEM1;
}
else if (select) {
if (menusub == 7) {
menusub = 1;
menustate = MENU_8BIT_SYSTEM1;
}
} else if (left | right) {
if (GetRTC((uint8_t*)&date)) {
year = 1900+date[0];
month = date[1];
if (month > 12) month = 12;
is_leap = (!(year % 4) && (year % 100)) || !(year % 400);
maxday = mdays[month-1] + (month == 2 && is_leap);
switch(menusub) {
case 0: if (left) date[0]--; else date[0]++; break;
case 1: if (left) date[1] = decval(date[1], 1, 12); else date[1] = incval(date[1], 1, 12); break;
case 2: if (left) date[2] = decval(date[2], 1, maxday); else date[2] = incval(date[2], 1, maxday); break;
case 3: if (left) date[3] = decval(date[3], 0, 23); else date[3] = incval(date[3], 0, 23); break;
case 4: if (left) date[4] = decval(date[4], 0, 59); else date[4] = incval(date[4], 0, 59); break;
case 5: if (left) date[5] = decval(date[5], 0, 59); else date[5] = incval(date[5], 0, 59); break;
case 6: if (left) date[6] = decval(date[6], 1, 7); else date[6] = incval(date[6], 1, 7); break;
}
if (SetRTC((uint8_t*)&date))
menustate = MENU_RTC1;
}
}
break;
}
/******************************************************************/
/* error message menu */
/******************************************************************/

2
menu.h
View File

@@ -67,6 +67,8 @@ enum MENU
MENU_FIRMWARE_CORE_FILE_SELECTED,
MENU_ERROR,
MENU_INFO,
MENU_RTC1,
MENU_RTC2,
// Mist/atari specific pages
MENU_MIST_MAIN1,

View File

@@ -249,7 +249,7 @@ uint8_t usb_rtc_set_time(uint8_t *d) {
time.hour_bcd = bin2bcd(d[3]);
time.min_bcd = bin2bcd(d[4]);
time.sec_bcd = bin2bcd(d[5]);
time.day = d[3];
time.day = d[6];
if(!i2c_write_cmd_and_data(dev, DS1307_ADDR, 0, &time, sizeof(struct timeS))) {
usbrtc_debugf("Error writing time");

View File

@@ -13,6 +13,14 @@ unsigned char bcd2bin(unsigned char in) {
return 10*(in >> 4) + (in & 0x0f);
}
unsigned char decval(unsigned char in, unsigned char min, unsigned char max) {
return (in == min) ? max : in-1;
}
unsigned char incval(unsigned char in, unsigned char min, unsigned char max) {
return (in == max) ? min : in+1;
}
FAST int _strnicmp(const char *s1, const char *s2, size_t n)
{
char c1, c2;

View File

@@ -1,6 +1,8 @@
#ifndef _UTILS_H_
#define _UTILS_H_
unsigned char decval(unsigned char in, unsigned char min, unsigned char max);
unsigned char incval(unsigned char in, unsigned char min, unsigned char max);
unsigned char bin2bcd(unsigned char in);
unsigned char bcd2bin(unsigned char in);
int _strnicmp(const char *s1, const char *s2, size_t n);