EE445M RTOS
Taken at the University of Texas Spring 2015
sense-main.cpp File Reference
#include "adcpp.hpp"
#include "blinker.hpp"
#include "timerpp.hpp"
#include "uartpp.hpp"
#include "shellpp.hpp"
#include "semaphorepp.hpp"
#include "motorpp.hpp"
#include "ir.hpp"
#include "drivepp.hpp"
#include "canpp.hpp"
#include "ctlsysctl.hpp"
#include "pingpp.hpp"
#include "libos/os.h"
#include "libschedule/schedule.h"
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "driverlib/adc.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/uart.h"
#include "driverlib/pwm.h"
Include dependency graph for sense-main.cpp:

Go to the source code of this file.

Macros

#define thread(x)
 
#define can_data_length   5*2
 
#define UART0_RX_BUFFER_SIZE   8
 

Functions

void thread_blink_red ()
 
void thread_blink_blue ()
 
void thread_blink_green ()
 
void thread_uart_update ()
 
void __cxa_pure_virtual ()
 
void Timer0A_Handler ()
 
void Timer1A_Handler ()
 
void GPIOPortD_Handler ()
 
void UART0_Handler (void)
 
void ADC0Seq0_Handler (void)
 
void CAN0_Handler (void)
 
void ping_handler ()
 
void can_handler (void)
 
void can_transmitter (void)
 
void shell_handler ()
 
void can_prepare_dummy_data (void)
 
int main (void)
 

Variables

blinker blink
 
timer timer0a
 
uart uart0
 
shell shell0
 
adc adc0
 
ir ir0
 
ir ir1
 
ir ir2
 
ir ir3
 
ping ping0
 
semaphoreping0_sem
 
const uint32_t can_msg_id = 1
 
const bool can_sender = true
 
can can0
 
uint8_t can_data [5 *2]
 
static semaphore UART0_RX_SEM
 
static buffer< char, 8 > UART0_RX_BUFFER
 
uint32_t blink_count_red = 0
 
uint32_t blink_count_green = 0
 
uint32_t blink_count_blue = 0
 

Macro Definition Documentation

#define can_data_length   5*2

Definition at line 49 of file sense-main.cpp.

Referenced by can_prepare_dummy_data(), can_transmitter(), and main().

#define thread (   x)
Value:
do { \
x; \
os_surrender_context(); \
} while(true)

Definition at line 34 of file sense-main.cpp.

Referenced by thread_blink_blue(), thread_blink_green(), thread_blink_red(), and thread_uart_update().

#define UART0_RX_BUFFER_SIZE   8

Definition at line 55 of file sense-main.cpp.

Function Documentation

void __cxa_pure_virtual ( )

Definition at line 95 of file sense-main.cpp.

95 { while (1) {} }
void ADC0Seq0_Handler ( void  )

Definition at line 140 of file sense-main.cpp.

References adc::ack(), adc::sample(), and ir::sample().

140  {
141 
142  adc0.ack();
143  adc0.sample();
144 
145  ir0.sample();
146  ir1.sample();
147  ir2.sample();
148  ir3.sample();
149 }
ir ir3
Definition: sense-main.cpp:45
void sample(void)
Definition: ir.cpp:22
ir ir1
Definition: sense-main.cpp:45
ir ir2
Definition: sense-main.cpp:45
void sample(void)
Definition: adcpp.cpp:86
adc adc0
Definition: sense-main.cpp:44
ir ir0
Definition: sense-main.cpp:45
virtual uint32_t ack(void)
Definition: adcpp.cpp:95

Here is the call graph for this function:

void CAN0_Handler ( void  )

Definition at line 151 of file sense-main.cpp.

References can::ack(), can::error_tx(), semaphore::post(), and can::recv_sem.

151  {
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 }
void post(void)
Definition: semaphorepp.cpp:45
virtual uint32_t ack(void)
Definition: canpp.cpp:146
semaphore recv_sem
Definition: canpp.hpp:69
void error_tx(void)
Definition: canpp.cpp:97
can can0
Definition: sense-main.cpp:52

