#include #include "render_functions.h" #include "led_matrix.h" #include "udp_logger.h" extern LEDMatrix led_matrix; const String clock_chars_as_string = "ESRISTNFUNFVIERTELZEHNZWANZIGHVORPIKACHUNACHHALBMELFUNFMITTERNACHTEINSUWUZWEIDREIFUNVIERSECHSOBACHTSIEBENZWOLFZEHNEUNEUHR"; /** * @brief control the four minute indicator LEDs * * @param minutes minutes to be displayed [0 ... 59] * @param color 24bit color value */ void draw_minute_indicator(uint8_t minutes, uint32_t color) { // separate LEDs for minutes in an additional row switch (minutes % 5) { case 1: { led_matrix.set_min_indicator(0b1000, color); break; } case 2: { led_matrix.set_min_indicator(0b1100, color); break; } case 3: { led_matrix.set_min_indicator(0b1110, color); break; } case 4: { led_matrix.set_min_indicator(0b1111, color); break; } case 0: default: { break; } } } /** * @brief Draw the given sentence to the word clock * * @param message sentence to be displayed * @param color 24bit color value * @return int: 0 if successful, -1 if sentence not possible to display */ int show_string_on_clock(String message, uint32_t color) { String word = ""; int last_letter_clock = 0; int word_position = 0; int idx = 0; // add space on the end of message for splitting message = message + " "; // empty the target grid led_matrix.flush(); while (true) { // extract next word from message word = split(message, ' ', idx); idx++; if (word.length() > 0) { // find word in clock string word_position = clock_chars_as_string.indexOf(word, last_letter_clock); if (word_position >= 0) { // word found on clock -> enable leds in targetgrid for (unsigned int i = 0; i < word.length(); i++) { unsigned int x = (word_position + i) % MATRIX_WIDTH; unsigned int y = (word_position + i) / MATRIX_WIDTH; led_matrix.grid_add_pixel(x, y, color); } // remember end of the word on clock last_letter_clock = word_position + word.length(); } else { // word is not possible to show on clock return -1; } } else // end - no more word in message { break; } } return 0; // return success } /** * @brief Converts the given time as sentence (String) * * @param hours hours of the time value * @param minutes minutes of the time value * @return String time as sentence */ String time_to_string(uint8_t hours, uint8_t minutes) { String message = "ES IST "; // first two words // show minutes if (minutes >= 5 && minutes < 10) { message += "FUNF NACH "; } else if (minutes >= 10 && minutes < 15) { message += "ZEHN NACH "; } else if (minutes >= 15 && minutes < 20) { message += "VIERTEL NACH "; } else if (minutes >= 20 && minutes < 25) { message += "ZWANZIG NACH "; } else if (minutes >= 25 && minutes < 30) { message += "FUNF VOR HALB "; } else if (minutes >= 30 && minutes < 35) { message += "HALB "; } else if (minutes >= 35 && minutes < 40) { message += "FUNF NACH HALB "; } else if (minutes >= 40 && minutes < 45) { message += "ZWANZIG VOR "; } else if (minutes >= 45 && minutes < 50) { message += "VIERTEL VOR "; } else if (minutes >= 50 && minutes < 55) { message += "ZEHN VOR "; } else if (minutes >= 55 && minutes < 60) { message += "FUNF VOR "; } // increment hour when 25 minutes of an hour have passed if (minutes >= 25) { hours++; } // convert hours to 12h format if (hours > 12) // 24h -> 12h, except 12h { hours -= 12; } // show hours switch (hours) { case 0: { if (minutes >= 0 && minutes < 5) { message += "MITTERNACHT "; } else { message += "ZWOLF "; } break; } case 1: { message += "EIN"; message += (minutes > 4) ? "S " : " "; // add "S" if needed break; } case 2: { message += "ZWEI "; break; } case 3: { message += "DREI "; break; } case 4: { message += "VIER "; break; } case 5: { message += "FUNF "; break; } case 6: { message += "SECHS "; break; } case 7: { message += "SIEBEN "; break; } case 8: { message += "ACHT "; break; } case 9: { message += "NEUN "; break; } case 10: { message += "ZEHN "; break; } case 11: { message += "ELF "; break; } case 12: { message += "ZWOLF "; break; } } if ((minutes < 5) && (hours != 0)) { message += "UHR "; } return message; } /** * @brief Splits a string at given character and return specified element * * @param s string to split * @param parser separating character * @param index index of the element to return * @return String */ String split(String s, char parser, int index) { String rs = ""; int parser_cnt = 0; int r_from_index = 0, r_to_index = -1; while (index >= parser_cnt) { r_from_index = r_to_index + 1; r_to_index = s.indexOf(parser, r_from_index); if (index == parser_cnt) { if (r_to_index == 0 || r_to_index == -1) { return ""; } return s.substring(r_from_index, r_to_index); } else { parser_cnt++; } } return rs; }