//------------------------------------------------------------------------------------
void tkControl(void * pvParameters)
{

( void ) pvParameters;
TickType_t xLastWakeTime;
const TickType_t sleepTime = ( 1000 / portTICK_RATE_MS );
u16 ffRcd;
StatBuffer_t pxFFStatBuffer;

	vTaskDelay( ( TickType_t)( 500 / portTICK_RATE_MS ) );

	MCP_init();			// Esto prende la terminal.
	pv_wdgInit();

	// inicializo la memoria EE ( fileSysyem)
	ffRcd = FF_fopen();
	FF_stat(&pxFFStatBuffer);
	if ( pxFFStatBuffer.errno != pdFF_ERRNO_NONE ) {
		snprintf_P( ctl_printfBuff,sizeof(ctl_printfBuff),PSTR("FSInit ERROR (%d)[%d]\r\n\0"),ffRcd, pxFFStatBuffer.errno);
	} else {
		snprintf_P( ctl_printfBuff,sizeof(ctl_printfBuff),PSTR("FSInit OK\r\nMEMsize=%d, wrPtr=%d,rdPtr=%d,delPtr=%d,Free=%d,4del=%d\r\n\0"),FF_MAX_RCDS, pxFFStatBuffer.HEAD,pxFFStatBuffer.RD, pxFFStatBuffer.TAIL,pxFFStatBuffer.rcdsFree,pxFFStatBuffer.rcds4del);
	}
	FreeRTOS_write( &pdUART1, ctl_printfBuff, sizeof(ctl_printfBuff) );

	// load systemVars
	if  ( u_loadSystemParams() == TRUE ) {
		snprintf_P( ctl_printfBuff,sizeof(ctl_printfBuff),PSTR("Load config OK.\r\n\0") );
	} else {
		u_loadDefaults();
		u_saveSystemParams();
		snprintf_P( ctl_printfBuff,sizeof(ctl_printfBuff),PSTR("Load config ERROR: defaults !!\r\n\0") );
	}
	FreeRTOS_write( &pdUART1, ctl_printfBuff, sizeof(ctl_printfBuff) );

	snprintf_P( ctl_printfBuff,sizeof(ctl_printfBuff),PSTR("starting tkControl..\r\n\0"));
	FreeRTOS_write( &pdUART1, ctl_printfBuff, sizeof(ctl_printfBuff) );

	// Habilito arrancar las otras tareas
	startTask = TRUE;

	// Loop
	for( ;; )
	{

		u_clearWdg(WDG_CTL);

		// Ejecuto la rutina sincronicamente c/1s
		// Wait for 1000ms.
		vTaskDelayUntil( &xLastWakeTime, sleepTime );
		xLastWakeTime = xTaskGetTickCount();

		pv_flashLeds();
		pv_checkWdg();
		pv_dailyReset();

	}
}
Example #2
0
/*------------------------------------------------------------------------------
 * Main Program
 *----------------------------------------------------------------------------*/
