Esempio 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;
}
Esempio n. 2
0
//---------------------------------------------------------------------------------
void VblankHandler(void) {
//---------------------------------------------------------------------------------

    u32 i;
    uint8 ct[sizeof(IPC->time.curtime)];

    //sound code  :)
    TransferSound *snd = IPC->soundData;
    IPC->soundData = 0;

    rtcGetTime((uint8 *)ct);
    BCDToInteger((uint8 *)&(ct[1]), 7);

    for(i=0; i<sizeof(ct); i++) {
        IPC->time.curtime[i] = ct[i];
    }

    if (0 != snd) {

        for (i=0; i<snd->count; i++) {
            s32 chan = getFreeSoundChannel();

            if (chan >= 0) {
                startSound(snd->data[i].rate, snd->data[i].data, snd->data[i].len, chan, snd->data[i].vol, snd->data[i].pan, snd->data[i].format);
            }
        }
    }
    Wifi_Update(); // update wireless in vblank
}
Esempio n. 3
0
/**
 * @brief   Gets raw time from RTC and converts it to canonicalized format.
 *
 * @param[in] rtcp      pointer to RTC driver structure
 * @param[out] timp     pointer to a @p tm structure as defined in time.h
 *
 * @api
 */
void rtcGetTimeTm(RTCDriver *rtcp, struct tm *timp) {
  RTCTime timespec = {0,0};

  rtcGetTime(rtcp, &timespec);
  if (timp != NULL) /* this comparison needed to avoid compiler warning */
    timp = localtime((time_t *)&(timespec.tv_sec));
}
Esempio n. 4
0
static THD_FUNCTION(ThreadTIME, arg)
{
	(void)arg;

	chRegSetThreadName("Time");
	struct tm timp;
	char str_date[100];

	while (true) {
		if(updateSettingTime) {
			setLabelTime(ghlblDateTime, true);
		}

		rtcGetTime(RTC_DRIVER, &timespec);
		rtcConvertDateTimeToStructTm(&timespec, &timp,0);
		//https://www.iar.com/support/resources/articles/using-c-standard-library-time-and-clock-functions/
		//http://www.cplusplus.com/forum/general/57329/
		int timeElap = difftime(mktime(&timp),mktime(&startTime));
		uint8_t hour = timeElap/3600;
		uint16_t second = timeElap % 3600;
		uint8_t minute = second/60;
		second %= 60;
		//timp.tm_sec = second;
		//timp.tm_min = minute;
		//timp.tm_hour = hour;
		//strftime(str_date, sizeof(str_date), "%X", &timp); //%x for date http://www.tutorialspoint.com/c_standard_library/c_function_strftime.htm
		snprintf(str_date, 9, "%02d:%02d:%02d", hour, minute, second);
		gwinSetText(ghlblElapsed, str_date, TRUE);
		chThdSleepMilliseconds(1000);
	}
}
NumbersStationView::NumbersStationView(
	NavigationView& nav,
	TransmitterModel& transmitter_model
) : transmitter_model(transmitter_model)
{
	uint8_t m, d, dayofweek;
	uint16_t y;
	
	add_children({ {
		&text_title,
		&button_exit
	} });
	
	rtc::RTC datetime;
	rtcGetTime(&RTCD1, &datetime);
	
	// Thanks, Sakamoto-sama !
	y = datetime.year();
	m = datetime.month();
	d = datetime.day();
	y -= m < 3;
	dayofweek = (y + y/4 - y/100 + y/400 + month_table[m-1] + d) % 7;
	
	text_title.set(day_of_week[dayofweek]);

	button_exit.on_select = [&nav](Button&){
		nav.pop();
	};
}
Esempio n. 6
0
cell pawn_rtc( AMX * amx, const cell * params )
{
	(void)amx;
	(void)params;
    RTCTime rtc;
    rtcGetTime( &RTCD1, &rtc );
    return rtc.tv_sec * 1000 + rtc.tv_msec;
}
Esempio n. 7
0
static time_t rtc_get_time_unix(uint32_t *tv_msec) {
  RTCDateTime timespec;
  struct tm tim;

  rtcGetTime(&RTCD1, &timespec);
  rtcConvertDateTimeToStructTm(&timespec, &tim, tv_msec);

  return mktime(&tim);
}
Esempio n. 8
0
/**
 * @brief   Gets raw time from RTC and converts it to canonicalized format.
 *
 * @param[in] rtcp      pointer to RTC driver structure
 * @param[out] timp     pointer to a @p tm structure as defined in time.h
 *
 * @api
 */
void rtcGetTimeTm(RTCDriver *rtcp, struct tm *timp) {
#if STM32_RTC_HAS_SUBSECONDS
  RTCTime timespec = {0,0,FALSE,0};
#else
  RTCTime timespec = {0,0,FALSE};
#endif

  rtcGetTime(rtcp, &timespec);
  stm32_rtc_bcd2tm(timp, &timespec);
}
Esempio n. 9
0
int _gettimeofday(struct timeval *tv)
{
	RTCDateTime timespec;

	rtcGetTime(&RTCD1, &timespec);
    uint64_t t = (uint64_t)timespec.millisecond * 1000000;/*__your_system_time_function_here__();*/  // get uptime in nanoseconds
    tv->tv_sec = t / 1000000000;  // convert to seconds
    tv->tv_usec = ( t % 1000000000 ) / 1000;  // get remaining microseconds
    chprintf((BaseSequentialStream *)&itm_port, "timespec: time %d usec. %d sec. %d\n", t, tv->tv_usec, tv->tv_sec);
    return 0;  // return non-zero for error
} // end _gettimeofday()
Esempio n. 10
0
/**
 * @brief   Gets raw time from RTC and converts it to unix format.
 *
 * @param[in] rtcp      pointer to RTC driver structure
 * @return              Unix time value in microseconds.
 *
 * @api
 */
