[PH]

Dependencies:   IRremouteAndButton QuadDisplayMy LIS3MDL_my sMotor

main.cpp

Committer:
allesh
Date:
2021-05-17
Revision:
1:b24bac622a37
Parent:
0:eb99909151eb

File content as of revision 1:b24bac622a37:

#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 FrameTimeoutCW_isr();
void FrameTimeoutCCW_isr();
void BounceTimeoutCW_isr();
void BounceTimeoutCCW_isr();
void CW_switch_isr();
void CCW_switch_isr();
//-----------------------
//void clk_speed_isr();
/*****************************************************************
*                           Interface
******************************************************************/

DigitalOut led1(LED1);
InterruptIn CW_switch(D10);
InterruptIn 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(USER_BUTTON);

/*****************************************************************
 *                            Time
******************************************************************/
Ticker polling_sensors;
//Ticker clk_speed;
Timeout FrameTimeoutCW;
Timeout BounceTimeoutCW;
Timeout FrameTimeoutCCW;
Timeout BounceTimeoutCCW;

/****************************************************************
*                           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;
//---------
uint8_t DebounceCW=0;
uint8_t cntCW=0;
uint8_t NewCWMode=0;
uint8_t DebounceCCW=0;
uint8_t cntCCW=0;
uint8_t NewCCWMode=0;
//------------------

/******************************************************************
 *                              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;
CW_switch.fall(&CW_switch_isr);
CCW_switch.fall(&CCW_switch_isr);
}

//------------------
void HowManyClicks()
{
    WhatButtonMode(&button_event);
    if(button_event) {
        switch (button_event) {
            case 1:
                mode=0;
                point=0;
                break;
            case 2:
                mode=1;
                point=1;
                RotateDir=0;
                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;                 
        
        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:
                    
                break;   
            case 4:      
                //sprintf(text,"%d",G[0]);
                break;
            case 5:      
                //sprintf(text,"%d",dur_time);
                break;                 
            default: 
                sprintf(text,"----");                    
                break;                      
        }                         
        SensorsEn=1;
   }         
}

/**********************************************************
*                    Interrupt Service Routines 
***********************************************************/
void FrameTimeoutCW_isr()
{
    NewCWMode=cnt;
    cntCW=0;                   
}

//---------------------
void BounceTimeoutCW_isr()
{
  DebounceCW=0;
  
}  

void FrameTimeoutCCW_isr()
{
    NewCCWMode=cnt;
    cntCCW=0;                   
}

//---------------------
void BounceTimeoutCCW_isr()
{
  DebounceCCW=0;
  
}      
//---------------------
void polling_sensors_isr()
{
 if (SensorsEn){
    sensor_daemon.flags_set(0x1);
    led1 = !led1; 
 }    
}
void CW_switch_isr()
{
     if(DebounceCW==0){
        DebounceCW=1;
        cntCW++;
        FrameTimeoutCW.detach();
        FrameTimeoutCW.attach(FrameTimeoutCW_isr,1.0);          
        BounceTimeoutCW.attach(BounceTimeoutCW_isr,0.2);
    }
}
void CCW_switch_isr()
{
     if(DebounceCCW==0){
        DebounceCCW=1;
        cntCCW++;
        FrameTimeoutCCW.detach();
        FrameTimeoutCCW.attach(FrameTimeoutCCW_isr,1.0);          
        BounceTimeoutCCW.attach(BounceTimeoutCCW_isr,0.2);
    }
}
//---------------------------------
/*void clk_speed_isr()
{
    rotate_cnt++; 
    if (rotate_cnt>10)
        dur_time_en=1;
}*/