Here is the call graph for this function:

void can_handler ( void  )

Definition at line 178 of file sense-main.cpp.

References can_data, can::get(), semaphore::guard(), uart::printf(), and can::recv_sem.

Referenced by main().

178  {
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 }
bool guard(void)
Definition: semaphorepp.cpp:57
semaphore recv_sem
Definition: canpp.hpp:69
void printf(const char *pcString,...)
Definition: uartpp.cpp:360
can can0
Definition: sense-main.cpp:52
void get(uint8_t *data)
Definition: canpp.cpp:102
uint8_t can_data[5 *2]
Definition: sense-main.cpp:53
uart uart0
Definition: sense-main.cpp:42

Here is the call graph for this function:

Here is the caller graph for this function:

void can_prepare_dummy_data ( void  )

Definition at line 284 of file sense-main.cpp.

References can_data, and can_data_length.

Referenced by main().

284  {
285 
286  for(uint8_t i=0; i<can_data_length; ++i) {
287  can_data[i] = i;
288  }
289 }
#define can_data_length
Definition: sense-main.cpp:49
uint8_t can_data[5 *2]
Definition: sense-main.cpp:53

Here is the caller graph for this function:

void can_transmitter ( void  )

Definition at line 192 of file sense-main.cpp.

References can_data, can_data_length, can_msg_id, ping::distance(), ir::distance(), PIN_BLUE, uart::printf(), sens_ir_left, sens_ir_left_front, sens_ir_right, sens_ir_right_front, sens_ping_front, blinker::toggle(), and can::transmit().

Referenced by main().

192  {
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 
265 
266  os_surrender_context();
267  }
268 }
#define can_data_length
Definition: sense-main.cpp:49
ir ir3
Definition: sense-main.cpp:45
const pin_t PIN_BLUE
Definition: blinker.hpp:20
uint16_t sens_ir_left
Definition: move-main.cpp:42
ping ping0
Definition: sense-main.cpp:46
uint16_t sens_ir_right_front
Definition: move-main.cpp:45
void transmit(uint8_t *data, uint32_t length, uint32_t id=1)
Definition: canpp.cpp:122
const uint32_t can_msg_id
Definition: sense-main.cpp:50
uint16_t sens_ir_left_front
Definition: move-main.cpp:43
void printf(const char *pcString,...)
Definition: uartpp.cpp:360
ir ir1
Definition: sense-main.cpp:45
ir ir2
Definition: sense-main.cpp:45
int32_t distance(void)
Definition: pingpp.cpp:146
uint16_t sens_ping_front
Definition: move-main.cpp:46
virtual void toggle(pin_t pin)
Definition: blinker.cpp:34
ir ir0
Definition: sense-main.cpp:45
int32_t distance()
Definition: ir.cpp:40
can can0
Definition: sense-main.cpp:52
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

Here is the call graph for this function:

Here is the caller graph for this function:

void GPIOPortD_Handler ( )

Definition at line 105 of file sense-main.cpp.

References ping::handle_gpio().

105  {
106  ping0.handle_gpio();
107 }
ping ping0
Definition: sense-main.cpp:46
uint32_t handle_gpio(void)
Definition: pingpp.cpp:107

Here is the call graph for this function:

int main ( void  )

Definition at line 291 of file sense-main.cpp.

References can_data_length, can_handler(), can_prepare_dummy_data(), can_sender, can_transmitter(), adc::configure_sequence(), adc::configure_timer_interrupt(), ping::get_sem(), ping_handler(), ctlsys::set_clock(), shell_handler(), adc::start(), and UART0_RX_SEM.