uint64_t rtcGetTimeUnixUsec(RTCDriver *rtcp) {
#if STM32_RTC_HAS_SUBSECONDS
  uint64_t result = 0;
  RTCTime timespec = {0,0};

  rtcGetTime(rtcp, &timespec);
  result = (uint64_t)timespec.tv_sec * 1000000;
  return result + timespec.tv_msec * 1000;
#else
  return (uint64_t)rtcGetTimeUnixSec(rtcp) * 1000000;
#endif
}
Esempio n. 11
0
/**
  * Reads the time from the STM32 internal RTC
  * @return Date in Julian calendar format
  */
void getTime(ptime_t *date) {
	RTCDateTime timespec;
	rtcGetTime(&RTCD1, &timespec);

	date->year = timespec.year + 2000;
	date->month = timespec.month;
	date->day = timespec.day;
	date->hour = timespec.millisecond / 3600000;
	date->minute = (timespec.millisecond%3600000) / 60000;
	date->second = (timespec.millisecond / 1000) % 60;
	date->millisecond = timespec.millisecond % 1000;
}
Esempio n. 12
0
/**
 * @brief   Gets raw time from RTC and converts it to unix format.
 *
 * @param[in] rtcp      pointer to RTC driver structure
 * @return              Unix time value in seconds.
 *
 * @api
 */
time_t rtcGetTimeUnixSec(RTCDriver *rtcp) {
#if STM32_RTC_HAS_SUBSECONDS
  RTCTime timespec = {0,0,FALSE,0};
#else
  RTCTime timespec = {0,0,FALSE};
#endif
  struct tm timp;

  rtcGetTime(rtcp, &timespec);
  stm32_rtc_bcd2tm(&timp, &timespec);

  return mktime(&timp);
}
Esempio n. 13
0
/**
 * @brief   Gets raw time from RTC and converts it to unix format.
 *
 * @param[in] rtcp      pointer to RTC driver structure
 * @return              Unix time value in microseconds.
 *
 * @api
 */
uint64_t rtcGetTimeUnixUsec(RTCDriver *rtcp) {
#if STM32_RTC_HAS_SUBSECONDS
  uint64_t result = 0;
  RTCTime timespec = {0,0,FALSE,0};
  struct tm timp;

  rtcGetTime(rtcp, &timespec);
  stm32_rtc_bcd2tm(&timp, &timespec);

  result = (uint64_t)mktime(&timp) * 1000000;
  return result + timespec.tv_msec * 1000;
#else
  return (uint64_t)rtcGetTimeUnixSec(rtcp) * 1000000;
#endif
}
Esempio n. 14
0
static bool_t stm32_get_datetime(TDateTime *dt)
{
	if(dt){

		rtcGetTime(&RTCD1,&rt);
		
		datetime_convert(rt.tv_sec,dt);
		#if 0
		dt->sec  = mytime.tm_sec;
		dt->min  = mytime.tm_min;
		dt->hour = mytime.tm_hour;
		dt->day  = mytime.tm_mday;
		dt->mon  = mytime.tm_mon;
		dt->year = mytime.tm_year;
		#endif
		return TRUE;
	}
	return FALSE;
}
Esempio n. 15
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;
}
Esempio n. 16
0
/**
 * Reset the time to now
 *
 * @param utc a pointer to the time structure
 * @param present a pointer to a present field. when non-NULL then the UTCDATE
 * and UTCTIME flags are set in it.
 */
