]> Pileus Git - ~andy/csm213a-hw/blob - hw2/tester.cpp
Make slave mode configurable
[~andy/csm213a-hw] / hw2 / tester.cpp
1 /* main.cpp
2  * mbed project: Simple_Square_Wave
3  * mbed board: FRDM-KL46Z
4  * Generate square waves using DigitalOut.
5  */
6
7 #include "mbed.h"
8 #include "timer_dma.h"
9 #include "serial_irq.h"
10 #include "messages.h"
11
12 #define N_ELEM(x) (sizeof(x)/sizeof((x)[0]))
13
14 // Push-button IRQ handler
15 void Control_T(void);
16
17 // Task modes
18 void Empty_Task(void);
19 void Receive_Event(void);
20 void Generate_Event(void);
21
22 // Local variables
23 int START_STOP_FLAG = 0;
24 float period_s = 0.0001;
25 DigitalOut  Square_Wave(PTD3);      // Used PWM output is PTD3
26 InterruptIn Control_Testing(PTC12); // SW3
27
28 tdma_t     *Tdma_Mbed1;
29 tdma_t     *Tdma_Mbed2;
30
31 sirq_t     *Sirq_Bbb;
32
33 parser_t    Parser_Bbb;
34
35 // Extern stuff...
36 extern serial_t stdio_uart;
37
38 // Taks tables
39 static struct {
40         const char *mode;
41         void (*func)(void);
42 } task_table[] = {
43         { "null",     Empty_Task },
44         { "generate", Generate_Event },
45         { "receive",  Receive_Event },
46 };
47
48 int task_index = 0;
49
50 // Main
51 int main(int arc, char **argv)
52 {
53         // Set debug baud rate
54         serial_init(&stdio_uart, USBTX, USBRX);
55         serial_baud(&stdio_uart, 115200);
56
57         // Setup BBB uart port
58         Sirq_Bbb   = sirq_open(SIRQ_UART1, PTE0,  PTE1,  115200, 0);
59
60         // Setup time tags
61         Tdma_Mbed1 = tdma_open(TDMA_CHAN2, 3, PTD2, PullUp); // TODO -- Should be on PTC
62         Tdma_Mbed2 = tdma_open(TDMA_CHAN3, 3, PTD3, PullUp); // TODO -- Should be on PTD
63
64         // Register messages
65         //msg_register(&parser_bbb, MSG_ID_INIT, (handler_t)serial_handle_init);
66
67         // Start timers
68         tdma_start(Tdma_Mbed1);
69         tdma_start(Tdma_Mbed2);
70
71         // Enable push-button controlling
72         Control_Testing.rise(&Control_T);    // Enable getMode interrupt handler
73
74         // Main loop
75         __enable_irq();
76         while (1) {
77                 // Recieve serial data
78                 while (sirq_ready(Sirq_Bbb)) {
79                         int byte = sirq_getc(Sirq_Bbb);
80                         msg_receive(&Parser_Bbb, byte);
81                 }
82
83                 // Run task function
84                 task_table[task_index].func();
85         }
86 }
87
88 // Task functions
89 void Empty_Task(void)
90 {
91         // do nothing
92 }
93
94 void Receive_Event(void)
95 {
96         uint64_t event;
97         if (tdma_stamp(Tdma_Mbed1, &event))
98                 printf("event received - rcv\r\n");
99         if (tdma_stamp(Tdma_Mbed2, &event))
100                 printf("event received - xmt\r\n");
101 }
102
103 void Generate_Event(void)
104 {
105         if (START_STOP_FLAG == 1)
106         {
107                 Square_Wave.write(0);
108                 wait(period_s/2);
109                 Square_Wave.write(1);
110                 wait(period_s/2);
111         }
112         else
113                 Square_Wave.write(0);
114 }
115
116 // Interrupt handlers
117 void Control_T(void)
118 {
119         if(START_STOP_FLAG == 0)
120         {
121                 period_s = 1;
122                 START_STOP_FLAG = 1;
123         }
124         else
125         {
126                 START_STOP_FLAG = 0;
127                 Square_Wave.write(0);
128         }
129
130         // Implement task cycling
131         // task_index = (task_index + 1) % N_ELEM(task_table);
132 }