int main(void) {
	uartInit(12);		/* baudrate 38400 */
	sei();
	MCP_init();
	
	uartPutString("MCP2515 CAN Test\n");
	
	/* request configuration mode */
	MCP_WRITE_B(CANCTRL, CANCTRL_REQOP, REQOP_CONFIG);
	
	/* configure SJW and Tq duration */
	MCP_WRITE_B(CNF1, CNF1_SJW, 4-1); 	/* SJW = X-1 [Tq] */
	MCP_WRITE_B(CNF1, CNF1_BRP, 0);		/* Tq = 2*(X+1)/FOSC [s] */
	
	/* configure phase seg1 and propseg */
	MCP_WRITE_B(CNF2, CNF2_BTLMODE, 1);
	MCP_WRITE_B(CNF2, CNF2_SAM, 1);
	MCP_WRITE_B(CNF2, CNF2_PHSEG1, 4-1);	/* PHSEG1 = X-1 [Tq] */
	MCP_WRITE_B(CNF2, CNF2_PRSEG, 4-1);		/* PRSEG = X-1 [Tq] */
	
	/* configure phase seg2 and wakeup filter */
	MCP_WRITE_B(CNF3, CNF3_WAKFIL, 1);
	MCP_WRITE_B(CNF3, CNF3_PHSEG2, 4-1);	/* PHSEG2 = X-1 [Tq] */
	
	/* configure interrupts */
	MCP_WRITE_R(CANINTE, 0);
	
	// Mark all filter bits as don't care:
    mcp_write_can_id(RXMnSIDH(0), 1, 0);
    mcp_write_can_id(RXMnSIDH(1), 1, 0);
    // Anyway, set all filters to 0:
    mcp_write_can_id(RXF0SIDH, 0, 0);
    mcp_write_can_id(RXF1SIDH, 0, 0);
    mcp_write_can_id(RXF2SIDH, 0, 0);
    mcp_write_can_id(RXF3SIDH, 0, 0);
    mcp_write_can_id(RXF4SIDH, 0, 0);
    mcp_write_can_id(RXF5SIDH, 0, 0);
	
	/* request loopback mode */
	MCP_WRITE_B(CANCTRL, CANCTRL_REQOP, REQOP_LOOPBACK);
	
	uint8_t tmp = MCP_read(CANCTRL);
	uartPutString("CANCTRL = ");
	uartPutUInt8(tmp, 2);
	uartPutString("\n");
	tmp = MCP_read(CANSTAT);
	uartPutString("CANSTAT = ");
	uartPutUInt8(tmp, 2);
	uartPutString("\n");
	tmp = MCP_read(CNF1);
	uartPutString("CNF1 = ");
	uartPutUInt8(tmp, 2);
	uartPutString("\n");
	tmp = MCP_read(CNF2);
	uartPutString("CNF2 = ");
	uartPutUInt8(tmp, 2);
	uartPutString("\n");
	tmp = MCP_read(CNF3);
	uartPutString("CNF3 = ");
	uartPutUInt8(tmp, 2);
	uartPutString("\n");
	tmp = MCP_read(CANINTE);
	uartPutString("CANINTE = ");
	uartPutUInt8(tmp, 2);
	uartPutString("\n");
	
	/* main loop */
	while(1) {
		/* do nothing */
		
	}
}
Example #3
0
void tkCmd(void * pvParameters)
{

u08 c;

( void ) pvParameters;

	// !!! Requiere que este inicializado el FRTOS porque usa semaforos.
	MCP_init();		// IO ports for hardware

	vTaskDelay( (portTickType)( 1000 / portTICK_RATE_MS ) );

	initDebugRtc();
	initBlueTooth();

	vt100ClearScreen(CMD_UART);

	// Inicializo los parametros de trabajo ( leo la internal EE ).
	loadSystemParams();

	// Inicializo la memoria. Leo el estado de los punteros ( leo la external EE).
	BD_init();
	//
	vTaskDelay( (portTickType)( 100 / portTICK_RATE_MS ) );
	snprintf_P( cmd_printfBuff,CHAR128,PSTR("\r\n.INIT EEmem BD: wrPtr=%d, rdPtr=%d, recUsed=%d, recFree=%d\r\n\0"),  BD_getWRptr(),  BD_getRDptr(), BD_getRcsUsed(), BD_getRcsFree() );
	logPrintStr(LOG_NONE, cmd_printfBuff);
	switch (mcpDevice) {
	case MCP23008:
#ifdef CHANNELS_3
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("System: 3 analogIn,2 digitalIn\r\n\0"));
#endif
#ifdef CHANNELS_8
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("System: 8 analogIn,2 digitalIn\r\n\0"));
#endif
		break;
	case MCP23018:
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("System: 3 analogIn,2 digitalIn,4 valves\r\n\0"));
		break;
	default:
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("ERROR !! No analog system detected\r\n\0"));
		break;
	}
	logPrintStr(LOG_NONE, cmd_printfBuff);

	// Inicializo el sistema de consignas.
	initConsignas();
	switch (systemVars.consigna.tipo) {
	case CONS_NONE:
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("Init consignas: none\r\n\0"));
		break;
	case CONS_DOBLE:
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("Init consignas: doble\r\n\0"));
		break;
	default:
		snprintf_P( cmd_printfBuff,CHAR128,PSTR("Init consignas: ERROR\r\n\0"));
		break;
	}
	logPrintStr(LOG_NONE, cmd_printfBuff);
	//


	// Init Banner.
	snprintf_P( cmd_printfBuff,CHAR128,PSTR("\r\nSpymovil %s %s"), SP5K_MODELO, SP5K_VERSION);
	logPrintStr(LOG_NONE, cmd_printfBuff);
	snprintf_P( cmd_printfBuff,CHAR128,PSTR(" %d-%s-%s"), NRO_CHANNELS, EE_TYPE, FTYPE);
	logPrintStr(LOG_NONE, cmd_printfBuff);
	snprintf_P( cmd_printfBuff,CHAR128,PSTR(" %s %s\r\n\0"), SP5K_REV, SP5K_DATE );
	logPrintStr(LOG_NONE, cmd_printfBuff);

