Test program for master controller
Dependencies: Controller_Master mbed
main.cpp@0:ae1df001727e, 2016-06-04 (annotated)
- Committer:
- AndreaAndreoli
- Date:
- Sat Jun 04 16:58:50 2016 +0000
- Revision:
- 0:ae1df001727e
First commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AndreaAndreoli | 0:ae1df001727e | 1 | #include "mbed.h" |
AndreaAndreoli | 0:ae1df001727e | 2 | |
AndreaAndreoli | 0:ae1df001727e | 3 | extern "C" { |
AndreaAndreoli | 0:ae1df001727e | 4 | #include "Controller_Master.h" /* Model's header file */ |
AndreaAndreoli | 0:ae1df001727e | 5 | #include "rtwtypes.h" |
AndreaAndreoli | 0:ae1df001727e | 6 | } |
AndreaAndreoli | 0:ae1df001727e | 7 | |
AndreaAndreoli | 0:ae1df001727e | 8 | DigitalOut led_B(LED_BLUE); |
AndreaAndreoli | 0:ae1df001727e | 9 | DigitalOut led_R(LED_RED); |
AndreaAndreoli | 0:ae1df001727e | 10 | DigitalOut led_G(LED_GREEN); |
AndreaAndreoli | 0:ae1df001727e | 11 | Ticker t; |
AndreaAndreoli | 0:ae1df001727e | 12 | Serial pc(USBTX, USBRX); // tx, rx |
AndreaAndreoli | 0:ae1df001727e | 13 | |
AndreaAndreoli | 0:ae1df001727e | 14 | static RT_MODEL_Controller_Master_T Controller_Master_M_; |
AndreaAndreoli | 0:ae1df001727e | 15 | static RT_MODEL_Controller_Master_T *const Controller_Master_M = |
AndreaAndreoli | 0:ae1df001727e | 16 | &Controller_Master_M_; /* Real-time model */ |
AndreaAndreoli | 0:ae1df001727e | 17 | static B_Controller_Master_T Controller_Master_B;/* Observable signals */ |
AndreaAndreoli | 0:ae1df001727e | 18 | static DW_Controller_Master_T Controller_Master_DW;/* Observable states */ |
AndreaAndreoli | 0:ae1df001727e | 19 | |
AndreaAndreoli | 0:ae1df001727e | 20 | /* '<Root>/V' */ |
AndreaAndreoli | 0:ae1df001727e | 21 | static real_T Controller_Master_U_V; |
AndreaAndreoli | 0:ae1df001727e | 22 | |
AndreaAndreoli | 0:ae1df001727e | 23 | /* '<Root>/D_M' */ |
AndreaAndreoli | 0:ae1df001727e | 24 | static real_T Controller_Master_U_D_M; |
AndreaAndreoli | 0:ae1df001727e | 25 | |
AndreaAndreoli | 0:ae1df001727e | 26 | /* '<Root>/SLAVE' */ |
AndreaAndreoli | 0:ae1df001727e | 27 | static uint8_T Controller_Master_U_Slave; |
AndreaAndreoli | 0:ae1df001727e | 28 | |
AndreaAndreoli | 0:ae1df001727e | 29 | /* '<Root>/BRAKE' */ |
AndreaAndreoli | 0:ae1df001727e | 30 | static uint8_T Controller_Master_Y_BRAKE; |
AndreaAndreoli | 0:ae1df001727e | 31 | |
AndreaAndreoli | 0:ae1df001727e | 32 | /* '<Root>/LED_BLUE' */ |
AndreaAndreoli | 0:ae1df001727e | 33 | static uint8_T Controller_Master_Y_LED_BLUE; |
AndreaAndreoli | 0:ae1df001727e | 34 | |
AndreaAndreoli | 0:ae1df001727e | 35 | /* '<Root>/LED_RED' */ |
AndreaAndreoli | 0:ae1df001727e | 36 | static uint8_T Controller_Master_Y_LED_RED; |
AndreaAndreoli | 0:ae1df001727e | 37 | |
AndreaAndreoli | 0:ae1df001727e | 38 | /* '<Root>/MASTER' */ |
AndreaAndreoli | 0:ae1df001727e | 39 | static uint8_T Controller_Master_Y_MASTER; |
AndreaAndreoli | 0:ae1df001727e | 40 | |
AndreaAndreoli | 0:ae1df001727e | 41 | /* |
AndreaAndreoli | 0:ae1df001727e | 42 | * Associating rt_OneStep with a real-time clock or interrupt service routine |
AndreaAndreoli | 0:ae1df001727e | 43 | * is what makes the generated code "real-time". The function rt_OneStep is |
AndreaAndreoli | 0:ae1df001727e | 44 | * always associated with the base rate of the model. Subrates are managed |
AndreaAndreoli | 0:ae1df001727e | 45 | * by the base rate from inside the generated code. Enabling/disabling |
AndreaAndreoli | 0:ae1df001727e | 46 | * interrupts and floating point context switches are target specific. This |
AndreaAndreoli | 0:ae1df001727e | 47 | * example code indicates where these should take place relative to executing |
AndreaAndreoli | 0:ae1df001727e | 48 | * the generated code step function. Overrun behavior should be tailored to |
AndreaAndreoli | 0:ae1df001727e | 49 | * your application needs. This example simply sets an error status in the |
AndreaAndreoli | 0:ae1df001727e | 50 | * real-time model and returns from rt_OneStep. |
AndreaAndreoli | 0:ae1df001727e | 51 | */ |
AndreaAndreoli | 0:ae1df001727e | 52 | void rt_OneStep(RT_MODEL_Controller_Master_T *const Controller_Master_M); |
AndreaAndreoli | 0:ae1df001727e | 53 | void rt_OneStep(RT_MODEL_Controller_Master_T *const Controller_Master_M) |
AndreaAndreoli | 0:ae1df001727e | 54 | { |
AndreaAndreoli | 0:ae1df001727e | 55 | static boolean_T OverrunFlag = false; |
AndreaAndreoli | 0:ae1df001727e | 56 | |
AndreaAndreoli | 0:ae1df001727e | 57 | /* Disable interrupts here */ |
AndreaAndreoli | 0:ae1df001727e | 58 | |
AndreaAndreoli | 0:ae1df001727e | 59 | /* Check for overrun */ |
AndreaAndreoli | 0:ae1df001727e | 60 | if (OverrunFlag) { |
AndreaAndreoli | 0:ae1df001727e | 61 | rtmSetErrorStatus(Controller_Master_M, "Overrun"); |
AndreaAndreoli | 0:ae1df001727e | 62 | return; |
AndreaAndreoli | 0:ae1df001727e | 63 | } |
AndreaAndreoli | 0:ae1df001727e | 64 | |
AndreaAndreoli | 0:ae1df001727e | 65 | OverrunFlag = true; |
AndreaAndreoli | 0:ae1df001727e | 66 | |
AndreaAndreoli | 0:ae1df001727e | 67 | /* Save FPU context here (if necessary) */ |
AndreaAndreoli | 0:ae1df001727e | 68 | /* Re-enable timer or interrupt here */ |
AndreaAndreoli | 0:ae1df001727e | 69 | /* Set model inputs here */ |
AndreaAndreoli | 0:ae1df001727e | 70 | |
AndreaAndreoli | 0:ae1df001727e | 71 | /* Step the model */ |
AndreaAndreoli | 0:ae1df001727e | 72 | Controller_Master_step(Controller_Master_M, Controller_Master_U_V, |
AndreaAndreoli | 0:ae1df001727e | 73 | Controller_Master_U_D_M, Controller_Master_U_Slave, |
AndreaAndreoli | 0:ae1df001727e | 74 | &Controller_Master_Y_BRAKE, &Controller_Master_Y_LED_BLUE, |
AndreaAndreoli | 0:ae1df001727e | 75 | &Controller_Master_Y_LED_RED, &Controller_Master_Y_MASTER); |
AndreaAndreoli | 0:ae1df001727e | 76 | |
AndreaAndreoli | 0:ae1df001727e | 77 | /* Get model outputs here */ |
AndreaAndreoli | 0:ae1df001727e | 78 | |
AndreaAndreoli | 0:ae1df001727e | 79 | /* Indicate task complete */ |
AndreaAndreoli | 0:ae1df001727e | 80 | OverrunFlag = false; |
AndreaAndreoli | 0:ae1df001727e | 81 | |
AndreaAndreoli | 0:ae1df001727e | 82 | /* Disable interrupts here */ |
AndreaAndreoli | 0:ae1df001727e | 83 | /* Restore FPU context here (if necessary) */ |
AndreaAndreoli | 0:ae1df001727e | 84 | /* Enable interrupts here */ |
AndreaAndreoli | 0:ae1df001727e | 85 | } |
AndreaAndreoli | 0:ae1df001727e | 86 | |
AndreaAndreoli | 0:ae1df001727e | 87 | void step(); |
AndreaAndreoli | 0:ae1df001727e | 88 | void step() |
AndreaAndreoli | 0:ae1df001727e | 89 | { |
AndreaAndreoli | 0:ae1df001727e | 90 | Controller_Master_U_V = 50; |
AndreaAndreoli | 0:ae1df001727e | 91 | Controller_Master_U_D_M = 30; |
AndreaAndreoli | 0:ae1df001727e | 92 | Controller_Master_U_Slave = 1; |
AndreaAndreoli | 0:ae1df001727e | 93 | rt_OneStep(Controller_Master_M); |
AndreaAndreoli | 0:ae1df001727e | 94 | pc.printf("blue: %d \n", Controller_Master_Y_LED_BLUE); // Call read_cm() to get the distance in cm |
AndreaAndreoli | 0:ae1df001727e | 95 | pc.printf("red: %d \n", Controller_Master_Y_LED_RED); |
AndreaAndreoli | 0:ae1df001727e | 96 | pc.printf("master: %d \n", Controller_Master_Y_MASTER); |
AndreaAndreoli | 0:ae1df001727e | 97 | pc.printf("brake: %d \n", Controller_Master_Y_BRAKE); |
AndreaAndreoli | 0:ae1df001727e | 98 | led_B = !Controller_Master_Y_LED_BLUE; // negate because 1 -> led off |
AndreaAndreoli | 0:ae1df001727e | 99 | led_R = !Controller_Master_Y_LED_RED; |
AndreaAndreoli | 0:ae1df001727e | 100 | //led_G = !Controller_Master_Y_MASTER; |
AndreaAndreoli | 0:ae1df001727e | 101 | } |
AndreaAndreoli | 0:ae1df001727e | 102 | |
AndreaAndreoli | 0:ae1df001727e | 103 | int main() |
AndreaAndreoli | 0:ae1df001727e | 104 | { |
AndreaAndreoli | 0:ae1df001727e | 105 | /* Pack model data into RTM */ |
AndreaAndreoli | 0:ae1df001727e | 106 | Controller_Master_M->ModelData.blockIO = &Controller_Master_B; |
AndreaAndreoli | 0:ae1df001727e | 107 | Controller_Master_M->ModelData.dwork = &Controller_Master_DW; |
AndreaAndreoli | 0:ae1df001727e | 108 | |
AndreaAndreoli | 0:ae1df001727e | 109 | |
AndreaAndreoli | 0:ae1df001727e | 110 | Controller_Master_U_V = 50; |
AndreaAndreoli | 0:ae1df001727e | 111 | Controller_Master_U_D_M = 50; |
AndreaAndreoli | 0:ae1df001727e | 112 | Controller_Master_U_Slave = 1; |
AndreaAndreoli | 0:ae1df001727e | 113 | |
AndreaAndreoli | 0:ae1df001727e | 114 | /* Initialize model */ |
AndreaAndreoli | 0:ae1df001727e | 115 | Controller_Master_initialize(Controller_Master_M, &Controller_Master_U_V, |
AndreaAndreoli | 0:ae1df001727e | 116 | &Controller_Master_U_D_M, &Controller_Master_U_Slave, |
AndreaAndreoli | 0:ae1df001727e | 117 | &Controller_Master_Y_BRAKE, &Controller_Master_Y_LED_BLUE, |
AndreaAndreoli | 0:ae1df001727e | 118 | &Controller_Master_Y_LED_RED, &Controller_Master_Y_MASTER); |
AndreaAndreoli | 0:ae1df001727e | 119 | |
AndreaAndreoli | 0:ae1df001727e | 120 | /* Attach rt_OneStep to a timer or interrupt service routine with |
AndreaAndreoli | 0:ae1df001727e | 121 | * period 0.2 seconds (the model's base sample time) here. The |
AndreaAndreoli | 0:ae1df001727e | 122 | * call syntax for rt_OneStep is |
AndreaAndreoli | 0:ae1df001727e | 123 | * |
AndreaAndreoli | 0:ae1df001727e | 124 | * rt_OneStep(Controller_Master_M); |
AndreaAndreoli | 0:ae1df001727e | 125 | */ |
AndreaAndreoli | 0:ae1df001727e | 126 | t.attach(&step,0.2); |
AndreaAndreoli | 0:ae1df001727e | 127 | led_B.write(1); |
AndreaAndreoli | 0:ae1df001727e | 128 | led_G.write(1); |
AndreaAndreoli | 0:ae1df001727e | 129 | led_R.write(1); |
AndreaAndreoli | 0:ae1df001727e | 130 | while (true) { |
AndreaAndreoli | 0:ae1df001727e | 131 | wait(0.2); |
AndreaAndreoli | 0:ae1df001727e | 132 | //led_R= !led_R; |
AndreaAndreoli | 0:ae1df001727e | 133 | |
AndreaAndreoli | 0:ae1df001727e | 134 | } |
AndreaAndreoli | 0:ae1df001727e | 135 | |
AndreaAndreoli | 0:ae1df001727e | 136 | /* Disable rt_OneStep() here */ |
AndreaAndreoli | 0:ae1df001727e | 137 | |
AndreaAndreoli | 0:ae1df001727e | 138 | /* Terminate model */ |
AndreaAndreoli | 0:ae1df001727e | 139 | Controller_Master_terminate(Controller_Master_M); |
AndreaAndreoli | 0:ae1df001727e | 140 | } |