EE445M RTOS
Taken at the University of Texas Spring 2015
sense-main.cpp
Go to the documentation of this file.
1 /* -*- mode: c++; c-basic-offset: 4; */
2 /* Created by Hershal Bhave and Eric Crosson on <2015-03-15 Sun> */
3 /* Revision History: Look in Git FGT */
4 
5 #include "adcpp.hpp"
6 #include "blinker.hpp"
7 #include "timerpp.hpp"
8 #include "uartpp.hpp"
9 #include "shellpp.hpp"
10 #include "semaphorepp.hpp"
11 #include "motorpp.hpp"
12 #include "ir.hpp"
13 #include "drivepp.hpp"
14 #include "canpp.hpp"
15 #include "ctlsysctl.hpp"
16 #include "pingpp.hpp"
17 
18 #include "libos/os.h"
19 #include "libschedule/schedule.h"
20 
21 #include <stdint.h>
22 #include <stdlib.h>
23 #include <stdbool.h>
24 
25 #include "inc/hw_memmap.h"
26 
27 #include "driverlib/adc.h"
28 #include "driverlib/sysctl.h"
29 #include "driverlib/gpio.h"
30 #include "driverlib/interrupt.h"
31 #include "driverlib/uart.h"
32 #include "driverlib/pwm.h"
33 
34 #define thread(x) \
35  do { \
36  x; \
37  os_surrender_context(); \
38  } while(true)
39 
48 
49 #define can_data_length 5*2
50 const uint32_t can_msg_id = 1;
51 const bool can_sender = true;
54 
55 #define UART0_RX_BUFFER_SIZE 8
58 
59 uint32_t blink_count_red = 0;
60 uint32_t blink_count_green = 0;
61 uint32_t blink_count_blue = 0;
62 
64 
65  thread (
66  blink.toggle(PIN_RED);
68  );
69 }
70 
72 
73  thread (
74  blink.toggle(PIN_BLUE);
76  );
77 }
78 
80 
81  thread (
82  blink.toggle(PIN_GREEN);
84  );
85 }
86 
88 
89  thread (
90  uart0.atomic_printf("%x %x %x\n\r", blink_count_red,
92  );
93 }
94 
95 extern "C" void __cxa_pure_virtual() { while (1) {} }
96 
97 extern "C" void Timer0A_Handler() {
98  timer0a.ack();
99 }
100 
101 extern "C" void Timer1A_Handler() {
102  ping0.handle_timer();
103 }
104 
105 extern "C" void GPIOPortD_Handler() {
106  ping0.handle_gpio();
107 }
108 
109 extern "C" void UART0_Handler(void) {
110 
111  if(!(uart0.ack() & (UART_INT_RX | UART_INT_RT))) {
112  return;
113  }
114 
115  while(UARTCharsAvail(UART0_BASE)) {
116  char recv = uart0.get_char();
117 
118  /* Regardless of newline received, our convention is to
119  * mark end-of-lines in a buffer with the CR character. */
120  switch(recv) {
121  case '\n':
122  if (uart::LAST_WAS_CR) {
123  uart::LAST_WAS_CR = false;
124  continue;
125  }
126  break;
127  case '\r':
128  uart::LAST_WAS_CR = true;
129  break;
130  case 0x1b:
131  recv = '\r';
132  break;
133  default: break;
134  }
135  UART0_RX_BUFFER.notify((const int8_t) recv);
136  blink.blink(PIN_RED);
137  }
138 }
139 
140 extern "C" void ADC0Seq0_Handler(void) {
141 
142  adc0.ack();
143  adc0.sample();
144 
145  ir0.sample();
146  ir1.sample();
147  ir2.sample();
148  ir3.sample();
149 }
150 
151 extern "C" void CAN0_Handler(void) {
152 
153  uint32_t message_id = can0.ack();
154 
155  switch(message_id) {
156  case 1:
157  can0.recv_sem.post();
158  break;
159  default:
160  can0.error_tx();
161  break;
162  }
163 }
164 
165 void ping_handler() {
166 
167  ping0.start();
168 
169  while(1){
170  if (ping0_sem->guard()) {
171  ping0.sample();
172  /* uart0.printf("ping: %u\n", ping0.average()); */
173  }
174  os_surrender_context();
175  }
176 }
177 
178 void can_handler(void) {
179 
180  while(1) {
181  if(can0.recv_sem.guard()) {
182 
183  can0.get(can_data);
184  uart0.printf("Received CAN data: %0X %0X %0X %0X %0X %0X %0X %0X ",
185  can_data[0], can_data[1], can_data[3], can_data[4],
186  can_data[4], can_data[5], can_data[6], can_data[7]);
187  }
188  os_surrender_context();
189  }
190 }
191 
192 void can_transmitter(void) {
193 
194  uint16_t sens_ir_left;
195  uint16_t sens_ir_left_front;
196  uint16_t sens_ir_right;
197  uint16_t sens_ir_right_front;
198  uint16_t sens_ping_front;
199 
200 
201  /* 0 is left, left_front, right */
202  /* 1 is right_front, front_ping */
203  uint16_t can_msg_id = 0;
204 
205  uint8_t* ir_left_ptr;
206  uint8_t* ir_left_front_ptr;
207  uint8_t* ir_right_ptr;
208  uint8_t* ir_right_front_ptr;
209  uint8_t* ping_front_ptr;
210  uint8_t* can_msg_id_ptr;
211 
212  ir_left_ptr = (uint8_t*)(&sens_ir_left);
213  ir_left_front_ptr = (uint8_t*)(&sens_ir_left_front);
214  ir_right_ptr = (uint8_t*)(&sens_ir_right);
215  ir_right_front_ptr = (uint8_t*)(&sens_ir_right_front);
216  ping_front_ptr = (uint8_t*)(&sens_ping_front);
217  can_msg_id_ptr = (uint8_t*)(&can_msg_id);
218 
219  while(1) {
220 
221  if (can_msg_id == 0) {
222  sens_ir_left = ir0.distance(); /* PE3 */
223  sens_ir_left_front = ir1.distance(); /* PE2 */
224  sens_ir_right = ir2.distance(); /* PE1 */
225 
226  can_data[0] = can_msg_id_ptr[0];
227  can_data[1] = can_msg_id_ptr[1];
228 
229  can_data[2] = ir_left_ptr[0];
230  can_data[3] = ir_left_ptr[1];
231 
232  can_data[4] = ir_left_front_ptr[0];
233  can_data[5] = ir_left_front_ptr[1];
234 
235  can_data[6] = ir_right_ptr[0];
236  can_data[7] = ir_right_ptr[1];
237 
239  can_msg_id = 1;
240  } else {
241  sens_ping_front = ping0.distance();
242  sens_ir_right_front = ir3.distance(); /* PE0 */
243 
244  can_data[0] = can_msg_id_ptr[0];
245  can_data[1] = can_msg_id_ptr[1];
246 
247  can_data[2] = ir_right_front_ptr[0];
248  can_data[3] = ir_right_front_ptr[1];
249 
250  can_data[4] = ping_front_ptr[0];
251  can_data[5] = ping_front_ptr[1];
252 
253  can_data[6] = 0;
254  can_data[7] = 0;
255 
257  can_msg_id = 0;
258  }
259  uart0.printf("l: %u lf: %u r: %u rf: %u pf: %u\r\n",
260  sens_ir_left, sens_ir_left_front,
261  sens_ir_right, sens_ir_right_front,
262  sens_ping_front);
263 
264  blink.toggle(PIN_BLUE);
265 
266  os_surrender_context();
267  }
268 }
269 
271 
272  while(1) {
273  if(UART0_RX_SEM.guard()) {
274 
275  bool ok;
276  char recv = UART0_RX_BUFFER.get(ok);
277 
278  if(ok) { shell0.accept(recv); }
279  }
280  os_surrender_context();
281  }
282 }
283 
285 
286  for(uint8_t i=0; i<can_data_length; ++i) {
287  can_data[i] = i;
288  }
289 }
290 
291 int main(void) {
292 
294  IntMasterDisable();
295 
296  blink = blinker(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
297 
298  timer0a = timer(0, TIMER_A, TIMER_CFG_PERIODIC, SysCtlClockGet() / 1000,
299  TIMER_TIMA_TIMEOUT, true);
300 
301  ping0 = ping(GPIO_PORTD_BASE, GPIO_PIN_3, 1, TIMER_A);
302  ping0_sem = ping0.get_sem();
303 
304  adc0 = adc(ADC0_BASE, ADC_TRIGGER_TIMER, 0);
305  adc0.configure_sequence(ADC_CTL_CH0); /* PE3 */
306  adc0.configure_sequence(ADC_CTL_CH1); /* PE2 */
307  adc0.configure_sequence(ADC_CTL_CH2); /* PE1 */
308  adc0.configure_sequence(ADC_CTL_CH3 | ADC_CTL_IE | ADC_CTL_END); /* PE0 */
309 
310  adc0.configure_timer_interrupt(&timer0a);
311  adc0.start();
312 
313  ir0 = ir(1, &adc0, 307042, -200, 14); /* PE3 */
314  ir1 = ir(0, &adc0, 300147, -153, 11); /* PE2 */
315  ir2 = ir(3, &adc0, 279094, -295, 8); /* PE1 */
316  ir3 = ir(2, &adc0, 302703, -198, 11); /* PE0 */
317 
319 
320  uart0 = uart(UART0_BASE, INT_UART0);
321 
322  can0 = can(CAN0_BASE, INT_CAN0, can_sender, can_data_length);
323  if(can_sender) {
325  }
326 
327  shell0 = shell(&uart0);
328 
329  os_threading_init();
330  /* schedule(thread_blink_red, 200); */
331  /* schedule(thread_blink_blue, 200); */
332  /* schedule(thread_blink_green, 200); */
333  schedule(ping_handler, 200);
334  schedule(shell_handler, 200);
335  if(can_sender) {
336  schedule(can_transmitter, 200);
337  } else {
338  schedule(can_handler, 200);
339  }
340  os_launch();
341 }
342 
343 /* Local Variables: */
344 /* firestarter: (compile "make -k -j32 -C ~/workspace/ee445m-labs/build/") */
345 /* End: */
semaphore * get_sem(void)
Definition: pingpp.cpp:130
Definition: ir.hpp:15
#define can_data_length
Definition: sense-main.cpp:49
uint32_t blink_count_green
Definition: sense-main.cpp:60
ir ir3
Definition: sense-main.cpp:45
Definition: uartpp.hpp:28
bool guard(void)
Definition: semaphorepp.cpp:57
void atomic_printf(const char *pcString,...)
Definition: uartpp.cpp:348
void UART0_Handler(void)
Definition: sense-main.cpp:109
shell shell0
Definition: sense-main.cpp:43
void post(void)
Definition: semaphorepp.cpp:45
const pin_t PIN_BLUE
Definition: blinker.hpp:20
virtual uint32_t ack(void)
Definition: canpp.cpp:146
void can_handler(void)
Definition: sense-main.cpp:178
uint16_t sens_ir_left
Definition: move-main.cpp:42
semaphore recv_sem
Definition: canpp.hpp:69
void notify(const T data)
Definition: bufferpp.hpp:48
int main(void)
Definition: sense-main.cpp:291
ping ping0
Definition: sense-main.cpp:46
void __cxa_pure_virtual()
Definition: sense-main.cpp:95
char get_char(void)
Definition: uartpp.cpp:381
uint16_t sens_ir_right_front
Definition: move-main.cpp:45
void thread_blink_green()
Definition: sense-main.cpp:79
void configure_timer_interrupt(uint32_t timer_base, uint32_t timer_subtimer)
Definition: adcpp.cpp:49
semaphore * ping0_sem
Definition: sense-main.cpp:47
void transmit(uint8_t *data, uint32_t length, uint32_t id=1)
Definition: canpp.cpp:122
void ping_handler()
Definition: sense-main.cpp:165
void thread_uart_update()
Definition: sense-main.cpp:87
void CAN0_Handler(void)
Definition: sense-main.cpp:151
uint32_t blink_count_blue
Definition: sense-main.cpp:61
const uint32_t can_msg_id
Definition: sense-main.cpp:50
uint16_t sens_ir_left_front
Definition: move-main.cpp:43
T get(bool &ok)
Definition: bufferpp.hpp:76
void printf(const char *pcString,...)
Definition: uartpp.cpp:360
void sample(void)
Definition: ir.cpp:22
uint32_t blink_count_red
Definition: sense-main.cpp:59
void GPIOPortD_Handler()
Definition: sense-main.cpp:105
ir ir1
Definition: sense-main.cpp:45
void error_tx(void)
Definition: canpp.cpp:97
static bool LAST_WAS_CR
Definition: uartpp.hpp:38
void sample(void)
Definition: pingpp.cpp:45
const pin_t PIN_RED
Definition: blinker.hpp:18
Definition: canpp.hpp:21
void can_prepare_dummy_data(void)
Definition: sense-main.cpp:284
static buffer< char, 8 > UART0_RX_BUFFER
Definition: sense-main.cpp:57
void can_transmitter(void)
Definition: sense-main.cpp:192
const bool can_sender
Definition: sense-main.cpp:51
ir ir2
Definition: sense-main.cpp:45
virtual uint32_t ack()
Definition: timerpp.cpp:74
void sample(void)
Definition: adcpp.cpp:86
static semaphore UART0_RX_SEM
Definition: sense-main.cpp:56
void accept(char ch)
Definition: shellpp.cpp:174
void configure_sequence(uint32_t sequencer_configuration)
Definition: adcpp.cpp:55
timer timer0a
Definition: sense-main.cpp:41
static void set_clock(void)
Definition: ctlsysctl.hpp:109
virtual uint32_t ack(void)
Definition: uartpp.cpp:386
adc adc0
Definition: sense-main.cpp:44
virtual void start(void)
Definition: adcpp.cpp:72
#define thread(x)
Definition: sense-main.cpp:34
virtual void blink(pin_t pin)
Definition: blinker.cpp:38
int32_t distance(void)
Definition: pingpp.cpp:146
void thread_blink_blue()
Definition: sense-main.cpp:71
uint32_t handle_timer(void)
Definition: pingpp.cpp:85
void Timer0A_Handler()
Definition: sense-main.cpp:97
Definition: pingpp.hpp:28
void ADC0Seq0_Handler(void)
Definition: sense-main.cpp:140
uint16_t sens_ping_front
Definition: move-main.cpp:46
virtual void toggle(pin_t pin)
Definition: blinker.cpp:34
void thread_blink_red()
Definition: sense-main.cpp:63
void Timer1A_Handler()
Definition: sense-main.cpp:101
const pin_t PIN_GREEN
Definition: blinker.hpp:19
ir ir0
Definition: sense-main.cpp:45
virtual uint32_t ack(void)
Definition: adcpp.cpp:95
int32_t distance()
Definition: ir.cpp:40
Definition: adcpp.hpp:18
can can0
Definition: sense-main.cpp:52
virtual void start(void)
Definition: pingpp.cpp:74
void shell_handler()
Definition: sense-main.cpp:270
void get(uint8_t *data)
Definition: canpp.cpp:102
uint32_t handle_gpio(void)
Definition: pingpp.cpp:107
uint8_t can_data[5 *2]
Definition: sense-main.cpp:53
uint16_t sens_ir_right
Definition: move-main.cpp:44
blinker blink
Definition: sense-main.cpp:40
uart uart0
Definition: sense-main.cpp:42