
d
Dependencies: mbed
Fork of AEB by
Diff: main.cpp
- Revision:
- 0:9d530d56a118
- Child:
- 1:45911e86ffee
diff -r 000000000000 -r 9d530d56a118 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Jul 24 14:42:26 2016 +0000 @@ -0,0 +1,178 @@ +#include "mbed.h" + + #include "controller.h" + #include "rtwtypes.h" + +DigitalOut led(LED_RED); +DigitalOut trigger(D2); +InterruptIn echo(D4); +Timer t; +Ticker scheduler; + +float distance; + +Serial pc(USBTX, USBRX); // tx, rx + + +// +// Copy from ert_main.c +// +static RT_MODEL_Controller_T Controller_M_; +static RT_MODEL_Controller_T *const Controller_M = &Controller_M_;/* Real-time model */ +static DW_Controller_T Controller_DW; /* Observable states */ + +/* '<Root>/distance' */ +static real32_T Controller_U_distance; + +/* '<Root>/led' */ +static uint8_T Controller_Y_led; + +/* + * Associating rt_OneStep with a real-time clock or interrupt service routine + * is what makes the generated code "real-time". The function rt_OneStep is + * always associated with the base rate of the model. Subrates are managed + * by the base rate from inside the generated code. Enabling/disabling + * interrupts and floating point context switches are target specific. This + * example code indicates where these should take place relative to executing + * the generated code step function. Overrun behavior should be tailored to + * your application needs. This example simply sets an error status in the + * real-time model and returns from rt_OneStep. + */ + void rt_OneStep(RT_MODEL_Controller_T *const Controller_M); + void rt_OneStep(RT_MODEL_Controller_T *const Controller_M) + { + static boolean_T OverrunFlag = false; + + /* Disable interrupts here */ + + /* Check for overrun */ + if (OverrunFlag) { + rtmSetErrorStatus(Controller_M, "Overrun"); + return; + } + + OverrunFlag = true; + + /* Save FPU context here (if necessary) */ + /* Re-enable timer or interrupt here */ + /* Set model inputs here */ + + /* Step the model */ + Controller_step(Controller_M, Controller_U_distance, &Controller_Y_led); + + /* Get model outputs here */ + + /* Indicate task complete */ + OverrunFlag = false; + + /* Disable interrupts here */ + /* Restore FPU context here (if necessary) */ + /* Enable interrupts here */ + } +// +// End copy +// + +void do_step( void ) +{ + Controller_U_distance = distance; + + rt_OneStep(Controller_M); + + led = Controller_Y_led; +} + +void start( void ) +{ + t.start(); +} + +void stop( void ) +{ + t.stop(); + distance = t.read_us()/58.0; + t.reset(); +} + + +Timer t1; + +void serialSend(float v) { + pc.printf("aaaa"); // header + unsigned char* data = (unsigned char*) &v; + for (int i = 0; i < 4; i++) { + pc.putc(data[i]); + } + pc.printf("\r\n"); // end of line +} + +void serialSendVec(float vec[], int length) { + pc.printf("aaaa"); // header + unsigned char* data = (unsigned char*) vec; + for (int i = 0; i < length*4; i++) { + pc.putc(data[i]); + } + pc.printf("\r\n"); // end of line +} + +int main() +{ + + float v = 0; + int i = 0; + float g = 0; + while(true) { + // pc.printf("sending at time %d\r\n", i++); + serialSend(v); + //pc.printf("%f\r\n", v); + + v += 0.1f; + g = sqrt(v); + if(v > 10) v = 0; + wait(0.001); + led = !led; + } + + while(true) { + char buf[200]; + t1.start(); + pc.printf("start read\r\n"); + pc.gets(buf, 199); + t1.stop(); + buf[199]=0; + float sp; + sscanf(buf, "%f", &sp); + pc.printf("received after %fs: <<%f>>\r\n", t1.read(), sp); + } + // + // Copy from ert_main.c + // + /* Pack model data into RTM */ + Controller_M->ModelData.dwork = &Controller_DW; + + /* Initialize model */ + Controller_initialize(Controller_M, &Controller_U_distance, &Controller_Y_led); + // + // End copy + // + + scheduler.attach( &do_step, 0.2 ); + + t.reset(); + echo.rise( &start ); + echo.fall( &stop ); + + Controller_U_distance = 0; + trigger = 0; + + while (true) { + pc.printf( "Reading inputs....\n\r" ); + + trigger = 1; + wait_us( 10 ); + trigger = 0; + + pc.printf( "\n\rDistance: %.3f\n\r", Controller_U_distance ); + + } +} \ No newline at end of file