diff options
Diffstat (limited to 'software/mpu.old/src/kernel.c')
-rw-r--r-- | software/mpu.old/src/kernel.c | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/software/mpu.old/src/kernel.c b/software/mpu.old/src/kernel.c new file mode 100644 index 0000000..f5d04ea --- /dev/null +++ b/software/mpu.old/src/kernel.c @@ -0,0 +1,117 @@ +/*
+ * 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;
+}
|