Test program for master controller

Dependencies:   Controller_Master mbed

Committer:
AndreaAndreoli
Date:
Sat Jun 04 16:58:50 2016 +0000
Revision:
0:ae1df001727e
First commit

Who changed what in which revision?

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