291  {
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 
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 }
semaphore * get_sem(void)
Definition: pingpp.cpp:130
Definition: ir.hpp:15
#define can_data_length
Definition: sense-main.cpp:49
ir ir3
Definition: sense-main.cpp:45
Definition: uartpp.hpp:28
shell shell0
Definition: sense-main.cpp:43
void can_handler(void)
Definition: sense-main.cpp:178
ping ping0
Definition: sense-main.cpp:46
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 ping_handler()
Definition: sense-main.cpp:165
ir ir1
Definition: sense-main.cpp:45
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
static semaphore UART0_RX_SEM
Definition: sense-main.cpp:56
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
adc adc0
Definition: sense-main.cpp:44
virtual void start(void)
Definition: adcpp.cpp:72
Definition: pingpp.hpp:28
ir ir0
Definition: sense-main.cpp:45
Definition: adcpp.hpp:18
can can0
Definition: sense-main.cpp:52
void shell_handler()
Definition: sense-main.cpp:270
blinker blink
Definition: sense-main.cpp:40
uart uart0
Definition: sense-main.cpp:42

Here is the call graph for this function:

void ping_handler ( )

Definition at line 165 of file sense-main.cpp.

References semaphore::guard(), ping::sample(), and ping::start().

Referenced by main().

165  {
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 }
bool guard(void)
Definition: semaphorepp.cpp:57
ping ping0
Definition: sense-main.cpp:46
semaphore * ping0_sem
Definition: sense-main.cpp:47
void sample(void)
Definition: pingpp.cpp:45
virtual void start(void)
Definition: pingpp.cpp:74

Here is the call graph for this function:

Here is the caller graph for this function:

void shell_handler ( )

Definition at line 270 of file sense-main.cpp.

References shell::accept(), buffer< T, N >::get(), and semaphore::guard().

Referenced by main().

270  {
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 }
bool guard(void)
Definition: semaphorepp.cpp:57
shell shell0
Definition: sense-main.cpp:43
static buffer< char, 8 > UART0_RX_BUFFER
Definition: sense-main.cpp:57
static semaphore UART0_RX_SEM
Definition: sense-main.cpp:56
void accept(char ch)
Definition: shellpp.cpp:174

Here is the call graph for this function:

Here is the caller graph for this function:

void thread_blink_blue ( )

Definition at line 71 of file sense-main.cpp.

References blink_count_blue, PIN_BLUE, thread, and blinker::toggle().

71  {
72 
73  thread (
76  );
77 }
const pin_t PIN_BLUE
Definition: blinker.hpp:20
uint32_t blink_count_blue
Definition: sense-main.cpp:61
#define thread(x)
Definition: sense-main.cpp:34
virtual void toggle(pin_t pin)
Definition: blinker.cpp:34
blinker blink
Definition: sense-main.cpp:40

Here is the call graph for this function:

void thread_blink_green ( )

Definition at line 79 of file sense-main.cpp.

References blink_count_green, PIN_GREEN, thread, and blinker::toggle().

79  {
80 
81  thread (
84  );
85 }
uint32_t blink_count_green
Definition: sense-main.cpp:60
#define thread(x)
Definition: sense-main.cpp:34
virtual void toggle(pin_t pin)
Definition: blinker.cpp:34
const pin_t PIN_GREEN
Definition: blinker.hpp:19
blinker blink
Definition: sense-main.cpp:40

Here is the call graph for this function:

void thread_blink_red ( )

Definition at line 63 of file sense-main.cpp.

References blink_count_red, PIN_RED, thread, and blinker::toggle().

63  {
64 
65  thread (
68  );
69 }
uint32_t blink_count_red
Definition: sense-main.cpp:59
const pin_t PIN_RED
Definition: blinker.hpp:18
#define thread(x)
Definition: sense-main.cpp:34
virtual void toggle(pin_t pin)
Definition: blinker.cpp:34
blinker blink
Definition: sense-main.cpp:40

Here is the call graph for this function:

void thread_uart_update ( )

Definition at line 87 of file sense-main.cpp.

References uart::atomic_printf(), blink_count_blue, blink_count_green, blink_count_red, and thread.

