voor willem test

Dependencies:   4DGL MODSERIAL mbed mbos

Committer:
LvdK
Date:
Thu Jul 17 10:09:14 2014 +0000
Revision:
7:6576a287e563
Parent:
6:e0bf3b244d7c
CDU V21

Who changed what in which revision?

UserRevisionLine numberNew contents of line
LvdK 7:6576a287e563 1 // L. van der Kolk, W.Braat
LvdK 7:6576a287e563 2 // File: main.cpp
LvdK 7:6576a287e563 3 // Version 21
LvdK 7:6576a287e563 4 // ----------------------------
LvdK 5:99594f4ab659 5
LvdK 0:6f71ca095e78 6 #include "mbed.h"
LvdK 6:e0bf3b244d7c 7 #include "MODSERIAL.h"
LvdK 6:e0bf3b244d7c 8 #include "mbos.h"
LvdK 7:6576a287e563 9 #include "debug_lvdk.h" // : debug mode control LvdK
LvdK 7:6576a287e563 10 #include "mbos_def.h" // : Mbos tasks, timer and resource definitions
LvdK 6:e0bf3b244d7c 11
LvdK 7:6576a287e563 12 // Setup USB communication defined by Mbed USB TX and RX lines
LvdK 7:6576a287e563 13 // with TX and RX ringbuffers :
LvdK 7:6576a287e563 14 MODSERIAL USB(USBTX, USBRX, 256, 512);
LvdK 7:6576a287e563 15 DigitalOut alive_led(LED1); // : LED 1 on Mbed board toggles when CDU is alive
LvdK 7:6576a287e563 16
LvdK 7:6576a287e563 17 //DigitalOut test_led(LED4); // : LED 4 on Mbed board <<<<<<<< TEST LED !!!
LvdK 6:e0bf3b244d7c 18
LvdK 7:6576a287e563 19 void test_update_flags(); // << for testing only << !!!!!!!
LvdK 7:6576a287e563 20
LvdK 7:6576a287e563 21 // extra serial port to show debug info :
LvdK 7:6576a287e563 22 MODSERIAL SERIAL_DEBUG(p9, p10, 1024, 64); //: tx, rx
LvdK 7:6576a287e563 23
LvdK 6:e0bf3b244d7c 24 int CDU_FS_interface = 0; // : defines interface to FS: 0 = USB, 1 = Ethernet
LvdK 7:6576a287e563 25 extern int key_hit_ID;
LvdK 7:6576a287e563 26 extern PwmOut BGL_LED;
LvdK 0:6f71ca095e78 27
LvdK 7:6576a287e563 28 void init_USB(void);
LvdK 7:6576a287e563 29 void set_initial_data(); // : fill datastructures with initial data
LvdK 7:6576a287e563 30 void Send_KEY_message(int button);
LvdK 6:e0bf3b244d7c 31 void Send_ALIVE_message(int seconds);
LvdK 6:e0bf3b244d7c 32 void collect_FSdata();
LvdK 6:e0bf3b244d7c 33
LvdK 7:6576a287e563 34 mbos CDU_OS( 9, 5, 5); // : instantiate mbos O.S (tasks, timers, resources)
LvdK 6:e0bf3b244d7c 35
LvdK 7:6576a287e563 36 // Task function prototypes:
LvdK 7:6576a287e563 37 void ALIVE_TASK(void);
LvdK 7:6576a287e563 38 void RECEIVE_DECODE_TASK(void);
LvdK 7:6576a287e563 39 void SEND_KEYMESSAGE_TASK(void);
LvdK 7:6576a287e563 40 void CDU_DSP_CSS_TASK(void);
LvdK 7:6576a287e563 41 void READ_POT_TASK(void);
LvdK 6:e0bf3b244d7c 42
LvdK 7:6576a287e563 43 // keyboard function prototypes:
LvdK 7:6576a287e563 44 void CDU_KB_COMM_INIT(void);
LvdK 7:6576a287e563 45 void CDU_KB_INT_START(void);
LvdK 7:6576a287e563 46 void CDU_KB_GET_KEY(void);
LvdK 7:6576a287e563 47 void CDU_SET_BGL_INTENSITY(int);
LvdK 6:e0bf3b244d7c 48
LvdK 7:6576a287e563 49 // display function prototype:
LvdK 7:6576a287e563 50 void CDU_InitDisplay(void);
LvdK 7:6576a287e563 51 void CDU_ScreenAlign(void);
LvdK 7:6576a287e563 52 void CDU_StartScreen(void);
LvdK 7:6576a287e563 53 void CDU_Page(void);
LvdK 7:6576a287e563 54 void CDU_DSP_CSS(void);
LvdK 7:6576a287e563 55 void CDU_displayclear(void);
LvdK 6:e0bf3b244d7c 56
LvdK 6:e0bf3b244d7c 57
LvdK 7:6576a287e563 58 void char_received(MODSERIAL_IRQ_INFO *q)
LvdK 7:6576a287e563 59 {
LvdK 7:6576a287e563 60 // -- This functiom will be called on EACH USB receive interrupt --
LvdK 7:6576a287e563 61 // It only sets an mbos Event:
LvdK 6:e0bf3b244d7c 62 CDU_OS.SetEvent(RX_EVENT,RECEIVE_DECODE_TASK_ID); // : set event flag for Read Serial Task
LvdK 6:e0bf3b244d7c 63 }
LvdK 6:e0bf3b244d7c 64
LvdK 7:6576a287e563 65 //------------ USB error interrupts ----------------------------------
LvdK 7:6576a287e563 66 void rx_buf_overflow(MODSERIAL_IRQ_INFO *q)
LvdK 7:6576a287e563 67 {
LvdK 7:6576a287e563 68 // This functiom will be called when RX buffer overflows.
LvdK 7:6576a287e563 69 // Blue-Leds-of-Death will be showed on Mbed board
LvdK 7:6576a287e563 70 error("RX OVERFLOW !");
LvdK 6:e0bf3b244d7c 71 }
LvdK 6:e0bf3b244d7c 72
LvdK 7:6576a287e563 73 void tx_buf_overflow(MODSERIAL_IRQ_INFO *q)
LvdK 7:6576a287e563 74 {
LvdK 7:6576a287e563 75 // This functiom will be called when TX buffer overflows.
LvdK 7:6576a287e563 76 // Blue-Leds-of-Death will be showed on Mbed board
LvdK 7:6576a287e563 77 error("RX OVERFLOW !");
LvdK 6:e0bf3b244d7c 78 }
LvdK 7:6576a287e563 79 //--------------------------------------------------------------------
LvdK 6:e0bf3b244d7c 80
LvdK 6:e0bf3b244d7c 81 void init_USB()
LvdK 7:6576a287e563 82 {
LvdK 7:6576a287e563 83 // -- This function controls the setup for the CDU-FS USB communication --
LvdK 7:6576a287e563 84 // Function char_received() will be attached to RX interrupt.
LvdK 7:6576a287e563 85 USB.baud(38400); // : set default baudrate to 38400
LvdK 7:6576a287e563 86 USB.rxBufferFlush(); // : empty USB rx buffer in case it is not empty:
LvdK 7:6576a287e563 87 USB.txBufferFlush(); // : empty USB tx buffer in case it is not empty:
LvdK 7:6576a287e563 88 USB.attach(&char_received, MODSERIAL::RxIrq); // : attach function char_received to USB RX inerrupt
LvdK 7:6576a287e563 89 USB.attach(&rx_buf_overflow, MODSERIAL::RxOvIrq); // : attach function to call when USB RX buffer overflows
LvdK 7:6576a287e563 90 USB.attach(&tx_buf_overflow, MODSERIAL::TxOvIrq); // : attach function to call when USB TX buffer overflows
LvdK 6:e0bf3b244d7c 91 }
LvdK 7:6576a287e563 92
LvdK 7:6576a287e563 93 main() // : MBOS main()
LvdK 0:6f71ca095e78 94 {
LvdK 7:6576a287e563 95 init_USB(); // : setup USB communication to FS
LvdK 7:6576a287e563 96
LvdK 7:6576a287e563 97 // Keyboard initialisation and keyboard interrrupt setup:
LvdK 7:6576a287e563 98 CDU_KB_COMM_INIT();
LvdK 7:6576a287e563 99 CDU_KB_INT_START();
LvdK 7:6576a287e563 100 BGL_LED.period(0.01);
LvdK 5:99594f4ab659 101
LvdK 7:6576a287e563 102 // Display initialisation:
LvdK 7:6576a287e563 103 CDU_InitDisplay();
LvdK 7:6576a287e563 104 CDU_StartScreen();
LvdK 7:6576a287e563 105 wait(1);
LvdK 7:6576a287e563 106 CDU_Page();
LvdK 7:6576a287e563 107 CDU_ScreenAlign();
LvdK 7:6576a287e563 108 wait(1);
LvdK 7:6576a287e563 109
LvdK 7:6576a287e563 110
LvdK 7:6576a287e563 111 set_initial_data(); //: fill FS datastructures with initial (dummy) data
LvdK 7:6576a287e563 112
LvdK 7:6576a287e563 113 #ifdef DEBUG_LVDK
LvdK 7:6576a287e563 114 //------------------ Testing only ! ----------------------------------
LvdK 7:6576a287e563 115 init_buttons_Mbed();
LvdK 7:6576a287e563 116 USB.printf("\n--- CDU_Mbed_21 ---\r\n");
LvdK 7:6576a287e563 117 #endif
LvdK 7:6576a287e563 118 //---------------------------------------------------------------------
LvdK 7:6576a287e563 119
LvdK 7:6576a287e563 120 SERIAL_DEBUG.baud(38400); // : set baudrate to 38400
LvdK 7:6576a287e563 121 SERIAL_DEBUG.printf("\n--- CDU_Mbed_21 ---\r\n");
LvdK 7:6576a287e563 122
LvdK 7:6576a287e563 123 // Create all tasks and timers:
LvdK 7:6576a287e563 124 CDU_OS.CreateTask(ALIVE_TASK_ID, ALIVE_TASK_PRIO, ALIVE_TASK_STACK_SZ, ALIVE_TASK);
LvdK 7:6576a287e563 125 CDU_OS.CreateTask(RECEIVE_DECODE_TASK_ID, RECEIVE_DECODE_TASK_PRIO, RECEIVE_DECODE_TASK_STACK_SZ, RECEIVE_DECODE_TASK);
LvdK 7:6576a287e563 126 CDU_OS.CreateTask(SEND_KEYMESSAGE_TASK_ID, SEND_KEYMESSAGE_TASK_PRIO, SEND_KEYMESSAGE_TASK_STACK_SZ, SEND_KEYMESSAGE_TASK);
LvdK 7:6576a287e563 127 CDU_OS.CreateTask(CDU_DSP_CSS_TASK_ID, CDU_DSP_CSS_TASK_PRIO, CDU_DSP_CSS_TASK_STACK_SZ, CDU_DSP_CSS_TASK );
LvdK 7:6576a287e563 128 CDU_OS.CreateTimer(ALIVE_TIMER_ID, ALIVE_TASK_ID, ALIVE_EVENT);
LvdK 7:6576a287e563 129 CDU_OS.CreateTask(READ_POT_TASK_ID, READ_POT_TASK_PRIO, READ_POT_TASK_STACK_SZ, READ_POT_TASK );
LvdK 7:6576a287e563 130 CDU_OS.CreateTimer(READ_POT_TIMER_ID, READ_POT_TASK_ID, READ_POT_TIMER_EVENT);
LvdK 7:6576a287e563 131
LvdK 7:6576a287e563 132 // Create resources:
LvdK 7:6576a287e563 133 CDU_OS.CreateResource(USB_TX_RESOURCE, USB_TX_PRIO);
LvdK 7:6576a287e563 134 CDU_OS.CreateResource(FS_DATA_RESOURCE, FS_DATA_PRIO); // : highest prio !
LvdK 7:6576a287e563 135
LvdK 7:6576a287e563 136 // Start mbos O.S with a final statement in main() :
LvdK 7:6576a287e563 137 CDU_OS.Start(); // : MBOS is running tasks now....
LvdK 7:6576a287e563 138 // end of main , program never reaches this point !
LvdK 7:6576a287e563 139 }
LvdK 6:e0bf3b244d7c 140
LvdK 6:e0bf3b244d7c 141 void RECEIVE_DECODE_TASK(void)
LvdK 7:6576a287e563 142 { // Task waits for RX_EVENT, then
LvdK 7:6576a287e563 143 // collects and decodes data from FS
LvdK 7:6576a287e563 144 while(1) { // : loop forever because it is a mbos taskfunction
LvdK 6:e0bf3b244d7c 145 CDU_OS.WaitEvent(RX_EVENT); // : wait for RX event
LvdK 6:e0bf3b244d7c 146 collect_FSdata();
LvdK 7:6576a287e563 147 }
LvdK 6:e0bf3b244d7c 148 }
LvdK 6:e0bf3b244d7c 149
LvdK 7:6576a287e563 150 void SEND_KEYMESSAGE_TASK(void)
LvdK 6:e0bf3b244d7c 151 {
LvdK 7:6576a287e563 152 while(1) { // : loop forever because it is a mbos taskfunction
LvdK 7:6576a287e563 153 CDU_OS.WaitEvent(KEY_EVENT); // : wait for KEY event ( = "CDU key pressed" )
LvdK 7:6576a287e563 154 CDU_KB_GET_KEY(); // : read key from CDU keyboard
LvdK 7:6576a287e563 155 CDU_OS.LockResource(USB_TX_RESOURCE);
LvdK 6:e0bf3b244d7c 156 Send_KEY_message(key_hit_ID);
LvdK 7:6576a287e563 157 key_hit_ID = 0; // : reset key_hit_ID flag
LvdK 7:6576a287e563 158 CDU_OS.FreeResource(USB_TX_RESOURCE);
LvdK 0:6f71ca095e78 159 }
LvdK 6:e0bf3b244d7c 160 }
LvdK 6:e0bf3b244d7c 161
LvdK 6:e0bf3b244d7c 162 void ALIVE_TASK(void)
LvdK 7:6576a287e563 163 {
LvdK 7:6576a287e563 164 // Mbos task started by mbos timer to send ALIVE message to FS every 5 sec.
LvdK 6:e0bf3b244d7c 165 CDU_OS.SetTimer( ALIVE_TIMER_ID, ALIVE_TIMER_PERIOD, ALIVE_TIMER_PERIOD );
LvdK 6:e0bf3b244d7c 166 static int seconds = 0;
LvdK 7:6576a287e563 167 while(1) { // : loop forever because it is a mbos taskfunction
LvdK 6:e0bf3b244d7c 168 CDU_OS.WaitEvent(ALIVE_EVENT ); // : wait for Mbos timer event (5 sec)
LvdK 7:6576a287e563 169 seconds += 5 ; // : increase seconds by 5
LvdK 7:6576a287e563 170 if (seconds >= 60) seconds = 0 ; // : overflow handling
LvdK 7:6576a287e563 171 CDU_OS.LockResource(USB_TX_RESOURCE);
LvdK 6:e0bf3b244d7c 172 Send_ALIVE_message(seconds);
LvdK 7:6576a287e563 173 CDU_OS.FreeResource(USB_TX_RESOURCE);
LvdK 7:6576a287e563 174 alive_led = !alive_led; // : toggle LED
LvdK 6:e0bf3b244d7c 175 }
LvdK 7:6576a287e563 176 }
LvdK 6:e0bf3b244d7c 177
LvdK 7:6576a287e563 178 void CDU_DSP_CSS_TASK(void) // : read new screendata from FS datastructures
LvdK 7:6576a287e563 179 {
LvdK 7:6576a287e563 180 while(1) { // : loop forever because it is a mbos taskfunction
LvdK 7:6576a287e563 181 CDU_OS.WaitEvent(FS_DATA_EVENT);
LvdK 7:6576a287e563 182 CDU_OS.LockResource(FS_DATA_RESOURCE); //lock resource to prevent intermediate updates
LvdK 7:6576a287e563 183
LvdK 7:6576a287e563 184 //test_update_flags(); // : >>>>>>>>>>>>>>>>>>>>> LvdK TEST ONLY !!!
LvdK 7:6576a287e563 185
LvdK 7:6576a287e563 186 CDU_DSP_CSS();
LvdK 7:6576a287e563 187
LvdK 7:6576a287e563 188 CDU_OS.FreeResource(FS_DATA_RESOURCE); //free resource
LvdK 7:6576a287e563 189 }
LvdK 6:e0bf3b244d7c 190 }
LvdK 7:6576a287e563 191
LvdK 7:6576a287e563 192 void READ_POT_TASK(void)
LvdK 7:6576a287e563 193 { // Mbos task started by mbos timer to scan potmeter every 100 msec
LvdK 7:6576a287e563 194 CDU_OS.SetTimer( READ_POT_TIMER_ID, READ_POT_TIMER_PERIOD, READ_POT_TIMER_PERIOD );
LvdK 7:6576a287e563 195
LvdK 7:6576a287e563 196 while(1) { // : loop forever because it is a mbos taskfunction
LvdK 7:6576a287e563 197 CDU_OS.WaitEvent(READ_POT_TIMER_EVENT ); // : scan potmeter every 100msec
LvdK 7:6576a287e563 198 CDU_SET_BGL_INTENSITY(255);
LvdK 7:6576a287e563 199 }
LvdK 7:6576a287e563 200 }
LvdK 7:6576a287e563 201