Ejemplo n.º 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;
}
Ejemplo n.º 2
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");
}
Ejemplo n.º 3
0
 /*!
 * @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);
    }
}
Ejemplo n.º 4
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");
}
Ejemplo n.º 5
0
int main(void) {
  halInit();
  chSysInit();

  chThdCreateStatic(blinkWA, sizeof(blinkWA), NORMALPRIO, blink_thd, NULL);
  /* set alarm in near future */
  rtcGetTime(&RTCD1, &timespec);
  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;
}
Ejemplo n.º 6
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

}