1
Dependencies: sMotor LIS3MDL X_NUCLEO_53L0A1
main.cpp
- Committer:
- simens
- Date:
- 2019-05-23
- Revision:
- 0:ed3e71232bc7
File content as of revision 0:ed3e71232bc7:
#include "mbed.h"
#include "XNucleo53L0A1.h"
#include "L3G4200D_my.h"
#include "sMotor.h"
#include "lis3mdl_class.h"
/****************************************************************
* Definitions *
*****************************************************************/
/*****************************************************************
* Prototypes *
*****************************************************************/
void button1_enabled_cb(void);
void button1_onpressed_cb(void);
void Ini();
void proximityR_isr();
void proximityF_isr();
void polling_sensors_isr();
void sensors_task();
void execute_pc(int events);
void DurationMesure(uint32_t *dt);
/*****************************************************************
* Interface *
******************************************************************/
DigitalOut led1(LED1);
InterruptIn button1(USER_BUTTON);
RawSerial pc(USBTX, USBRX);
DevI2C *device_i2c;
static XNucleo53L0A1 *board=NULL;
sMotor motor(A5, A4, A3, A1);
InterruptIn proximity(A0);
DevI2C devI2c(D14,D15);
LIS3MDL magnetometer(&devI2c,LIS3MDL_M_MEMS_ADDRESS_LOW);
/*****************************************************************
* Threads *
******************************************************************/
Thread sensor_daemon;
/*****************************************************************
* Time *
******************************************************************/
Timeout button1_timeout; // Used for debouncing
Ticker polling_sensors;
Timer DurationTimer;
/*****************************************************************
* Global variables *
******************************************************************/
volatile bool button1_pressed = false; // Used in the main loop
volatile bool button1_enabled = true; // Used for debouncing
uint8_t mode=0;
uint8_t prox=0;
uint8_t SensorsEn=1;
uint32_t distance_c;
uint32_t distance_l;
uint32_t distance_r;
int16_t G[3];
char rxpc_buffer[128];
uint32_t TaskDurationL;
uint32_t TaskDurationR;
uint32_t TaskDurationC;
uint32_t TaskDurationG;
uint8_t direction;
uint8_t point = 0;
/*****************************************************************
* Main *
******************************************************************/
int main()
{
Ini();
while (true) {
if(button1_pressed){
mode++;
if(mode>4)
mode=0;
button1_pressed=false;
}
if(point){
motor.step(point, direction, 5000);
}else {
wait(0.05);
}
}
}
/***********************************************************
* Functions *
***********************************************************/
void Ini()
{
// thread.start(print_thread);
//button1.mode(PullUp); // Activate pull-up
// Attach ISR to handle button press event
button1.fall(callback(button1_onpressed_cb));
pc.baud(115200);
device_i2c = new DevI2C(D14, D15);
board = XNucleo53L0A1::instance(device_i2c, A2, D8, D2);
int status = board->init_board();
if (status)
pc.printf("Failed to init XNucleo53L0A1 board!\r\n");
char text[5];
sprintf(text,"mbed");
board->display->display_string(text);
GyroL3G4200D_Ini(device_i2c);
proximity.mode(PullUp);
proximity.rise(&proximityR_isr);
proximity.fall(&proximityF_isr);
mode=5;
wait(2.0);
sensor_daemon.start(sensors_task);
SensorsEn=1;
polling_sensors.attach(&polling_sensors_isr, 0.4);
pc.read((uint8_t *)rxpc_buffer,
128, &execute_pc, SERIAL_EVENT_RX_ALL,10);
}
//-----------------------
void DurationMesure(uint32_t *dt)
{
DurationTimer.stop();
*dt=DurationTimer.read_us();
DurationTimer.reset();
}
//-------------------------------------------
void sensors_task()
{
int status;
char text[5];
while (true) {
ThisThread::flags_wait_any(0x1,true);
SensorsEn=0;
//DurationTimer.start();
status = board->sensor_left->get_distance(&distance_l);
if (status != VL53L0X_ERROR_NONE)
distance_l=8888;
//DurationMesure(&TaskDurationL);
//DurationTimer.start();
status = board->sensor_right->get_distance(&distance_r);
if (status != VL53L0X_ERROR_NONE)
distance_r=8888;
//DurationMesure(&TaskDurationR);
//DurationTimer.start();
status = board->sensor_centre->get_distance(&distance_c);
if (status != VL53L0X_ERROR_NONE)
distance_c=8888;
//DurationMesure(&TaskDurationC);
switch(mode){
case 0:
point = 0;
sprintf(text,"c%ld",distance_c);
break;
case 1:
point = 0;
sprintf(text,"l%ld", distance_l);
break;
case 2:
point = 0;
sprintf(text,"r%ld", distance_r);
break;
case 3:
int a = abs((int)distance_r-(int)distance_l);
sprintf(text,"d%ld",a);
if(a<10){
point = 0;
}else{
if ((int)distance_r>(int)distance_l)
{
point = 1;
direction = 1;
}
else
{
point = 1;
direction = 0;
}
}
break;
case 4:
sprintf(text,"%d",G[0]);
direction = 0;
point = 1;
if(prox)
point = 0;
break;
default:
sprintf(text,"End");
break;
}
board->display->display_string(text);
SensorsEn=1;
}
}
//------------------------------
void execute_pc(int events)
{
char *endptr;
if(SERIAL_EVENT_RX_CHARACTER_MATCH & events)
switch(rxpc_buffer[0]) {
case 'T':
case 't':
pc.printf("DL=%ld,DR=%ld,DC=%ld,DG=%ld",
TaskDurationL,TaskDurationR,TaskDurationC,TaskDurationG);
break;
case 'S':
case 's':
pc.printf("DC=%d, DL=%d, DR=%d, PROX=%d, GYRO=%d,%d,%d",
distance_c,distance_l,distance_r,proximity?1:0,G[0],G[1],G[2]);
break;
case 'M':
case 'm':
mode=strtol(&rxpc_buffer[1],&endptr,10);
break;
}
else
pc.printf("evtnt=%d", events);
pc.read((uint8_t *)rxpc_buffer, 128,
&execute_pc,SERIAL_EVENT_RX_ALL,10);//(unsigned char)'\n');
}
/***********************************************************
* Interrupt Service Routines *
***********************************************************/
//----------------------------ISR handling button pressed event
void button1_onpressed_cb(void)
{
if (button1_enabled) {// Disabled while the button is bouncing
button1_enabled = false;
button1_pressed = true; // To be read by the main loop
// Debounce time 50 ms
button1_timeout.attach(callback(button1_enabled_cb), 0.03);
}
}
//---------------------------Enables button when bouncing is over
void button1_enabled_cb(void)
{
button1_enabled = true;
}
//--------------------------------
void proximityR_isr()
{
prox=1;
}
//--------------
void proximityF_isr()
{
prox=0;
}
//------------
void polling_sensors_isr()
{
if (SensorsEn){
sensor_daemon.flags_set(0x1);
led1 = !led1;
}
}