/* * kernel.c * * Created on: 13.09.2011 * Author: Roland */ #include "Types.h" #include "FreeRTOS.h" #include "queue.h" #include "uart.h" #define kernel_TASK_PRIORITY ( tskIDLE_PRIORITY + 5 ) #define kernel_TASK_STACK_SIZE ( ( unsigned short ) 64 ) void UARTSend(uint8_t *BufferPtr, uint32_t Length); /* Globals */ #define BUFSIZE 0x40 // fixme: ...is sdefined in hart.h static Task_Param_t kernel_Param; extern volatile uint32_t UARTCount; extern volatile uint8_t UARTBuffer[BUFSIZE]; /* * Wake up other tasks, send them messages telling what to do, * wait for them to have processed the commands or not, maybe * put them to sleep again, ... * */ static void kernel_Process_Task(void *Param) { Message_t RcvMsg; Message_t SndMsg; portTickType tick; portCHAR chBufCam[10] = "Seas Cam!"; portCHAR chBufLSen[10] = "Seas LSe!"; portCHAR l = 'l'; if(NULL == kernel_Param.QueueHandles.hxq_Kernel) { return; } tick = xTaskGetTickCount(); while(1) { vTaskDelayUntil(&tick, MS(3)); if( xQueueReceive( kernel_Param.QueueHandles.hxq_Kernel, &RcvMsg, MS(5))) { /* * switch Msg.Sender and act accordingly. */ switch (RcvMsg.Sender) { case Sender_Camera: { SndMsg.Sender = Sender_Kernel; SndMsg.pData = chBufCam; xQueueSend(kernel_Param.QueueHandles.hxq_Camera, &SndMsg, MS(10)); break; } case Sender_LightSens: { SndMsg.Sender = Sender_Kernel; SndMsg.pData = chBufLSen; for(l = 0; l < 8; l ++) { UARTBuffer[l*4 +0] = 48+(((uint8_t *)(RcvMsg.pData))[l])%1000 / 100; UARTBuffer[l*4 +1] = 48+(((uint8_t *)(RcvMsg.pData))[l])%100 / 10; UARTBuffer[l*4 +2] = 48+(((uint8_t *)(RcvMsg.pData))[l])%10; UARTBuffer[l*4 +3] = ' '; } UARTCount = 34; UARTBuffer[32] = '\r'; UARTBuffer[33] = '\n'; UARTSend( (uint8_t *)UARTBuffer, UARTCount ); // UARTSend( (uint8_t *)(RcvMsg.pData), 10 ); // xQueueSend(kernel_Param.QueueHandles.hxq_LightSens, &SndMsg, MS(10)); break; } case Sender_UART: { if (UARTBuffer[UARTCount-1] != 'i') break; if ( UARTCount != 0 ) { LPC_UART->IER = IER_THRE | IER_RLS; /* Disable RBR */ UARTSend( (uint8_t *)UARTBuffer, UARTCount ); UARTCount = 0; LPC_UART->IER = IER_THRE | IER_RLS | IER_RBR; /* Re-enable RBR */ l = 'r'; SndMsg.pData = &l; xQueueSend(kernel_Param.QueueHandles.hxq_LightSens, &SndMsg, MS(10)); } break; } default: {;} } } } } Status_t kernel_Init_Kernel(QH_t hxQueues) { portBASE_TYPE xResult; xResult = xTaskCreate( kernel_Process_Task, (signed char *) "Kernel", kernel_TASK_STACK_SIZE, &kernel_Param, kernel_TASK_PRIORITY, &(kernel_Param.hxTask_Self) ); kernel_Param.QueueHandles = hxQueues; /*TODO: check for success and pass it over to caller. */ return STATUS_OK; }