void nmea_time_now(nmeaTIME *utc, uint32_t * present) {
    struct tm tt;
    RTCDateTime timespec;
    uint32_t tv_msec;

    NMEA_ASSERT(utc);

    rtcGetTime(&RTCD1, &timespec);
    rtcConvertDateTimeToStructTm(&timespec, &tt, &tv_msec);

    utc->year = tt.tm_year;
    utc->mon = tt.tm_mon;
    utc->day = tt.tm_mday;
    utc->hour = tt.tm_hour;
    utc->min = tt.tm_min;
    utc->sec = tt.tm_sec;
    utc->hsec = (tv_msec / 10);
    if (present) {
        nmea_INFO_set_present(present, UTCDATE | UTCTIME);
    }
}
Esempio n. 17
0
void setLabelTime(GHandle gh, bool timeDate)
{
	struct tm timp;
	char str_date[100];

	rtcGetTime(RTC_DRIVER, &timespec);
	rtcConvertDateTimeToStructTm(&timespec, &timp,0);
	if (timeDate) {
		if(use12HR)
			strftime(str_date, sizeof(str_date), "%x-%r", &timp);
		else
			strftime(str_date, sizeof(str_date), "%x-%X", &timp); //%x for date http://www.tutorialspoint.com/c_standard_library/c_function_strftime.htm

		//chprintf((BaseSequentialStream*)USB_SERIAL_DRIVER, "%s\r\n", str_date);
		gwinSetText(gh, str_date, TRUE);
	} else {
		if(use12HR)
			strftime(str_date, sizeof(str_date), "%r", &timp);
		else
			strftime(str_date, sizeof(str_date), "%X", &timp);

		gwinSetText(gh, str_date, TRUE);
	}
}
Esempio n. 18
0
void sp5K_readFunction(void)
{

u08 devId, address, regValue, pin, channel, pcbChannel, adcChannel;
u08 length = 10;
s08 retS;
u08 mcp_address;
RtcTimeType rtcDateTime;
u08 i;
u16 adcRetValue;
char eeRdBuffer[EERDBUFLENGHT];
u16 eeAddress;
u08 pos;
frameDataType rdFrame;
u16 recCount;
double I,M,D;
u08 bdGetStatus;
u16 rcdIndex;
u08 b[9];

	memset( cmd_printfBuff, NULL, CHAR128);
	makeargv();

	// RTC
	// Lee la hora del RTC.
	if (!strcmp_P( strupr(argv[1]), PSTR("RTC\0"))) {
		retS = rtcGetTime(&rtcDateTime);
		if (retS ) {
			pos = snprintf_P( &cmd_printfBuff,CHAR128,PSTR("OK\r\n"));
			pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("%02d/%02d/%04d "),rtcDateTime.day,rtcDateTime.month, rtcDateTime.year );
			pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("%02d:%02d:%02d\r\n\0"),rtcDateTime.hour,rtcDateTime.min, rtcDateTime.sec );
		} else {
			snprintf_P( &cmd_printfBuff,CHAR128,PSTR("ERROR\r\n\0"));
		}
		sp5K_printStr(&cmd_printfBuff);
		return;
	}

	// DCD
	if (!strcmp_P( strupr(argv[1]), PSTR("DCD\0"))) {
		retS = MCP_queryDcd(&pin);
		if (retS ) {
			pos = snprintf_P( &cmd_printfBuff,CHAR128,PSTR("OK\r\n"));
			if ( pin == 1 ) { pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("DCD ON\r\n\0")); }
			if ( pin == 0 ) { pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("DCD OFF\r\n\0")); }
		} else {
			snprintf_P( &cmd_printfBuff,CHAR128,PSTR("ERROR\r\n\0"));
		}
		sp5K_printStr(&cmd_printfBuff);
		return;
	}

	// RI
	if (!strcmp_P( strupr(argv[1]), PSTR("RI\0"))) {
		retS = MCP_queryRi(&pin);
		if (retS ) {
			pos = snprintf_P( &cmd_printfBuff,CHAR128,PSTR("OK\r\n"));
			if ( pin == 1 ) { pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("RI ON\r\n\0")); }
			if ( pin == 0 ) { pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("RI OFF\r\n\0")); }
		} else {
			snprintf_P( &cmd_printfBuff,CHAR128,PSTR("ERROR\r\n\0"));
		}
		sp5K_printStr(&cmd_printfBuff);
		return;
	}

	// DIN0
	if (!strcmp_P( strupr(argv[1]), PSTR("DIN0\0"))) {
		retS = MCP_queryDin0(&pin);
		if (retS ) {
			pos = snprintf_P( &cmd_printfBuff,CHAR128,PSTR("OK\r\n"));
			snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("DIN0 %d\r\n\0"), pin);
		} else {
			snprintf_P( &cmd_printfBuff,CHAR128,PSTR("ERROR\r\n\0"));
		}
		sp5K_printStr(&cmd_printfBuff);
		return;
	}

	// DIN1
	if (!strcmp_P( strupr(argv[1]), PSTR("DIN1\0"))) {
		retS = MCP_queryDin1(&pin);
		if (retS ) {
			pos = snprintf_P( cmd_printfBuff,CHAR128,PSTR("OK\r\n"));
			snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("DIN1 %d\r\n\0"), pin);
		} else {
			snprintf_P( cmd_printfBuff,CHAR128,PSTR("ERROR\r\n\0"));
		}
		sp5K_printStr(cmd_printfBuff);
		return;
	}

	// TERMSW
	if (!strcmp_P( strupr(argv[1]), PSTR("TERMSW\0"))) {
		retS = MCP_queryTermPwrSw(&pin);
		if (retS ) {
			pos = snprintf_P( cmd_printfBuff,CHAR128,PSTR("OK\r\n"));
			if ( pin == 1 ) { pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("TERMSW ON\r\n\0")); }
			if ( pin == 0 ) { pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("TERMSW OFF\r\n\0")); }
		} else {
			snprintf_P( cmd_printfBuff,CHAR128,PSTR("ERROR\r\n\0"));
		}
		sp5K_printStr(&cmd_printfBuff);
		return;
	}

	// MCP
	// read mcp 0|1|2 addr
	if (!strcmp_P( strupr(argv[1]), PSTR("MCP\0"))) {
		devId = atoi(argv[2]);
		address = atoi(argv[3]);

		if ( devId == 0 ) { mcp_address = MCP_ADDR0; }
		if ( devId == 1 ) { mcp_address = MCP_ADDR1; }
		if ( devId == 2 ) { mcp_address = MCP_ADDR2; }

		retS = MCP_read( address, mcp_address, 1, &regValue);
		if (retS ) {
			// Convierto el resultado a binario.
			pos = snprintf_P( cmd_printfBuff,CHAR128,PSTR("OK\r\n"));
			strcpy(b,byte_to_binary(regValue));
			pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("mcp %d: reg=[%d] data=[0X%03x] [%s] \r\n\0"),devId, address,regValue, b);
		} else {
			snprintf_P( &cmd_printfBuff,CHAR128,PSTR("ERROR\r\n\0"));
		}
		sp5K_printStr(&cmd_printfBuff);
		return;
	}
	// *****************************************************************************************************
	// SOLO PARA USO EN MODO SERVICE.
	if ( systemVars.wrkMode != WK_SERVICE) {
		snprintf_P( &cmd_printfBuff,CHAR128,PSTR("WARNING: Debe pasar a modo SERVICE !!!\r\n"));
		sp5K_printStr(&cmd_printfBuff);
		return;
	}

	// ADC
	// read adc channel
	// El canal es de 0..3/0..7 y representa el canal fisico en el conector, NO
	// EL PROPIO CANAL DEL A/D

	if (!strcmp_P( strupr(argv[1]), PSTR("ADC\0"))) {

		pcbChannel = atoi(argv[2]);

		if ( NRO_CHANNELS == 3 ) {
			switch (pcbChannel ) {
			case 0:
				adcChannel = 3;
				break;
			case 1:
				adcChannel = 5;
				break;
			case 2:
				adcChannel = 7;
				break;
			case 3:
				adcChannel = 1;		// Bateria
				break;
			}
		}

		retS = ADS7828_convert( adcChannel, &adcRetValue );

		if (retS ) {
			pos = snprintf_P( &cmd_printfBuff,CHAR128,PSTR("OK\r\n"));
			pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("adc_%d(%d)=[%d]\r\n\0"),pcbChannel, adcChannel, adcRetValue);
		} else {
			snprintf_P( &cmd_printfBuff,CHAR128,PSTR("ERROR\r\n\0"));
		}
		sp5K_printStr(&cmd_printfBuff);
		return;
	}

	// FRAME
	// Lee todos los canales y presenta el frame.
	if (!strcmp_P( strupr(argv[1]), PSTR("FRAME\0"))) {
		SIGNAL_tkDataReadFrame();
		return;
	}

	// EEPROM
	// read ee addr length
	if (!strcmp_P( strupr(argv[1]), PSTR("EE\0"))) {
		eeAddress = atol(argv[2]);
		length = atoi(argv[3]);
		// Buffer control.
		if (length > EERDBUFLENGHT) {
			length = EERDBUFLENGHT;
		}
		retS = EE_read( eeAddress, length, &eeRdBuffer);
		if (retS ) {
			pos = snprintf_P( &cmd_printfBuff,CHAR128,PSTR("OK\r\n"));
			pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("addr=[%d] data=[%s]\r\n\0"),eeAddress,eeRdBuffer);
		} else {
			snprintf_P( &cmd_printfBuff,CHAR128,PSTR("ERROR\r\n\0"));
		}
		sp5K_printStr(&cmd_printfBuff);
		return;
	}

	// MEMORY DUMP
	if (!strcmp_P( strupr(argv[1]), PSTR("MEMORY\0"))) {

		recCount = 0;

		for (;;) {

			vTaskDelay( (portTickType)(50 / portTICK_RATE_MS) );
			rcdIndex = BD_getRDptr();
			bdGetStatus =  BD_get( &rdFrame, rcdIndex);
			// BD vacia
			if (bdGetStatus == 0) {
				break;
			}

			recCount++;

			// Armo el frame
			memset( cmd_printfBuff, NULL, CHAR128);
			pos = 0;
			pos = snprintf_P( &cmd_printfBuff, CHAR128, PSTR("(%d/%d)>" ), recCount, rcdIndex);
			pos += snprintf_P( &cmd_printfBuff[pos], CHAR128,PSTR( "%04d%02d%02d,"),rdFrame.rtc.year,rdFrame.rtc.month, rdFrame.rtc.day );
			pos += snprintf_P( &cmd_printfBuff[pos], CHAR128, PSTR("%02d%02d%02d,"),rdFrame.rtc.hour,rdFrame.rtc.min, rdFrame.rtc.sec );
			// Valores analogicos
			for ( channel = 0; channel < NRO_CHANNELS; channel++) {
				pos += snprintf_P( &cmd_printfBuff[pos], CHAR128, PSTR("%s=%.2f"),systemVars.aChName[channel],rdFrame.analogIn[channel] );
				pos += snprintf_P( &cmd_printfBuff[pos], CHAR128, PSTR(","));
			}
			// Valores digitales.
			pos += snprintf_P( &cmd_printfBuff[pos], CHAR128, PSTR("%s=%.2f,"), systemVars.dChName[0], rdFrame.din0_pCount );
			pos += snprintf_P( &cmd_printfBuff[pos], CHAR128,PSTR( "%s=%.2f"), systemVars.dChName[1], rdFrame.din0_pCount );
#ifdef CHANNELS_3
			// Bateria
			pos += snprintf_P( &cmd_printfBuff[pos], CHAR128, PSTR(",bt=%.2f"), rdFrame.batt );
#endif
			pos += snprintf_P( &cmd_printfBuff[pos], CHAR128,PSTR("<\r\n\0") );

			// Imprimo
			sp5K_printStr(&cmd_printfBuff);

			BD_delete(-1);
			taskYIELD();
		}

		snprintf_P( &cmd_printfBuff,CHAR128,PSTR("OK\r\n\0"));
		sp5K_printStr(&cmd_printfBuff);
		return;
	}

	// CMD NOT FOUND
	if (xSemaphoreTake( sem_CmdUart, MSTOTAKECMDUARTSEMPH ) == pdTRUE ) {
		rprintfProgStrM(CMD_UART, "ERROR\r\n");
		rprintfProgStrM(CMD_UART, "CMD NOT DEFINED\r\n");
		xSemaphoreGive( sem_CmdUart );
	}
	return;


}
Esempio n. 19
0
void SP5K_statusFunction(void)
{

RtcTimeType rtcDateTime;
u08 pos, channel;
u16 dialTimer;
u08 mStatus;
frameDataType frame;
u08 gprsState, gprsSubState, dataState;

	rtcGetTime(&rtcDateTime);
	getDataFrame(&frame);
	dialTimer = getTimeToNextDial();

	memset( &cmd_printfBuff, '\0', CHAR128);

	if (xSemaphoreTake( sem_CmdUart, MSTOTAKECMDUARTSEMPH ) == pdTRUE ) {

		snprintf_P( cmd_printfBuff,CHAR128,PSTR("\r\nSpymovil %s %s\0"), SP5K_MODELO, SP5K_VERSION);
		rprintfStr(CMD_UART, cmd_printfBuff );
		snprintf_P( cmd_printfBuff,CHAR128,PSTR(" %d-%s-%s\0"), NRO_CHANNELS, EE_TYPE, FTYPE);
		rprintfStr(CMD_UART, cmd_printfBuff );
		snprintf_P( cmd_printfBuff,CHAR128,PSTR(" %s %s\r\n\0"), SP5K_REV, SP5K_DATE );
		rprintfStr(CMD_UART, cmd_printfBuff );

		/* DlgId */
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("dlgid: %s\r\n\0"), systemVars.dlgId );
		rprintfStr(CMD_UART, cmd_printfBuff );

		/* Fecha y Hora */
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("rtc: %02d/%02d/%04d \0"),rtcDateTime.day,rtcDateTime.month, rtcDateTime.year );
		rprintfStr(CMD_UART, cmd_printfBuff );
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("%02d:%02d:%02d\r\n\0"),rtcDateTime.hour,rtcDateTime.min, rtcDateTime.sec );
		rprintfStr(CMD_UART, cmd_printfBuff );

		// SERVER ---------------------------------------------------------------------------------------
		snprintf_P( cmd_printfBuff,CHAR128,PSTR(">Server:\r\n\0"));
		rprintfStr(CMD_UART, cmd_printfBuff );

		/* APN */
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("  apn: %s\r\n\0"), systemVars.apn );
		rprintfStr(CMD_UART, cmd_printfBuff );

		/* SERVER IP:SERVER PORT */
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("  server ip:port: %s:%s\r\n\0"), systemVars.serverAddress,systemVars.serverPort );
		rprintfStr(CMD_UART, cmd_printfBuff );

		/* SERVER SCRIPT */
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("  server script: %s\r\n\0"), systemVars.serverScript );
		rprintfStr(CMD_UART, cmd_printfBuff );

		/* SERVER PASSWD */
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("  passwd: %s\r\n\0"), systemVars.passwd );
		rprintfStr(CMD_UART, cmd_printfBuff );

		// MODEM ---------------------------------------------------------------------------------------
		snprintf_P( cmd_printfBuff,CHAR128,PSTR(">Modem:\r\n\0"));
		rprintfStr(CMD_UART, cmd_printfBuff );

		/* Modem status */
		mStatus = getModemStatus();
		switch (mStatus) {
		case M_OFF:
			snprintf_P( cmd_printfBuff,CHAR128,PSTR("  modem: OFF\r\n\0"));
			break;
		case M_OFF_IDLE:
			snprintf_P( cmd_printfBuff,CHAR128,PSTR("  modem: OFF Idle\r\n\0"));
			break;
		case M_ON_CONFIG:
			snprintf_P( cmd_printfBuff,CHAR128,PSTR("  modem: ON & configurating.\r\n\0"));
			break;
		case M_ON_READY:
			snprintf_P( cmd_printfBuff,CHAR128,PSTR("  modem: ON & ready(apn,ip).\r\n\0"));
			break;
		default:
			snprintf_P( cmd_printfBuff,CHAR128,PSTR("  modem: ERROR\r\n\0"));
			break;
		}
		rprintfStr(CMD_UART, cmd_printfBuff );

		/* DLGIP */
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("  dlg ip: %s\r\n\0"), systemVars.dlgIp );
		rprintfStr(CMD_UART, cmd_printfBuff );

		/* CSQ */
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("  signalQ: csq=%d, dBm=%d\r\n\0"), systemVars.csq, systemVars.dbm );
		rprintfStr(CMD_UART, cmd_printfBuff );

		// DCD/RI/TERMSW
		if ( systemVars.dcd == 0 ) { pos = snprintf_P( cmd_printfBuff,CHAR128,PSTR("  pines: dcd=ON,\0")); }
		if ( systemVars.dcd == 1 ) { pos = snprintf_P( cmd_printfBuff,CHAR128,PSTR("  pines: dcd=OFF,\0"));}
		if ( systemVars.ri == 0 ) { pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("ri=ON,\0")); }
		if ( systemVars.ri == 1 ) { pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("ri=OFF,\0"));}
		if ( systemVars.termsw == 1 ) { pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("term=ON\r\n\0")); }
		if ( systemVars.termsw == 0 ) { pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("term=OFF\r\n\0"));}
		rprintfStr(CMD_UART, cmd_printfBuff );

		// SYSTEM ---------------------------------------------------------------------------------------
		snprintf_P( cmd_printfBuff,CHAR128,PSTR(">System:\r\n\0"));
		rprintfStr(CMD_UART, cmd_printfBuff );

		/* Memoria */
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("  memory: wrPtr=%d, rdPtr=%d, usedRec=%d, freeRecs=%d\r\n\0"), BD_getWRptr(), BD_getRDptr(), BD_getRcsUsed(), BD_getRcsFree() );
		rprintfStr(CMD_UART, cmd_printfBuff );

		/* WRK mode (NORMAL / SERVICE) */
		switch (systemVars.wrkMode) {
		case WK_NORMAL:
			snprintf_P( cmd_printfBuff,CHAR128,PSTR("  wrkmode: normal\r\n\0"));
			break;
		case WK_SERVICE:
			snprintf_P( &cmd_printfBuff,CHAR128,PSTR("  wrkmode: service\r\n\0"));
			break;
		case WK_MONITOR:
			snprintf_P( &cmd_printfBuff,CHAR128,PSTR("  wrkmode: monitor\r\n\0"));
			break;
		default:
			snprintf_P( cmd_printfBuff,CHAR128,PSTR("  wrkmode: ERROR\r\n\0"));
			break;
		}
		rprintfStr(CMD_UART, cmd_printfBuff );

		/* PWR mode (CONTINUO / DISCRETO) */
		switch (systemVars.pwrMode) {
		case PWR_CONTINUO:
			snprintf_P( cmd_printfBuff,CHAR128,PSTR("  pwrmode: continuo\r\n\0"));
			break;
		case PWR_DISCRETO:
			snprintf_P( cmd_printfBuff,CHAR128,PSTR("  pwrmode: discreto\r\n\0"));
			break;
		default:
			snprintf_P( cmd_printfBuff,CHAR128,PSTR("  pwrmode: ERROR\r\n\0"));

			break;
		}
		rprintfStr(CMD_UART, cmd_printfBuff );

