#define UPPER 0 #define LOWER 1 #define BOTH 2 #define LEFT_DOT 3 #define RIGHT_DOT 4 #define SMALL_SOP 5 //snoozed, onetime alarm, persistant alarm #define SMALL_AMPM 6 //am pm #define DAY_OF_WEEK 7 #define SPACE 0x20 #define BLOCK 0xFF /* The Arduino environment doesn't require prototypes. While this is nice is means it doesn't handle things like enum types as parameters in function calls. The prototype it automatically makes always appears before the enum definition. The standard workaround is to put that function in another file. So it's in defines.h. */ // 0 1 2 3 4 5 6 7 8 9 enum set_time_enum {SET_MODE, SET_DAY_ONOFF, SET_HOUR10, SET_HOUR01, SET_MINUTE10, SET_MINUTE01, SET_SECOND10, SET_SECOND01, SET_TENTHS, SET_HUNDREDTHS}; enum {BUTTON_UP, BUTTON_DOWN, BUTTON_LEFT, BUTTON_RIGHT}; //must match above enum enum button_enum {BUTTON_GOBACK, BUTTON_SELECT, BUTTON_MENUDOWN, BUTTON_MENUUP}; // 0 1 2 3 enum time_mode_enum {RUN_MODE, TIME_SET_MODE, ONETIME_ALARM_SET_MODE, PERSISTENT_ALARM_SET_MODE, // 4 5 6 7 8 ALARM_SNOOZED, ALARM_TURNOFF_BUZZING, ALARM_SNOOZE_BUZZING, ALARM_SNOOZE_TURNOFF, ALARM_TURNOFF}; enum turnoff_enum {MATH, TETRIS}; enum day_enum {SUN, MON, TUE, WED, THU, FRI, SAT}; //the order of this enum sets the order of the menu enum mainmenu_enum { MAINMENU_THICKER , MAINMENU_TWO_SIX , MAINMENU_SNOOZE_TIME , MAINMENU_SNOOZE_TIME_SEC , MAINMENU_SNOOZE_NUMBER , MAINMENU_SNOOZE_RELATIVE, MAINMENU_TETRIS_CLEAR_LINES, MAINMENU_FACT_INIT , MAINMENU_EXTRAS_ONOFF , MAINMENU_VERSION , MAINMENU_GET_EEPROM , MAINMENU_SAVE_EEPROM , MAINMENU_LAST //this must be the last entry }; char alarm_active_b_s[] PROGMEM = "%d = %04d"; char alarm_active_t_s[] PROGMEM = "%d Alarm"; char alarm_set_s[] PROGMEM = "%s %02d:%02d %02d:%02d"; char digit_s[] PROGMEM = "RAM avail: %d"; char error_s[] PROGMEM = "E %d:%02d:%02d %d"; char fact_s[] PROGMEM = "Factory"; char geteeprom_s[] PROGMEM ="Get EEPROM %d"; char init_s[] PROGMEM = "initialization"; //char lcd_line_s[] PROGMEM = "________________"; char lcdoalmset_s[] PROGMEM = "Onetime alarm "; char lcdpalmset_s[] PROGMEM = "Persistent alarm"; char lcdtimeset_s[] PROGMEM = "Time set "; char lcdtimesetdisp_s[] PROGMEM = "%s %02d:%02d:%02d"; char line_s[] PROGMEM = "L %d %d"; char seteeprom_s[] PROGMEM ="Save EEPROM %d"; char space_s[] PROGMEM = " "; char version_s[] PROGMEM = "Version"; char mthicker_s[] PROGMEM = "Piece size"; char mtwosix_s[] PROGMEM = "Custom char disp"; char snoozetime_s[] PROGMEM = "Snooze minutes"; char snoozetimesec_s[] PROGMEM = "Snooze seconds"; char snoozenumber_s[] PROGMEM = "Snooze repeat #"; char factinit_s[] PROGMEM = "Factory init"; char saveeeprom_s[] PROGMEM = "Save EEPROM"; char mgeteeprom_s[] PROGMEM = "Get EEPROM"; char extras_s[] PROGMEM = "Extras"; char factinitt_s[] PROGMEM = "Power cycle"; char factinitb_s[] PROGMEM = "(battery too)"; char snoozerelative_s[] PROGMEM = "Snooze time"; char clearlines_s[] PROGMEM = "Tetris lines"; char daySun[] PROGMEM = "Sun"; char dayMon[] PROGMEM = "Mon"; char dayTue[] PROGMEM = "Tue"; char dayWed[] PROGMEM = "Wed"; char dayThu[] PROGMEM = "Thu"; char dayFri[] PROGMEM = "Fri"; char daySat[] PROGMEM = "Sat"; PROGMEM char *days_week[] PROGMEM = { daySun, dayMon, dayTue, dayWed, dayThu, dayFri, daySat }; char on_s[] PROGMEM = " on"; char off_s[] PROGMEM = "off"; PROGMEM char *onoff_s[] PROGMEM = { off_s, on_s }; char thicker0_s[] PROGMEM = "smaller"; char thicker1_s[] PROGMEM = "thicker"; PROGMEM char *thicker_s[] PROGMEM = { thicker0_s, thicker1_s }; char twosix0_s[] PROGMEM = "4 top 4 bottom"; char twosix1_s[] PROGMEM = "2 top 6 bottom"; PROGMEM char *twosix_s[] PROGMEM = { twosix0_s, twosix1_s }; char relative0_s[] PROGMEM = "absolute"; char relative1_s[] PROGMEM = "relative"; PROGMEM char *relative_s[] PROGMEM = { relative0_s, relative1_s }; typedef struct { //size 8 long int ms; char second; char minute; char hour; enum day_enum day; } time_type; typedef struct { //size 3 char minute; char hour; boolean enabled; } alarm_type; typedef struct { //size 3 byte magic_number; //byte column_width; byte lcd_backlight; boolean thicker; boolean two_six; byte snooze_number; byte snooze_time_min; byte snooze_time_sec; boolean extras; boolean snooze_relative; byte tetris_clear_lines; } eeprom_type; byte upperlinechar[8] PROGMEM = { B11111, B11111, B11111, B00000, B00000, B00000, B00000, B00000 }; byte lowerlinechar[8] PROGMEM = { B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111 }; byte bothlinechar[8] PROGMEM = { B11111, B11111, B00000, B00000, B00000, B00000, B11111, B11111 }; byte largecolonleftchar[8] PROGMEM = { B00000, B00000, B00001, B00011, B00011, B00001, B00000, B00000 }; byte largecolonrightchar[8] PROGMEM = { B00000, B00000, B10000, B11000, B11000, B10000, B00000, B00000 }; byte small_s_char[8] PROGMEM = { B00000, B00000, B00000, B00110, B01000, B00100, B00010, B01100, }; byte small_o_char[8] PROGMEM = { B00000, B00000, B00000, B00100, B01010, B01010, B01010, B00100, }; byte small_p_char[8] PROGMEM = { B00000, B00000, B00000, B01100, B01010, B01100, B01000, B01000, }; byte small_am_char[8] PROGMEM = { B01000, B10100, B11100, B10100, B00000, B01010, B10101, B10101, }; byte small_pm_char[8] PROGMEM = { B11000, B10100, B11000, B10000, B00000, B01010, B10101, B10101, }; byte small_sun_char[8] PROGMEM = { B01000, B10000, B01000, B10000, B00000, B00101, B00101, B00111, }; byte small_mon_char[8] PROGMEM = { B01010, B10101, B10101, B00000, B00010, B00101, B00101, B00010, }; byte small_tue_char[8] PROGMEM = { B11100, B01000, B01000, B00000, B00000, B00101, B00101, B00111, }; byte small_wed_char[8] PROGMEM = { B10101, B10101, B01010, B00000, B00010, B00101, B00110, B00011, }; byte small_thu_char[8] PROGMEM = { B11100, B01000, B01000, B00000, B00100, B00110, B00101, B00101, }; byte small_fri_char[8] PROGMEM = { B11100, B10000, B11000, B10000, B00000, B00011, B00010, B00010, }; byte small_sat_char[8] PROGMEM = { B01000, B10000, B01000, B10000, B00010, B00101, B00101, B00011, }; byte blank_char[8] PROGMEM = { B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, }; byte numUpperLeft[11] PROGMEM = {BLOCK,UPPER,UPPER,UPPER,BLOCK,BLOCK,BLOCK,UPPER,BLOCK,BLOCK,SPACE}; byte numUpperCenter[11] PROGMEM = {UPPER,BLOCK,BOTH ,BOTH ,LOWER,BOTH ,BOTH ,UPPER,BOTH ,BOTH ,SPACE}; byte numUpperRight[11] PROGMEM = {BLOCK,SPACE,BLOCK,BLOCK,BLOCK,UPPER,UPPER,BLOCK,BLOCK,BLOCK,SPACE}; byte numLowerLeft[11] PROGMEM = {BLOCK,LOWER,BLOCK,LOWER,SPACE,LOWER,BLOCK,SPACE,BLOCK,LOWER,SPACE}; byte numLowerCenter[11] PROGMEM = {LOWER,BLOCK,LOWER,LOWER,SPACE,LOWER,LOWER,SPACE,LOWER,LOWER,SPACE}; byte numLowerRight[11] PROGMEM = {BLOCK,LOWER,LOWER,BLOCK,BLOCK,BLOCK,BLOCK,BLOCK,BLOCK,BLOCK,SPACE}; /* Tetris stuff */ #define PIECE_I 0 #define PIECE_T 1 #define PIECE_J 2 #define PIECE_L 3 #define PIECE_Z 4 #define PIECE_S 5 #define PIECE_O 6 /*First nibble top 4 blocks, second nibble next 4 blocks...*/ /*0000 0100 0000 0100 0000 0100 1111 0100 */ #define PIECE_I_0 0x000F #define PIECE_I_2 0x000F #define PIECE_I_1 0x4444 #define PIECE_I_3 0x4444 /*0000 0000 0000 0000 0000 0100 0000 1000 0100 1100 1110 1100 1110 0100 0100 1000 */ #define PIECE_T_0 0x004E #define PIECE_T_1 0x04C4 #define PIECE_T_2 0x00E4 #define PIECE_T_3 0x08C8 /*0000 0000 0000 0000 0000 0100 0000 1100 1000 0100 1110 1000 1110 1100 0010 1000 */ #define PIECE_J_0 0x008E #define PIECE_J_1 0x044C #define PIECE_J_2 0x00E2 #define PIECE_J_3 0x0C88 /*0000 0000 0000 0000 0000 1100 0000 1000 0010 0100 1110 1000 1110 0100 1000 1100 */ #define PIECE_L_0 0x002E #define PIECE_L_1 0x0C44 #define PIECE_L_2 0x00E8 #define PIECE_L_3 0x088C /*0000 0000 0000 0100 1100 1100 0110 1000 */ #define PIECE_Z_0 0x00C6 #define PIECE_Z_2 0x00C6 #define PIECE_Z_1 0x04C8 #define PIECE_Z_3 0x04C8 /*0000 0000 0000 1000 0110 1100 1100 0100 */ #define PIECE_S_0 0x006C #define PIECE_S_2 0x006C #define PIECE_S_1 0x08C4 #define PIECE_S_3 0x08C4 /*0000 0000 1100 1100 */ #define PIECE_O_0 0x00CC #define PIECE_O_2 0x00CC #define PIECE_O_1 0x00CC #define PIECE_O_3 0x00CC /* Tetris Shapes Convensions The lower case x is the one indicated by x and y coordinates and rotated around. Numbers indicate rotation. I 0,2 1,3 X X X XXXX X T 0 1 2 3 X X X XX XXX XX XXX X X X J 0 1 2 3 X XX X X XXX X XXX XX X X L 0 1 2 3 XX X X X XXX X XXX X X XX Z 0,2 1,3 X XX XX XX X S 0,2 1,3 X XX XX XX X 0,1,2,3 XX XX */