PH

Dependencies:   IRremouteAndButton QuadDisplayMy LIS3MDL_my sMotor

main.cpp

Committer:
ankazwork
Date:
2021-05-17
Revision:
0:eb99909151eb

File content as of revision 0:eb99909151eb:

#include "mbed.h"
#include "platform/mbed_thread.h"
#include "UserButton.h"
#include "sMotor.h" 
#include "lis3mdl_class.h"
#include "QuadDisplay2.h"

/****************************************************************
*                           Definitions 
****************************************************************/

// Blinking rate in milliseconds
#define step_speed 1500
#define POINTS 1
#define M_PI 3.14159265358979323846
#define RADIAN M_PI/180.0

/****************************************************************
*                          Prototypes   
*****************************************************************/

void Ini();
void HowManyClicks();
void proximityR_isr();
void proximityF_isr();
//-----------------------
void polling_sensors_isr();
void sensors_task();
//-----------------------
void clk_speed_isr();
/*****************************************************************
*                           Interface
******************************************************************/

DigitalOut led1(LED1);
DigitalIn CW_switch(D10);
DigitalIn CCW_switch(D11);
//---
RawSerial pc(USBTX, USBRX);
DevI2C devI2c(D14,D15);
LIS3MDL magnetometer(&devI2c,LIS3MDL_M_MEMS_ADDRESS_LOW);
DigitalOut led2(A0);
SPI spi(D4, D5, D3);
QuadDisplayMy display(&spi,D6);
//---
sMotor motor(A5, A4, A3, A2); // creates new stepper motor: IN1, IN2, IN3, IN4
InterruptIn BlueBatton(BUTTON)

/*****************************************************************
 *                            Time
******************************************************************/
//Ticker polling_sensors;
//Ticker clk_speed;
/****************************************************************
*                           Threads  
****************************************************************/
//Thread sensor_daemon;

/*****************************************************************
*                             Global variables
******************************************************************/


//----------------
uint8_t button_event;
uint8_t mode=0;
uint8_t RotateDir;
uint16_t RotateSpeed;
//----------------
uint8_t SensorsEn=1;

int16_t M[3];
uint8_t point;
uint32_t rotate_cnt;
//---------
//------------------

/******************************************************************
 *                              Main 
******************************************************************/
int main()
{
    // Initialise the digital pin LED1 as an output
    
    Ini();
    
    while (true) {
        //led = !led;
        HowManyClicks();
        if (mode){
            
        }
        if (point){
            motor.step(POINTS, RotateDir, RotateSpeed);
        }else
           wait_us(step_speed);
             
        //thread_sleep_for(BLINKING_RATE_MS);
    }
}

/**********************************************************
*                              Functions  
***********************************************************/
void Ini()
{
 pc.baud(115200);
 ButtonIni(&BlueBatton);
 button_event_ind=button_event=0;
 
 
//--------------

sensor_daemon.start(sensors_task);
SensorsEn=1;
polling_sensors.attach(&polling_sensors_isr, 0.4);
clk_speed.attach(&clk_speed_isr, 0.01);
mode=0;
point=0;
RotateSpeed=step_speed;
rotate_cnt=0;
}

//------------------
void HowManyClicks()
{
    WhatButtonMode(&button_event)
    if(button_event) {
        switch (button_event) {
            case 1:
                mode=0;
                point=0;
                break;
            case 2:
                mode=1;
                point=0;
                //RotateDir=1;
                //RotateSpeed=step_speed;
                break;                    
            case 3:
                mode=2;
                point=0;
                //RotateDir=0;
                //RotateSpeed=step_speed;
                break;
            case 4:
                mode=3;
                point=0;
                //RotateDir=1;
                //RotateSpeed=step_speed;
                break;
            case 5:
                mode=4;
                point=0;
                //RotateSpeed=step_speed*2;
                //RotateDir=0;
                break;
            case 6:
                mode=5; 
                point=1;
                RotateSpeed=step_speed*2;
                RotateDir=1; 
                break;
             case 7:
                
                break;               
                
            default:
                break;                                                                                                   
        }     
        button_event=0;            
    }  
}

//-----------------
void sensors_task()
{
 int status;
 char text[5];
 int32_t dif; 
 
    while (true) {
        ThisThread::flags_wait_any(0x1,true);
        SensorsEn=0;                 
        status = board->sensor_left->get_distance(&distance_l); 
        if (status != VL53L0X_ERROR_NONE)
            distance_l=8888;  
        status = board->sensor_right->get_distance(&distance_r);
        if (status != VL53L0X_ERROR_NONE)
             distance_r=8888;      
        status = board->sensor_centre->get_distance(&distance_c); 
        if (status != VL53L0X_ERROR_NONE)
             distance_c=8888; 
        switch(mode){
            case 0:
                sprintf(text,"c%3d",distance_c);  
                break;
            case 1:
                sprintf(text,"l%3d", distance_l);                        
                break;  
            case 2:      
                sprintf(text,"r%3d", distance_r);
                break;    
            case 3:
                dif=((int)distance_r-(int)distance_l);   
                sprintf(text,"d%3d",dif);
                if (abs(dif)>4) {
                    point=1;
                    if(dif>0)
                        RotateDir=1;
                    else
                        RotateDir=0;
                }else    
                    point=0;                       
                break;   
            case 4:      
                sprintf(text,"%d",G[0]);
                break;
            case 5:      
                sprintf(text,"%d",dur_time);
                break;                 
            default: 
                sprintf(text,"----");                    
                break;                      
        } 
        board->display->display_string(text);                                 
        SensorsEn=1;
   }         
}

/**********************************************************
*                    Interrupt Service Routines 
***********************************************************/
void proximityR_isr()
{
  prox=1;      
} 
//---------------------
void proximityF_isr()
{ 
  prox=0;      
}    

//---------------------
void polling_sensors_isr()
{
 if (SensorsEn){
    sensor_daemon.flags_set(0x1);
    led = !led; 
 }    
}
//---------------------------------
void clk_speed_isr()
{
    rotate_cnt++; 
    if (rotate_cnt>10)
        dur_time_en=1;
}