#ifdef CHANNELS_3
		/* Consigna */
		switch (systemVars.consigna.tipo) {
		case CONS_NONE:
			snprintf_P( cmd_printfBuff,CHAR128,PSTR("  consigna: none\r\n\0"));
			break;
		case CONS_DOBLE:
			snprintf_P( cmd_printfBuff,CHAR128,PSTR("  consigna: doble (dia->%02d:%02d, noche->%02d:%02d)\r\n\0"), systemVars.consigna.hh_A,systemVars.consigna.mm_A,systemVars.consigna.hh_B,systemVars.consigna.mm_B );
			break;
		default:
			snprintf_P( cmd_printfBuff,CHAR128,PSTR("  consigna: ERROR\r\n\0"));
			break;
		}
		rprintfStr(CMD_UART, cmd_printfBuff );
#endif

		/* Timers */
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("  timerPoll: %d/%d\r\n\0"),systemVars.timerPoll, getTimeToNextPoll() );
		rprintfStr(CMD_UART, cmd_printfBuff );

		if (systemVars.pwrMode == PWR_CONTINUO ) {
			pos = snprintf_P( cmd_printfBuff,CHAR128,PSTR("  timerDial: -1(%d)/\0"),systemVars.timerDial );
		} else {
			pos = snprintf_P( cmd_printfBuff,CHAR128,PSTR("  timerDial: %d/\0"),systemVars.timerDial );
		}
		pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("%d\r\n\0"), dialTimer );
		rprintfStr(CMD_UART, cmd_printfBuff );

		snprintf_P( cmd_printfBuff,CHAR128,PSTR("  khTimer: %d\r\n\0"),houseKeepingTimer );
		rprintfStr(CMD_UART, cmd_printfBuff );

		// Debug Options.
		pos = snprintf_P( cmd_printfBuff,CHAR128,PSTR("  debugLevel: \0"));
		if ( systemVars.debugLevel == D_NONE) {
    		pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("none") );
    	} else {
    		if ( (systemVars.debugLevel & D_DATA) != 0) { pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("+data")); }
    		if ( (systemVars.debugLevel & D_GPRS) != 0) { pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("+gprs")); }
    		if ( (systemVars.debugLevel & D_BD) != 0)   { pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("+bd")); }
    		if ( (systemVars.debugLevel & D_I2C) != 0)  { pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("+i2c")); }
    		if ( (systemVars.debugLevel & D_DIGITAL) != 0)  { pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("+digital")); }
    	}
		snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("\r\n\0"));
		rprintfStr(CMD_UART, cmd_printfBuff );

		// Log Options
		pos = snprintf_P( cmd_printfBuff,CHAR128,PSTR("  logLevel: \0"));
		if ( systemVars.logLevel == LOG_NONE) { pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("none")); }
		if ( systemVars.logLevel == LOG_INFO) { pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("info")); }
		if ( systemVars.logLevel == LOG_WARN) { pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("warn")); }
		if ( systemVars.logLevel == LOG_ALERT) { pos += snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("alert")); }
		snprintf_P( &cmd_printfBuff[pos],CHAR128,PSTR("\r\n\0"));
		rprintfStr(CMD_UART, cmd_printfBuff );

		getStatusGprsSM( &gprsState, &gprsSubState);
		getStatusDataSM( &dataState );
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("  tkGprs:%d/%d, tkData:%d\r\n\0"), gprsState, gprsSubState, dataState);
		rprintfStr(CMD_UART, cmd_printfBuff );

		// CONFIG ---------------------------------------------------------------------------------------
		snprintf_P( cmd_printfBuff,CHAR128,PSTR(">Config:\r\n\0"));
		rprintfStr(CMD_UART, cmd_printfBuff );

		/* Configuracion del sistema */
		switch (mcpDevice) {
		case MCP23008:
			snprintf_P( cmd_printfBuff,CHAR128,PSTR("  analog=%d, digital=2.\r\n\0"),NRO_CHANNELS);
			break;
		case MCP23018:
			pos = snprintf_P( cmd_printfBuff,CHAR128,PSTR("  analog=%d, digital=2, valves=4.\r\n\0"),NRO_CHANNELS);
			break;
		default:
			snprintf_P( cmd_printfBuff,CHAR128,PSTR("ERROR !! No analog system detected\r\n\0"));
			break;
		}
		rprintfStr(CMD_UART, cmd_printfBuff );

