d

Dependencies:   mbed

Fork of AEB by Vincenzo Comito

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?

UserRevisionLine numberNew 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 }