#include ViewTimeState::ViewTimeState(DS3231 &_ds3231, AT24C32 &_at24c32) { ds3231 = _ds3231; at24c32 = _at24c32; init(); } /* default german matrix layout 'E', 'S', 'K', 'I', 'S', 'T', 'L', 'F', 'Ü', 'N', 'F', 'Z', 'E', 'H', 'N', 'Z', 'W', 'A', 'N', 'Z', 'I', 'G', 'D', 'R', 'E', 'I', 'V', 'I', 'E', 'R', 'T', 'E', 'L', 'T', 'A', 'N', 'A', 'C', 'H', 'V', 'O', 'R', 'J', 'M', 'H', 'A', 'L', 'B', 'X', 'Z', 'W', 'Ö', 'L', 'F', 'P', 'Z', 'W', 'E', 'I', 'N', 'S', 'I', 'E', 'B', 'E', 'N', 'K', 'D', 'R', 'E', 'I', 'R', 'H', 'F', 'Ü', 'N', 'F', 'E', 'L', 'F', 'N', 'E', 'U', 'N', 'V', 'I', 'E', 'R', 'W', 'A', 'C', 'H', 'T', 'Z', 'E', 'H', 'N', 'R', 'S', 'B', 'S', 'E', 'C', 'H', 'S', 'F', 'M', 'U', 'H', 'R', 'B', 'S', 'E', 'C', 'H', 'S', 'F', 'M', 'U', 'H', 'R', '□', '□', '□', '□', '▣', '□', '□', '□', '□', '□', '□', */ void ViewTimeState::init() { text[0] = {0, 0, 1, true}; text[1] = {0, 3, 5, true}; hours[0][0] = {4, 5, 9, true}; hours[0][1] = {0, 0, 0, false}; hours[1][0] = {5, 2, 4, true}; hours[1][1] = {5, 2, 5, true}; hours[2][0] = {5, 0, 3, true}; hours[2][1] = {0, 0, 0, false}; hours[3][0] = {6, 1, 4, true}; hours[3][1] = {0, 0, 0, false}; hours[4][0] = {7, 7, 10, true}; hours[4][1] = {0, 0, 0, false}; hours[5][0] = {6, 7, 10, true}; hours[5][1] = {0, 0, 0, false}; hours[6][0] = {9, 1, 5, true}; hours[6][1] = {0, 0, 0, false}; hours[7][0] = {5, 5, 10, true}; hours[7][1] = {0, 0, 0, false}; hours[8][0] = {8, 1, 4, true}; hours[8][1] = {0, 0, 0, false}; hours[9][0] = {7, 3, 6, true}; hours[9][1] = {0, 0, 0, false}; hours[10][0] = {8, 5, 8, true}; hours[10][1] = {0, 0, 0, false}; hours[11][0] = {7, 0, 2, true}; hours[11][1] = {0, 0, 0, false}; // 0 minutes[0][0] = {9, 8, 10, true}; minutes[0][1] = {0, 0, 0, false}; minutes[0][2] = {0, 0, 0, false}; // 5 minutes[1][0] = {0, 7, 10, true}; minutes[1][1] = {3, 2, 5, true}; minutes[1][2] = {0, 0, 0, false}; // 10 minutes[2][0] = {1, 0, 3, true}; minutes[2][1] = {3, 2, 5, true}; minutes[2][2] = {0, 0, 0, false}; // 15 minutes[3][0] = {2, 4, 10, true}; minutes[3][1] = {3, 2, 5, true}; minutes[3][2] = {0, 0, 0, false}; // 20 minutes[4][0] = {1, 4, 10, true}; minutes[4][1] = {3, 2, 5, true}; minutes[4][2] = {0, 0, 0, false}; // 25 minutes[5][0] = {0, 7, 10, true}; minutes[5][1] = {3, 6, 8, true}; minutes[5][2] = {4, 0, 3, true}; // 30 minutes[6][0] = {4, 0, 3, true}; minutes[6][1] = {0, 0, 0, false}; minutes[6][2] = {0, 0, 0, false}; // 35 minutes[7][0] = {0, 7, 10, true}; minutes[7][1] = {3, 2, 5, true}; minutes[7][2] = {4, 0, 3, true}; // 40 minutes[8][0] = {1, 4, 10, true}; minutes[8][1] = {3, 6, 8, true}; minutes[8][2] = {0, 0, 0, false}; // 45 minutes[9][0] = {2, 4, 10, true}; minutes[9][1] = {3, 6, 8, true}; minutes[9][2] = {0, 0, 0, false}; // 50 minutes[10][0] = {1, 0, 3, true}; minutes[10][1] = {3, 6, 8, true}; minutes[10][2] = {0, 0, 0, false}; // 55 minutes[11][0] = {0, 7, 10, true}; minutes[11][1] = {3, 6, 8, true}; minutes[11][2] = {0, 0, 0, false}; increment = 24; } void ViewTimeState::setWessi() { init(); minutes[4][0] = {1, 0, 3, true}; minutes[4][1] = {3, 6, 8, true}; minutes[4][2] = {4, 0, 3, true}; minutes[8][0] = {1, 0, 3, true}; minutes[8][1] = {3, 2, 5, true}; minutes[8][2] = {4, 0, 3, true}; increment = 19; } void ViewTimeState::setOssi() { setWessi(); minutes[3][0] = {2, 4, 10, true}; minutes[3][1] = {0, 0, 0, false}; minutes[9][0] = {2, 0, 10, true}; minutes[9][1] = {0, 0, 0, false}; increment = 14; } void ViewTimeState::setWord(uint8_t matrix[121], matrix_entry word) { int row; for (int i = word.columnFrom; i <= word.columnTo; i++) { row = word.row * 11 + i; matrix[row] = color; } } void ViewTimeState::render(uint8_t matrix[121], ControlStates controlState) { uint8_t currentMode = at24c32.read(TIME_MODE_ADDRESS); if (mode != currentMode) { mode = currentMode; switch (mode) { case 1: setWessi(); break; case 2: setOssi(); break; default: init(); } } bool const blink = (millis() / CONTROL_BLINK_INTERVAL) % 2 == 0; if (controlState != ControlStates::TIME_MODE || blink) { setWord(matrix, text[0]); setWord(matrix, text[1]); } uint8_t mm = ds3231.getMinutes(); uint8_t m = mm / 5; uint8_t h = ds3231.getHours() % 12; uint8_t s = ds3231.getSeconds(); // increment hours if (mm > increment) { h = (h + 1) % 12; } // set hours if (controlState != ControlStates::TIME_HOURS || blink) { setWord(matrix, hours[h][0]); if (mm >= 5 && hours[h][1].notNull == true) { setWord(matrix, hours[h][1]); } } // set 5 minutes if (controlState != ControlStates::TIME_MINUTES || blink) { for (int i = 0; i < 3; i++) { if (minutes[m][i].notNull == true) { setWord(matrix, minutes[m][i]); } } } // set minutes if (mm % 5 > 0) { if (controlState != ControlStates::TIME_MINUTES || blink) { setWord(matrix, {10, 0, mm % 5 - 1}); } } // set seconds setWord(matrix, {10, 5, 5 + (s / 10)}); }