//------------------------------------------------------------------------------------ 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(); } }
/*------------------------------------------------------------------------------ * 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 */ } }
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(); } }
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); } } } }