/* * Application entry point. */ int main(void) { msg_t status = RDY_TIMEOUT; halInit(); chSysInit(); chBSemInit(&alarm_sem, TRUE); rtcGetTime(&RTCD1, ×pec); alarmspec.tv_sec = timespec.tv_sec + RTC_ALARMPERIOD; rtcSetAlarm(&RTCD1, 0, &alarmspec); rtcSetCallback(&RTCD1, rtc_cb); while (TRUE) { /* Wait until alarm callback signaled semaphore.*/ status = chBSemWaitTimeout(&alarm_sem, S2ST(RTC_ALARMPERIOD + 10)); if (status == RDY_TIMEOUT) { chSysHalt(); } else { rtcGetTime(&RTCD1, ×pec); alarmspec.tv_sec = timespec.tv_sec + RTC_ALARMPERIOD; rtcSetAlarm(&RTCD1, 0, &alarmspec); } } return 0; }
static void cmd_alarm(BaseSequentialStream *chp, int argc, char *argv[]){ (void)argv; struct tm timp; if (argc < 1) { goto ERROR; } if ((argc == 1) && (strcmp(argv[0], "get") == 0)){ rtcGetAlarm(&RTCD1, 0, &alarmspec); timp.tm_sec = alarmspec.alsec; timp.tm_min = alarmspec.almin; timp.tm_hour = alarmspec.alhour; timp.tm_mday = alarmspec.aldom; timp.tm_mon = alarmspec.almonth - 1; timp.tm_wday = alarmspec.aldow; timp.tm_year = alarmspec.alyear - 1900; timp.tm_yday = alarmspec.aldoy - 1; chprintf(chp, "%D%s",mktime(&timp)," - alarm in seconds\r\n"); return; } if ((argc == 2) && (strcmp(argv[0], "set") == 0)){ unix_time = (uint32_t)atol(argv[1]); localtime_r(&unix_time, &timp); alarmspec.alsec = timp.tm_sec; alarmspec.almin = timp.tm_min; alarmspec.alhour = timp.tm_hour; alarmspec.aldom = timp.tm_mday; alarmspec.almonth = timp.tm_mon + 1; alarmspec.aldow = timp.tm_wday; alarmspec.alyear = timp.tm_year + 1900; alarmspec.aldoy = timp.tm_yday + 1; rtcSetAlarm(&RTCD1, 0, &alarmspec); rtcSetCallback(&RTCD1, wakeup_cb); return; } else{ goto ERROR; } ERROR: chprintf(chp, "Usage: alarm get\r\n"); chprintf(chp, " alarm set N\r\n"); chprintf(chp, "where N is alarm time in seconds\r\n"); }