#ifdef MEMINFO
	snprintf_P( &cmd_printfBuff,CHAR128,PSTR("HE_Uart0TxQueue=%lu\r\n\0"), HE_Uart0TxQueue );
	logPrintStr(LOG_NONE, &cmd_printfBuff);
	snprintf_P( &cmd_printfBuff,CHAR128,PSTR("HE_Uart1RxQueue=%lu\r\n\0"), HE_Uart1RxQueue );
	logPrintStr(LOG_NONE, &cmd_printfBuff);
	snprintf_P( &cmd_printfBuff,CHAR128,PSTR("HE_Uart1TxQueue=%lu\r\n\0"), HE_Uart1TxQueue );
	logPrintStr(LOG_NONE, &cmd_printfBuff);
	snprintf_P( &cmd_printfBuff,CHAR128,PSTR("HE_I2Cbus=%lu\r\n\0"), HE_I2Cbus );
	logPrintStr(LOG_NONE, &cmd_printfBuff);
	snprintf_P( &cmd_printfBuff,CHAR128,PSTR("HE_CmdUart=%lu\r\n\0"), HE_CmdUart );
	logPrintStr(LOG_NONE, &cmd_printfBuff);
	snprintf_P( &cmd_printfBuff,CHAR128,PSTR("HE_GprsUart=%lu\r\n\0"), HE_GprsUart );
	logPrintStr(LOG_NONE, &cmd_printfBuff);
	snprintf_P( &cmd_printfBuff,CHAR128,PSTR("HE_digitalIn=%lu\r\n\0"), HE_digitalIn );
	logPrintStr(LOG_NONE, &cmd_printfBuff);
	snprintf_P( &cmd_printfBuff,CHAR128,PSTR("HE_systemVars=%lu\r\n\0"), HE_systemVars );
	logPrintStr(LOG_NONE, &cmd_printfBuff);
	snprintf_P( &cmd_printfBuff,CHAR128,PSTR("HE_BD=%lu\r\n\0"), HE_BD );
	logPrintStr(LOG_NONE, &cmd_printfBuff);
	snprintf_P( &cmd_printfBuff,CHAR128,PSTR("HE_tkCmd=%lu\r\n\0"), HE_tkCmd );
	logPrintStr(LOG_NONE, &cmd_printfBuff);
	snprintf_P( &cmd_printfBuff,CHAR128,PSTR("HE_tkDigitalIn=%lu\r\n\0"), HE_tkDigitalIn );
	logPrintStr(LOG_NONE, &cmd_printfBuff);
	snprintf_P( &cmd_printfBuff,CHAR128,PSTR("HE_tkData=%lu\r\n\0"), HE_tkData );
	logPrintStr(LOG_NONE, &cmd_printfBuff);
	snprintf_P( &cmd_printfBuff,CHAR128,PSTR("HE_tkControl=%lu\r\n\0"), HE_tkControl );
	logPrintStr(LOG_NONE, &cmd_printfBuff);
	snprintf_P( &cmd_printfBuff,CHAR128,PSTR("HE_tkGprs=%lu\r\n\0"), HE_tkGprs );
	logPrintStr(LOG_NONE, &cmd_printfBuff);