#ifdef CHANNELS_3
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("  batt{0-15V}\r\n\0"));
		rprintfStr(CMD_UART, cmd_printfBuff );
#endif

		for ( channel = 0; channel < NRO_CHANNELS; channel++) {
			snprintf_P( cmd_printfBuff,CHAR128,PSTR("  a%d{%d-%dmA/%d-%d, %.2f/%.2f}(%s)\r\n\0"),channel, systemVars.Imin[channel],systemVars.Imax[channel],systemVars.Mmin[channel],systemVars.Mmax[channel], systemVars.offmmin[channel], systemVars.offmmax[channel], systemVars. aChName[channel] );
			rprintfStr(CMD_UART, cmd_printfBuff );
		}
		/* Configuracion de canales digitales */
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("  d0{%.2f p/p} (%s)\r\n\0"), systemVars.magPP[0],systemVars.dChName[0]);
		rprintfStr(CMD_UART, cmd_printfBuff );
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("  d1{%.2f p/p} (%s)\r\n\0"), systemVars.magPP[1],systemVars.dChName[1]);
		rprintfStr(CMD_UART, cmd_printfBuff );

		// VALUES ---------------------------------------------------------------------------------------
		snprintf_P( cmd_printfBuff,CHAR128,PSTR(">Values:\r\n\0"));
		rprintfStr(CMD_UART, cmd_printfBuff );

		pos = 0;
		// Armo el frame
		memset( &cmd_printfBuff, NULL, CHAR128);
		pos += snprintf_P( &cmd_printfBuff[pos], CHAR128,PSTR( "  %04d%02d%02d,"),frame.rtc.year,frame.rtc.month, frame.rtc.day );
		pos += snprintf_P( &cmd_printfBuff[pos], CHAR128, PSTR("%02d%02d%02d,"),frame.rtc.hour,frame.rtc.min, frame.rtc.sec );
		// Valores analogicos
		for ( channel = 0; channel < NRO_CHANNELS; channel++) {
			pos += snprintf_P( &cmd_printfBuff[pos], CHAR128, PSTR("%s=%.2f,"),systemVars.aChName[channel],frame.analogIn[channel] );
		}
		// Valores digitales.
		pos += snprintf_P( &cmd_printfBuff[pos], CHAR128, PSTR("%sP=%.2f,"),systemVars.dChName[0], frame.din0_pCount );
		pos += snprintf_P( &cmd_printfBuff[pos], CHAR128,PSTR( "%sP=%.2f"),  systemVars.dChName[1], frame.din1_pCount );

