/*------------------------------------------------------------------------------------*/ void tkDigitalIn(void * pvParameters) { ( void ) pvParameters; // Los pines del micro que resetean los latches de caudal son salidas. sbi(Q_DDR, Q0_CTL_PIN); sbi(Q_DDR, Q1_CTL_PIN); // Espero la notificacion para arrancar while ( startToken != STOK_DIN ) { vTaskDelay( ( TickType_t)( 100 / portTICK_RATE_MS ) ); } TERMrprintfProgStrM("starting tkDigitalIn..\r\n"); startToken++; // Determino que tipo de placa analogica tengo. mcpDevice = getMcpDevice(); // Inicializo los latches borrandolos pvClearQ0(); pvClearQ1(); dInputs.din0_level = 0; dInputs.din1_level = 0; dInputs.din0_pulses = 0; dInputs.din1_pulses = 0; dInputs.din0_width = 0; dInputs.din1_width = 0; MCP_queryDcd(&systemVars.dcd); for( ;; ) { clearWdg(WDG_DIN); vTaskDelay( ( TickType_t)( 100 / portTICK_RATE_MS ) ); pvPollDcd(); if ( mcpDevice == MCP23018 ) pvPollQ(); } }
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); } } } }