#endif

	// Habilito al resto del sistema a arrancar
	if (xSemaphoreTake( sem_systemVars, MSTOTAKESYSTEMVARSSEMPH ) == pdTRUE ) {
		systemVars.initStatus = TRUE;
		xSemaphoreGive( sem_systemVars );
	}

	for( ;; )
	{

		// Para medir el uso del stack
		tkCmd_uxHighWaterMark = uxTaskGetStackHighWaterMark( NULL );

		clearWdg(WDG_CMD);
		while(xUartGetChar(CMD_UART, &c, (50 / portTICK_RATE_MS ) ) ) {
			cmdlineInputFunc(c);
			// Cada caracer recibido reinicio el timer.
			restartTimerTerminal();
		}
		/* run the cmdline execution functions */
		cmdlineMainLoop();

	}

}
Example #4
0
void tkControl(void * pvParameters)
{

( void ) pvParameters;
BaseType_t xResult;
uint32_t ulNotifiedValue;

	MCP_init();

	// TERMINAL: Debe ser lo primero que incia para poder mandar mensajes de log.
	ac_terminal(INIT_TERM, NULL);

	loadSystemParams();

	// WATCHDOG
	ac_wdg( INIT_WDG );

	// LEDS
	ac_systemLeds( INIT_LED );

	// EXITWRKMODE2NORMAL
	ac_exitWrkMode2Normal(INIT_EWM2N);

	// MEMORIA
	MEM_init();
	snprintf_P( ctl_printfBuff,CHAR256,PSTR("Init memory: pWr=%d,pRd=%d,pDel=%d,free=%d,4rd=%d,4del=%d  \r\n"), MEM_getWrPtr(), MEM_getRdPtr(), MEM_getDELptr(), MEM_getRcdsFree(),MEM_getRcds4rd(),MEM_getRcds4del() );
	TERMrprintfStr( ctl_printfBuff );

	// Habilito arrancar otras tareas
	startToken = STOK_TIMERS;

	// Espero la notificacion para arrancar
	while ( startToken != STOK_CTL ) {
		vTaskDelay( ( TickType_t)( 100 / portTICK_RATE_MS ) );
	}
	TERMrprintfProgStrM("starting tkControl..\r\n");
	startToken++;

	// Loop
	for( ;; )
	{
		clearWdg(WDG_CTL);

		// LED
		ac_systemLeds(TOGGLE_LED);

		// WATCHDOG
		ac_wdg(CHECK_WDG);

		// TERMINAL
		ac_terminal(CHECK_TERM, NULL);

		// EXITWRKMODE2NORMAL
		ac_exitWrkMode2Normal(CHECK_EWM2N);

		// Genero una espera de 100ms por algun mensaje para hacer algo.
		xResult = xTaskNotifyWait( 0x00,          	 				/* Don't clear bits on entry. */
		                           ULONG_MAX,        				/* Clear all bits on exit. */
		                           &ulNotifiedValue, 				/* Stores the notified value. */
								   (100 / portTICK_RATE_MS ) );

		if( xResult == pdTRUE ) {
			// Arrancar el timer y control de modo service/monitor
			if ( ( ulNotifiedValue & CTLMSG_STARTEWM2N ) != 0 ) {
				ac_exitWrkMode2Normal(START_EWM2N);
		    }

		 }
	}
}