#ifdef CHANNELS_3
		// Bateria
		pos += snprintf_P( &cmd_printfBuff[pos], CHAR128, PSTR(",bt=%.2f%"),frame.batt );
#endif

		pos += snprintf_P( &cmd_printfBuff[pos], CHAR128,PSTR("\r\n\0") );
		// Imprimo
		rprintfStr(CMD_UART, &cmd_printfBuff );

		xSemaphoreGive( sem_CmdUart );
	}
}
Esempio n. 20
0
static void rtcRecv()
{
	//INFO("RTC Read command 0x%02X\n", (rtc.cmd >> 1));

	memset(&rtc.data[0], 0, sizeof(rtc.data));
	switch (rtc.cmd >> 1)
	{
		case 0:				// status register 1
			//INFO("RTC: read regstatus1 (0x%02X)\n", rtc.regStatus1);
			rtc.regStatus1 &= 0x0F;
			rtc.data[0] = rtc.regStatus1;
			//rtc.regStatus1 &= 0x7F;
			break;
		case 1:				// status register 2
			//INFO("RTC: read regstatus2 (0x%02X)\n", rtc.regStatus1);
			rtc.data[0] = rtc.regStatus2;
			break;
		case 2:				// date & time
			{
				//INFO("RTC: read date & time\n");
				DateTime tm = rtcGetTime();
				rtc.data[0] = toBCD(tm.get_Year() % 100);
				rtc.data[1] = toBCD(tm.get_Month());
				rtc.data[2] = toBCD(tm.get_Day());

				//zero 24-apr-2010 - this is nonsense.
				//but it is so wrong, someone mustve thought they knew what they were doing, so i am leaving it...
				//rtc.data[3] = (tm.tm_wday + 6) & 7;
				//if (rtc.data[3] == 7) rtc.data[3] = 6;

				//do this instead (gbatek seems to say monday=0 but i don't think that is right)
				//0=sunday is necessary to make animal crossing behave
				//maybe it means "custom assignment" can be specified by the game
				rtc.data[3] = tm.get_DayOfWeek();

				int hour = tm.get_Hour(); 
				if (!(rtc.regStatus1 & 0x02)) hour %= 12;
				rtc.data[4] = ((hour < 12) ? 0x00 : 0x40) | toBCD(hour);
				rtc.data[5] =  toBCD(tm.get_Minute());
				rtc.data[6] =  toBCD(tm.get_Second());
				break;
			}
		case 3:				// time
			{
				//INFO("RTC: read time\n");
				DateTime tm = rtcGetTime();
				int hour = tm.get_Hour(); 
				if (!(rtc.regStatus1 & 0x02)) hour %= 12;
				rtc.data[0] = ((hour < 12) ? 0x00 : 0x40) | toBCD(hour);
				rtc.data[1] =  toBCD(tm.get_Minute());
				rtc.data[2] =  toBCD(tm.get_Second());
				break;
			}
		case 4:				// freq/alarm 1
			/*if (cmdBitsSize[0x04] == 8)
				INFO("RTC: read INT1 freq\n");
			else
				INFO("RTC: read INT1 alarm1\n");*/
			//NDS_makeARM7Int(7);
			break;
		case 5:				// alarm 2
			//INFO("RTC: read alarm 2\n");
			break;
		case 6:				// clock adjust
			//INFO("RTC: read clock adjust\n");
			rtc.data[0] = rtc.regAdjustment;
			break;
		case 7:				// free register
			//INFO("RTC: read free register\n");
			rtc.data[0] = rtc.regFree;
			break;
	}
}
Esempio n. 21
0
static void rtcRecv()
{
	//INFO("RTC Read command 0x%02X\n", (rtc.cmd >> 1));

	memset(&rtc.data[0], 0, sizeof(rtc.data));
	switch (rtc.cmd >> 1)
	{
		case 0:				// status register 1
			//INFO("RTC: read regstatus1 (0x%02X)\n", rtc.regStatus1);
			rtc.regStatus1 &= 0x0F;
			rtc.data[0] = rtc.regStatus1;
			//rtc.regStatus1 &= 0x7F;
			break;
		case 1:				// status register 2
			//INFO("RTC: read regstatus2 (0x%02X)\n", rtc.regStatus1);
			rtc.data[0] = rtc.regStatus2;
			break;
		case 2:				// date & time
			{
				//INFO("RTC: read date & time\n");
				struct tm tm = rtcGetTime();
				rtc.data[0] = toBCD(tm.tm_year % 100);
				rtc.data[1] = toBCD(tm.tm_mon + 1);
				rtc.data[2] = toBCD(tm.tm_mday);
				rtc.data[3] = (tm.tm_wday + 7) & 7;
				if (rtc.data[3] == 7) rtc.data[3] = 6;
				if (!(rtc.regStatus1 & 0x02)) tm.tm_hour %= 12;
				rtc.data[4] = ((tm.tm_hour < 12) ? 0x00 : 0x40) | toBCD(tm.tm_hour);
				rtc.data[5] =  toBCD(tm.tm_min);
				rtc.data[6] =  toBCD(tm.tm_sec);
				break;
			}
		case 3:				// time
			{
				//INFO("RTC: read time\n");
				struct tm tm = rtcGetTime();
				if (!(rtc.regStatus1 & 0x02)) tm.tm_hour %= 12;
				rtc.data[0] = ((tm.tm_hour < 12) ? 0x00 : 0x40) | toBCD(tm.tm_hour);
				rtc.data[1] =  toBCD(tm.tm_min);
				rtc.data[2] =  toBCD(tm.tm_sec);
				break;
			}
		case 4:				// freq/alarm 1
			/*if (cmdBitsSize[0x04] == 8)
				INFO("RTC: read INT1 freq\n");
			else
				INFO("RTC: read INT1 alarm1\n");*/
			//NDS_makeARM7Int(7);
			break;
		case 5:				// alarm 2
			//INFO("RTC: read alarm 2\n");
			break;
		case 6:				// clock adjust
			//INFO("RTC: read clock adjust\n");
			rtc.data[0] = rtc.regAdjustment;
			break;
		case 7:				// free register
			//INFO("RTC: read free register\n");
			rtc.data[0] = rtc.regFree;
			break;
	}
}
Esempio n. 22
0
/**
 * @brief   Gets raw time from RTC and converts it to unix format.
 *
 * @param[in] rtcp      pointer to RTC driver structure
 * @return              Unix time value in seconds.
 *
 * @api
 */
