/* * 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[]){ int i = 0; (void)argv; if (argc < 1) { goto ERROR; } if ((argc == 1) && (strcmp(argv[0], "get") == 0)){ rtcGetAlarm(&RTCD1, 0, &alarmspec); chprintf(chp, "%D%s",alarmspec," - alarm in STM internal format\r\n"); return; } if ((argc == 2) && (strcmp(argv[0], "set") == 0)){ i = atol(argv[1]); alarmspec.tv_datetime = ((i / 10) & 7 << 4) | (i % 10) | RTC_ALRMAR_MSK4 | RTC_ALRMAR_MSK3 | RTC_ALRMAR_MSK2; rtcSetAlarm(&RTCD1, 0, &alarmspec); 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"); }
/*! * @brief set alarm command. * * This function set the alarm which will be * trigerred x secs later. The alarm trigger * will print a notification on the console. */ void cmdAlarm(wakeUpSource_t wus, uint8_t offsetSec) { if((wus & wakeUpSourceRtc) != 0) { rtcSetAlarm(PM_RTOS_DEMO_RTC_FUNC_INSTANCE, offsetSec); } else { lptmrSetAlarm(offsetSec); } }
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"); }
int main(void) { halInit(); chSysInit(); chThdCreateStatic(blinkWA, sizeof(blinkWA), NORMALPRIO, blink_thd, NULL); /* set alarm in near future */ rtcGetTime(&RTCD1, ×pec); alarmspec.tv_sec = timespec.tv_sec + 30; rtcSetAlarm(&RTCD1, 0, &alarmspec); while (TRUE){ chThdSleepSeconds(10); chSysLock(); /* going to anabiosis*/ PWR->CR |= (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_CSBF | PWR_CR_CWUF); SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; __WFI(); } return 0; }
//************************************************************************************** //*** //*** //*** //************************************************************************************** void main() { uchar cmd; schar j; uchar fname[14]; unsigned i; long swtrig = 0; picInit(); memInit(); serSendString("\r\nxPIClog\r\n"); serSendString("=======\r\n"); serUsage(); serSendString("\r\n\r\nCOLD START\r\n"); serSendString("CHECK TIME AND DATE!\r\n\r\n"); SDPOW(1); // SD card power on pinInitSD(); // other SD card pins filReadConfig("poweron"); pinExitSD(); // prepare card shutdown SDPOW(0); // SD card power on // a little ugly... for(;;) { // MENU LOOP for(;;) { // check serial commands cmd = cmdCheck(EXEC); // check pushbutton if( !SWITCH ) { LED(1); if( swtrig++ > 120000 ) cmd = CMD_OFF; } else { LED(1); // new v0.8a -> dim LED light during menu operation if( ( swtrig < 120000)&&(swtrig > 1000) ) cmd = CMD_START; swtrig = 0; LED(0); } if( cmd == CMD_START ) break; // power off? if( cmd == CMD_OFF ) { serSendString("\r\n\r\nGOING TO SLEEP\r\n\r\n"); LED(0); swtrig = 0; for(i=0;i<2000;i++) LED(1); LED(0); POWOUT(0); pinExitSD(); // prepare card shutdown SDPOW(0); // SD card power off BANDGAP(0); // voltage reference off sleep(); nop(); nop(); while( !SWITCH ) LED(1); LED(0); serSendString("\r\n\r\nWOKE UP\r\n\r\n"); cmd = CMD_LOAD; // ;-) } // read config file? if( cmd == CMD_LOAD ) { SDPOW(1); // SD card power on pinInitSD(); // other SD card pins filReadConfig((uchar *)&sCfg.crdFName); pinExitSD(); // prepare card shutdown SDPOW(0); // SD card power on }// END CMD load // read config file? if( cmd == CMD_SAVE ) { SDPOW(1); // SD card power on pinInitSD(); // other SD card pins filSaveConfig((uchar *)&sCfg.crdFName); pinExitSD(); // prepare card shutdown SDPOW(0); // SD card power on }// END CMD load }// END for menu loop // PREPARE ACQUISITION for(j=0;j<10;j++) { for(i=0;i<20000;i++) LED(1); for(i=0;i<20000;i++) LED(0); } serSendString("\r\nSTART\r\n"); measStorInit(); // new v0.8a; might be advantageous to clear the buffer first... rtcSetAlarm(sCfg.rtcSUnit,sCfg.rtcSRate); rtcEnableAlarm(); // ACQUISITION LOOP for(;;) { if( sCfg.rtcActive == NO ) break; if( sCfg.rtcSleep ) { sleep(); nop(); nop(); } } rtcDisableAlarm(); SDPOW(1); // SD card power on pinInitSD(); // other SD card pins LED(1); // just in case we left because of a serial transmission... serRXBufFlushIn(); serRXBufInit(); serSendString("\r\nWRITE PENDING DATA: "); strcpy((uchar *)&fname,(uchar*)&sCfg.crdFName); strcat((uchar *)&fname,".log"); // TODO if( (j=filOpenAppendClose((uchar *)&fname)) < 0) { // flush buffer while( measStorReadVMeas() > 0 ) {;} serSendString("ERROR\r\n"); } else { sCfg.crdSamplesWritten+=(uchar)j; serSendString("OK\r\n"); } pinExitSD(); // prepare card shutdown SDPOW(0); // SD card power off serSendString("\r\nSTOP\r\n"); // long->ulong might overflow (in years ;-) serSendStringDebug("SAMPLES WRITTEN: ",(long)sCfg.crdSamplesWritten,"\r\n"); while( !SWITCH ) {;} LED(0); }// END main for loop }