
d
Dependencies: mbed
Fork of AEB by
main.cpp@1:45911e86ffee, 2016-07-26 (annotated)
- Committer:
- clynamen
- Date:
- Tue Jul 26 20:15:23 2016 +0000
- Revision:
- 1:45911e86ffee
- Parent:
- 0:9d530d56a118
- Child:
- 2:5811e080f41d
initial commit;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
clynamen | 0:9d530d56a118 | 1 | #include "mbed.h" |
clynamen | 0:9d530d56a118 | 2 | |
clynamen | 1:45911e86ffee | 3 | #include "rtwtypes.h" |
clynamen | 1:45911e86ffee | 4 | #include "serialdata.h" |
clynamen | 0:9d530d56a118 | 5 | |
clynamen | 1:45911e86ffee | 6 | DigitalOut red(LED_RED); |
clynamen | 1:45911e86ffee | 7 | DigitalOut green(LED_GREEN); |
clynamen | 1:45911e86ffee | 8 | DigitalOut blue(LED_BLUE); |
clynamen | 1:45911e86ffee | 9 | |
clynamen | 0:9d530d56a118 | 10 | DigitalOut trigger(D2); |
clynamen | 0:9d530d56a118 | 11 | InterruptIn echo(D4); |
clynamen | 0:9d530d56a118 | 12 | Timer t; |
clynamen | 0:9d530d56a118 | 13 | Ticker scheduler; |
clynamen | 0:9d530d56a118 | 14 | |
clynamen | 1:45911e86ffee | 15 | volatile float distance; |
clynamen | 1:45911e86ffee | 16 | float fault = 0; |
clynamen | 0:9d530d56a118 | 17 | |
clynamen | 0:9d530d56a118 | 18 | Serial pc(USBTX, USBRX); // tx, rx |
clynamen | 0:9d530d56a118 | 19 | |
clynamen | 0:9d530d56a118 | 20 | |
clynamen | 0:9d530d56a118 | 21 | // |
clynamen | 0:9d530d56a118 | 22 | // Copy from ert_main.c |
clynamen | 0:9d530d56a118 | 23 | // |
clynamen | 1:45911e86ffee | 24 | |
clynamen | 1:45911e86ffee | 25 | #include <stddef.h> |
clynamen | 1:45911e86ffee | 26 | #include <stdio.h> /* This ert_main.c example uses printf/fflush */ |
clynamen | 1:45911e86ffee | 27 | #include "AEB0.h" /* Model's header file */ |
clynamen | 1:45911e86ffee | 28 | #include "rtwtypes.h" |
clynamen | 0:9d530d56a118 | 29 | |
clynamen | 0:9d530d56a118 | 30 | /* |
clynamen | 1:45911e86ffee | 31 | * Associating rt_OneStep with a real-time clock or interrupt service routine |
clynamen | 1:45911e86ffee | 32 | * is what makes the generated code "real-time". The function rt_OneStep is |
clynamen | 1:45911e86ffee | 33 | * always associated with the base rate of the model. Subrates are managed |
clynamen | 1:45911e86ffee | 34 | * by the base rate from inside the generated code. Enabling/disabling |
clynamen | 1:45911e86ffee | 35 | * interrupts and floating point context switches are target specific. This |
clynamen | 1:45911e86ffee | 36 | * example code indicates where these should take place relative to executing |
clynamen | 1:45911e86ffee | 37 | * the generated code step function. Overrun behavior should be tailored to |
clynamen | 1:45911e86ffee | 38 | * your application needs. This example simply sets an error status in the |
clynamen | 1:45911e86ffee | 39 | * real-time model and returns from rt_OneStep. |
clynamen | 1:45911e86ffee | 40 | */ |
clynamen | 1:45911e86ffee | 41 | void rt_OneStep(void); |
clynamen | 1:45911e86ffee | 42 | void rt_OneStep(void) |
clynamen | 1:45911e86ffee | 43 | { |
clynamen | 1:45911e86ffee | 44 | static boolean_T OverrunFlag = false; |
clynamen | 1:45911e86ffee | 45 | |
clynamen | 1:45911e86ffee | 46 | /* Disable interrupts here */ |
clynamen | 1:45911e86ffee | 47 | |
clynamen | 1:45911e86ffee | 48 | /* Check for overrun */ |
clynamen | 1:45911e86ffee | 49 | if (OverrunFlag) { |
clynamen | 1:45911e86ffee | 50 | rtmSetErrorStatus(AEB0_M, "Overrun"); |
clynamen | 1:45911e86ffee | 51 | return; |
clynamen | 1:45911e86ffee | 52 | } |
clynamen | 1:45911e86ffee | 53 | |
clynamen | 1:45911e86ffee | 54 | OverrunFlag = true; |
clynamen | 1:45911e86ffee | 55 | |
clynamen | 1:45911e86ffee | 56 | /* Save FPU context here (if necessary) */ |
clynamen | 1:45911e86ffee | 57 | /* Re-enable timer or interrupt here */ |
clynamen | 1:45911e86ffee | 58 | /* Set model inputs here */ |
clynamen | 1:45911e86ffee | 59 | |
clynamen | 1:45911e86ffee | 60 | /* Step the model */ |
clynamen | 1:45911e86ffee | 61 | AEB0_step(); |
clynamen | 1:45911e86ffee | 62 | |
clynamen | 1:45911e86ffee | 63 | /* Get model outputs here */ |
clynamen | 1:45911e86ffee | 64 | |
clynamen | 1:45911e86ffee | 65 | /* Indicate task complete */ |
clynamen | 1:45911e86ffee | 66 | OverrunFlag = false; |
clynamen | 1:45911e86ffee | 67 | |
clynamen | 1:45911e86ffee | 68 | /* Disable interrupts here */ |
clynamen | 1:45911e86ffee | 69 | /* Restore FPU context here (if necessary) */ |
clynamen | 1:45911e86ffee | 70 | /* Enable interrupts here */ |
clynamen | 1:45911e86ffee | 71 | } |
clynamen | 1:45911e86ffee | 72 | |
clynamen | 0:9d530d56a118 | 73 | |
clynamen | 0:9d530d56a118 | 74 | // |
clynamen | 0:9d530d56a118 | 75 | // End copy |
clynamen | 0:9d530d56a118 | 76 | // |
clynamen | 0:9d530d56a118 | 77 | |
clynamen | 1:45911e86ffee | 78 | |
clynamen | 0:9d530d56a118 | 79 | |
clynamen | 0:9d530d56a118 | 80 | void start( void ) |
clynamen | 0:9d530d56a118 | 81 | { |
clynamen | 0:9d530d56a118 | 82 | t.start(); |
clynamen | 0:9d530d56a118 | 83 | } |
clynamen | 0:9d530d56a118 | 84 | |
clynamen | 0:9d530d56a118 | 85 | void stop( void ) |
clynamen | 0:9d530d56a118 | 86 | { |
clynamen | 0:9d530d56a118 | 87 | t.stop(); |
clynamen | 0:9d530d56a118 | 88 | distance = t.read_us()/58.0; |
clynamen | 1:45911e86ffee | 89 | distance /= 2; // from 0 to 45m distance; |
clynamen | 1:45911e86ffee | 90 | if(distance>150) distance = 150; |
clynamen | 0:9d530d56a118 | 91 | t.reset(); |
clynamen | 0:9d530d56a118 | 92 | } |
clynamen | 0:9d530d56a118 | 93 | |
clynamen | 0:9d530d56a118 | 94 | |
clynamen | 1:45911e86ffee | 95 | extern ExtU_AEB0_T AEB0_U; |
clynamen | 1:45911e86ffee | 96 | extern ExtY_AEB0_T AEB0_Y; |
clynamen | 1:45911e86ffee | 97 | |
clynamen | 1:45911e86ffee | 98 | enum color { |
clynamen | 1:45911e86ffee | 99 | NONE, RED, GREEN, BLUE |
clynamen | 1:45911e86ffee | 100 | }; |
clynamen | 1:45911e86ffee | 101 | |
clynamen | 1:45911e86ffee | 102 | enum { |
clynamen | 1:45911e86ffee | 103 | LED_ON = 0, |
clynamen | 1:45911e86ffee | 104 | LED_OFF = 1 |
clynamen | 1:45911e86ffee | 105 | }; |
clynamen | 0:9d530d56a118 | 106 | |
clynamen | 1:45911e86ffee | 107 | void setColor(color c) { |
clynamen | 1:45911e86ffee | 108 | red = LED_OFF; |
clynamen | 1:45911e86ffee | 109 | blue = LED_OFF; |
clynamen | 1:45911e86ffee | 110 | green = LED_OFF; |
clynamen | 1:45911e86ffee | 111 | switch(c) { |
clynamen | 1:45911e86ffee | 112 | case NONE: |
clynamen | 1:45911e86ffee | 113 | break; |
clynamen | 1:45911e86ffee | 114 | case RED: |
clynamen | 1:45911e86ffee | 115 | red = LED_ON; |
clynamen | 1:45911e86ffee | 116 | break; |
clynamen | 1:45911e86ffee | 117 | case BLUE: |
clynamen | 1:45911e86ffee | 118 | blue = LED_ON; |
clynamen | 1:45911e86ffee | 119 | break; |
clynamen | 1:45911e86ffee | 120 | case GREEN: |
clynamen | 1:45911e86ffee | 121 | green = LED_ON; |
clynamen | 1:45911e86ffee | 122 | break; |
clynamen | 0:9d530d56a118 | 123 | } |
clynamen | 0:9d530d56a118 | 124 | } |
clynamen | 0:9d530d56a118 | 125 | |
clynamen | 1:45911e86ffee | 126 | void do_step( void ) |
clynamen | 1:45911e86ffee | 127 | { |
clynamen | 1:45911e86ffee | 128 | AEB0_U.speed_ms = serialRecv(); |
clynamen | 1:45911e86ffee | 129 | AEB0_U.distance_m = distance; |
clynamen | 1:45911e86ffee | 130 | // |
clynamen | 1:45911e86ffee | 131 | |
clynamen | 1:45911e86ffee | 132 | rt_OneStep(); |
clynamen | 1:45911e86ffee | 133 | float brake = AEB0_Y.brake; |
clynamen | 1:45911e86ffee | 134 | fault = AEB0_Y.fault; |
clynamen | 1:45911e86ffee | 135 | if(fault) { |
clynamen | 1:45911e86ffee | 136 | setColor(RED); |
clynamen | 0:9d530d56a118 | 137 | } |
clynamen | 1:45911e86ffee | 138 | float data[3] = {brake, distance, fault}; |
clynamen | 1:45911e86ffee | 139 | serialSendVec(data, 3); |
clynamen | 0:9d530d56a118 | 140 | } |
clynamen | 0:9d530d56a118 | 141 | |
clynamen | 0:9d530d56a118 | 142 | int main() |
clynamen | 0:9d530d56a118 | 143 | { |
clynamen | 0:9d530d56a118 | 144 | |
clynamen | 1:45911e86ffee | 145 | AEB0_initialize(); |
clynamen | 0:9d530d56a118 | 146 | |
clynamen | 1:45911e86ffee | 147 | scheduler.attach( &do_step, 0.2 ); |
clynamen | 1:45911e86ffee | 148 | setColor(NONE); |
clynamen | 0:9d530d56a118 | 149 | // |
clynamen | 0:9d530d56a118 | 150 | t.reset(); |
clynamen | 0:9d530d56a118 | 151 | echo.rise( &start ); |
clynamen | 0:9d530d56a118 | 152 | echo.fall( &stop ); |
clynamen | 1:45911e86ffee | 153 | |
clynamen | 0:9d530d56a118 | 154 | trigger = 0; |
clynamen | 0:9d530d56a118 | 155 | |
clynamen | 0:9d530d56a118 | 156 | while (true) { |
clynamen | 1:45911e86ffee | 157 | // pc.printf( "Reading inputs....\n\r" ); |
clynamen | 1:45911e86ffee | 158 | |
clynamen | 0:9d530d56a118 | 159 | |
clynamen | 0:9d530d56a118 | 160 | trigger = 1; |
clynamen | 0:9d530d56a118 | 161 | wait_us( 10 ); |
clynamen | 0:9d530d56a118 | 162 | trigger = 0; |
clynamen | 0:9d530d56a118 | 163 | |
clynamen | 0:9d530d56a118 | 164 | |
clynamen | 0:9d530d56a118 | 165 | } |
clynamen | 1:45911e86ffee | 166 | |
clynamen | 1:45911e86ffee | 167 | AEB0_terminate(); |
clynamen | 1:45911e86ffee | 168 | return 0; |
clynamen | 0:9d530d56a118 | 169 | } |