time_t rtcGetTimeUnixSec(RTCDriver *rtcp) {
  RTCTime timespec = {0,0};

  rtcGetTime(rtcp, &timespec);
  return timespec.tv_sec;
}
Esempio n. 23
0
/**
 * @brief   Gets raw time from RTC and converts it to canonicalized format.
 *
 * @param[in] rtcp      pointer to RTC driver structure
 * @param[out] timp     pointer to a @p tm structure as defined in time.h
 *
 * @api
 */
void rtcGetTimeTm(RTCDriver *rtcp, struct tm *timp) {
  RTCTime timespec = {0,0};

  rtcGetTime(rtcp, &timespec);
  localtime_r((time_t *)&(timespec.tv_sec), timp);
}
Esempio n. 24
0
void setStartTime(void)
{
	rtcGetTime(RTC_DRIVER, &timespec);
	rtcConvertDateTimeToStructTm(&timespec, &startTime,0);
}
Esempio n. 25
0
void VcountHandler()
{
	static int lastbut = -1;
	uint8 ct[sizeof(IPC->time.rtc)];
	
	uint16 but=0, x=0, y=0, xpx=0, ypx=0, z1=0, z2=0;

	but = REG_KEYXY;

	if(!((but ^ lastbut) & (1<<6)))
	{
		tempPos = touchReadXY();
		if(tempPos.x == 0 || tempPos.y == 0)
		{
			but |= (1 <<6);
			lastbut = but;
		}
		else
		{
			x = tempPos.x;
			y = tempPos.y;
			xpx = tempPos.px;
			ypx = tempPos.py;
			z1 = tempPos.z1;
			z2 = tempPos.z2;
		}
	}
	else
	{
		lastbut = but;
		but |= (1 <<6);
	}

	if(vcount == 80)
	{
		first = tempPos;
	}
	else
	{
		if(abs(xpx - first.px) > 10 || abs(ypx - first.py) > 10 || (but & (1<<6)))
		{
			but |= (1 <<6);
			lastbut = but;
		}
		else
		{ 	
			IPC->mailBusy = 1;
			IPC->touchX			= x;
			IPC->touchY			= y;
			IPC->touchXpx		= xpx;
			IPC->touchYpx		= ypx;
			IPC->touchZ1		= z1;
			IPC->touchZ2		= z2;
			IPC->mailBusy = 0;
		}
	}
    // Read the time
    rtcGetTime((uint8 *)ct);
    BCDToInteger((uint8 *)&(ct[1]), 7); 
	u8 i;
	u8 *temp;
	temp = (u8*)&IPC->time.rtc;
	for(i=0; i<sizeof(ct); i++)
	{
		temp[i] = ct[i];
	} 

	IPC->buttons		= but;
	vcount ^= (80 ^ 130);
	SetYtrigger(vcount);
}