diff --git a/application.c b/application.c index 3c7eebd..69e3aa4 100644 --- a/application.c +++ b/application.c @@ -462,123 +462,6 @@ static void command_uptime(void* argument) printf("uptime: %u.%02u:%02u:%02u\n", uptime / (24 * 60 * 60), (uptime / (60 * 60)) % 24, (uptime / 60) % 60, uptime % 60); } -/** show date and time - * @param[in] argument date and time to set - */ -static void command_datetime(void* argument) -{ - char* datetime = (char*)argument; // argument is optional date time - const char* days[] = { "??", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"}; // the days of the week - - // set date - if (datetime) { // date has been provided - // parse date - const char* malformed = "date and time malformed, expecting YYYY-MM-DD WD HH:MM:SS\n"; - if (strlen(datetime) != (4 + 1 + 2 + 1 + 2) + 1 + 2 + 1 + (2 + 1 + 2 + 1 + 2)) { // verify date/time is long enough - printf(malformed); - return; - } - if (!(isdigit((int8_t)datetime[0]) && isdigit((int8_t)datetime[1]) && isdigit((int8_t)datetime[2]) && isdigit((int8_t)datetime[3]) && \ - '-' == datetime[4] && \ - isdigit((int8_t)datetime[5]) && isdigit((int8_t)datetime[6]) && \ - '-' == datetime[7] && \ - isdigit((int8_t)datetime[8]) && isdigit((int8_t)datetime[9]) && \ - ' ' == datetime[10] && \ - isalpha((int8_t)datetime[11]) && isalpha((int8_t)datetime[12]) && \ - ' ' == datetime[13] && \ - isdigit((int8_t)datetime[14]) && isdigit((int8_t)datetime[15]) && \ - ':' == datetime[16] && \ - isdigit((int8_t)datetime[17]) && isdigit((int8_t)datetime[18]) && \ - ':' == datetime[19] && \ - isdigit((int8_t)datetime[20]) && isdigit((int8_t)datetime[21]))) { // verify format (good enough to not fail parsing) - printf(malformed); - return; - } - const uint16_t year = strtol(&datetime[0], NULL, 10); // parse year - if (year <= 2000 || year > 2099) { - puts("year out of range\n"); - return; - } - const uint8_t month = strtol(&datetime[5], NULL, 10); // parse month - if (month < 1 || month > 12) { - puts("month out of range\n"); - return; - } - const uint8_t day = strtol(&datetime[8], NULL, 10); // parse day - if (day < 1 || day > 31) { - puts("day out of range\n"); - return; - } - const uint8_t hour = strtol(&datetime[14], NULL, 10); // parse hour - if (hour > 24) { - puts("hour out of range\n"); - return; - } - const uint8_t minute = strtol(&datetime[17], NULL, 10); // parse minutes - if (minute > 59) { - puts("minute out of range\n"); - return; - } - const uint8_t second = strtol(&datetime[30], NULL, 10); // parse seconds - if (second > 59) { - puts("second out of range\n"); - return; - } - uint8_t week_day = 0; - for (uint8_t i = 1; i < LENGTH(days) && 0 == week_day; i++) { - if (days[i][0] == toupper(datetime[11]) && days[i][1] == tolower(datetime[12])) { - week_day = i; - break; - } - } - if (0 == week_day) { - puts("unknown week day\n"); - return; - } - uint32_t date = 0; // to build the date - date |= (((year - 2000) / 10) & RTC_DR_YT_MASK) << RTC_DR_YT_SHIFT; // set year tenth - date |= (((year - 2000) % 10) & RTC_DR_YU_MASK) << RTC_DR_YU_SHIFT; // set year unit - date |= ((month / 10) & RTC_DR_MT_MASK) << RTC_DR_MT_SHIFT; // set month tenth - date |= ((month % 10) & RTC_DR_MU_MASK) << RTC_DR_MU_SHIFT; // set month unit - date |= ((day / 10) & RTC_DR_DT_MASK) << RTC_DR_DT_SHIFT; // set day tenth - date |= ((day % 10) & RTC_DR_DU_MASK) << RTC_DR_DU_SHIFT; // set day unit - date |= (week_day & RTC_DR_WDU_MASK) << RTC_DR_WDU_SHIFT; // time day of the week - uint32_t time = 0; // to build the time - time = 0; // reset time - time |= ((hour / 10) & RTC_TR_HT_MASK) << RTC_TR_HT_SHIFT; // set hour tenth - time |= ((hour % 10) & RTC_TR_HU_MASK) << RTC_TR_HU_SHIFT; // set hour unit - time |= ((minute / 10) & RTC_TR_MNT_MASK) << RTC_TR_MNT_SHIFT; // set minute tenth - time |= ((minute % 10) & RTC_TR_MNU_MASK) << RTC_TR_MNU_SHIFT; // set minute unit - time |= ((second / 10) & RTC_TR_ST_MASK) << RTC_TR_ST_SHIFT; // set second tenth - time |= ((second % 10) & RTC_TR_SU_MASK) << RTC_TR_SU_SHIFT; // set second unit - // write date - pwr_disable_backup_domain_write_protect(); // disable backup protection so we can set the RTC clock source - rtc_unlock(); // enable writing RTC registers - RTC_ISR |= RTC_ISR_INIT; // enter initialisation mode - while (!(RTC_ISR & RTC_ISR_INITF)); // wait to enter initialisation mode - RTC_DR = date; // set date - RTC_TR = time; // set time - RTC_ISR &= ~RTC_ISR_INIT; // exit initialisation mode - rtc_lock(); // protect RTC register against writing - pwr_enable_backup_domain_write_protect(); // re-enable protection now that we configured the RTC clock - } - - // show date - if (!(RTC_ISR & RTC_ISR_INITS)) { // date has not been set yet - puts("date/time not initialized\n"); - } else { - rtc_wait_for_synchro(); // wait until date/time is synchronised - const uint8_t year = ((RTC_DR >> RTC_DR_YT_SHIFT) & RTC_DR_YT_MASK) * 10 + ((RTC_DR >> RTC_DR_YU_SHIFT) & RTC_DR_YU_MASK); // get year - const uint8_t month = ((RTC_DR >> RTC_DR_MT_SHIFT) & RTC_DR_MT_MASK) * 10 + ((RTC_DR >> RTC_DR_MU_SHIFT) & RTC_DR_MU_MASK); // get month - const uint8_t day = ((RTC_DR >> RTC_DR_DT_SHIFT) & RTC_DR_DT_MASK) * 10 + ((RTC_DR >> RTC_DR_DU_SHIFT) & RTC_DR_DU_MASK); // get day - const uint8_t week_day = ((RTC_DR >> RTC_DR_WDU_SHIFT) & RTC_DR_WDU_MASK); // get week day - const uint8_t hour = ((RTC_TR >> RTC_TR_HT_SHIFT) & RTC_TR_HT_MASK) * 10 + ((RTC_TR >> RTC_TR_HU_SHIFT) & RTC_TR_HU_MASK); // get hours - const uint8_t minute = ((RTC_TR >> RTC_TR_MNT_SHIFT) & RTC_TR_MNT_MASK) * 10 + ((RTC_TR >> RTC_TR_MNU_SHIFT) & RTC_TR_MNU_MASK); // get minutes - const uint8_t second = ((RTC_TR >> RTC_TR_ST_SHIFT) & RTC_TR_ST_MASK) * 10 + ((RTC_TR >> RTC_TR_SU_SHIFT) & RTC_TR_SU_MASK); // get seconds - printf("date: 20%02d-%02d-%02d %s %02d:%02d:%02d\n", year, month, day, days[week_day], hour, minute, second); - } -} - /** reset board * @param[in] argument no argument required */ @@ -633,14 +516,6 @@ static const struct menu_command_t menu_commands[] = { .argument_description = NULL, .command_handler = &command_uptime, }, - { - .shortcut = 'd', - .name = "date", - .command_description = "show/set date and time", - .argument = MENU_ARGUMENT_STRING, - .argument_description = "[YYYY-MM-DD HH:MM:SS]", - .command_handler = &command_datetime, - }, { .shortcut = 'R', .name = "reset_board",