示例#1
0
/*
 * Application entry point.
 */
int main(void) {
  msg_t status = RDY_TIMEOUT;

  halInit();
  chSysInit();
  chBSemInit(&alarm_sem, TRUE);

  rtcGetTime(&RTCD1, &timespec);
  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, &timespec);
      alarmspec.tv_sec = timespec.tv_sec + RTC_ALARMPERIOD;
      rtcSetAlarm(&RTCD1, 0, &alarmspec);
    }
  }
  return 0;
}
示例#2
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");
}