87  {
88 
89  thread (
90  uart0.atomic_printf("%x %x %x\n\r", blink_count_red,
92  );
93 }
uint32_t blink_count_green
Definition: sense-main.cpp:60
void atomic_printf(const char *pcString,...)
Definition: uartpp.cpp:348
uint32_t blink_count_blue
Definition: sense-main.cpp:61
uint32_t blink_count_red
Definition: sense-main.cpp:59
#define thread(x)
Definition: sense-main.cpp:34
uart uart0
Definition: sense-main.cpp:42

Here is the call graph for this function:

void Timer0A_Handler ( )

Definition at line 97 of file sense-main.cpp.

References timer::ack().

97  {
98  timer0a.ack();
99 }
virtual uint32_t ack()
Definition: timerpp.cpp:74
timer timer0a
Definition: sense-main.cpp:41

Here is the call graph for this function:

void Timer1A_Handler ( )

Definition at line 101 of file sense-main.cpp.

References ping::handle_timer().

101  {
103 }
ping ping0
Definition: sense-main.cpp:46
uint32_t handle_timer(void)
Definition: pingpp.cpp:85

Here is the call graph for this function:

void UART0_Handler ( void  )

Definition at line 109 of file sense-main.cpp.

References uart::ack(), blinker::blink(), uart::get_char(), uart::LAST_WAS_CR, buffer< T, N >::notify(), and PIN_RED.

109  {
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);
137  }
138 }
char get_char(void)
Definition: uartpp.cpp:381
static bool LAST_WAS_CR
Definition: uartpp.hpp:38
const pin_t PIN_RED
Definition: blinker.hpp:18
static buffer< char, 8 > UART0_RX_BUFFER
Definition: sense-main.cpp:57
virtual uint32_t ack(void)
Definition: uartpp.cpp:386
virtual void blink(pin_t pin)
Definition: blinker.cpp:38
blinker blink
Definition: sense-main.cpp:40
uart uart0
Definition: sense-main.cpp:42

Here is the call graph for this function:

Variable Documentation

adc adc0

Definition at line 44 of file sense-main.cpp.

blinker blink

Definition at line 40 of file sense-main.cpp.

uint32_t blink_count_blue = 0

Definition at line 61 of file sense-main.cpp.

Referenced by thread_blink_blue(), and thread_uart_update().

uint32_t blink_count_green = 0

Definition at line 60 of file sense-main.cpp.

Referenced by thread_blink_green(), and thread_uart_update().

uint32_t blink_count_red = 0

Definition at line 59 of file sense-main.cpp.

Referenced by thread_blink_red(), and thread_uart_update().

can can0

Definition at line 52 of file sense-main.cpp.

uint8_t can_data[5 *2]

Definition at line 53 of file sense-main.cpp.

Referenced by can_handler(), can_prepare_dummy_data(), and can_transmitter().

const uint32_t can_msg_id = 1

Definition at line 50 of file sense-main.cpp.

Referenced by can_transmitter().

const bool can_sender = true

Definition at line 51 of file sense-main.cpp.

Referenced by main().

ir ir0

Definition at line 45 of file sense-main.cpp.

ir ir1

Definition at line 45 of file sense-main.cpp.

ir ir2

Definition at line 45 of file sense-main.cpp.

ir ir3

Definition at line 45 of file sense-main.cpp.

ping ping0

Definition at line 46 of file sense-main.cpp.

semaphore* ping0_sem

Definition at line 47 of file sense-main.cpp.

shell shell0

Definition at line 43 of file sense-main.cpp.

timer timer0a

Definition at line 41 of file sense-main.cpp.

uart uart0

Definition at line 42 of file sense-main.cpp.

buffer<char, 8 > UART0_RX_BUFFER
static

Definition at line 57 of file sense-main.cpp.

semaphore UART0_RX_SEM
static

Definition at line 56 of file sense-main.cpp.

Referenced by main().