eLab Team / Mbed 2 deprecated LaLaBox

Dependencies:   mbed CREALIB

main.cpp

Committer:
fbd38
Date:
2018-12-06
Revision:
25:3d3ebfd0a73f
Parent:
24:59caeaa9f82d
Child:
26:bf432a28d0c6

File content as of revision 25:3d3ebfd0a73f:

/*
 *   Rotator program
 *
 *  Version 1.0, December 2, 2018
 *  for Nucleo32: L432
 *
 */

#define DEBUG_MODE 3 // 0= no Debug, 1 = BT only, 2 = PC only, 3 = BT + PC 
#include "Crealab.h"
Serial bt_uart(PA_9, PA_10);
Serial pc_uart(USBTX, USBRX);

// ---------------- Local global variables --------------
int UICommad=0;     // New Command from the UI
int32_t CSpeed=0;       // Current Speed
int32_t CMod=0;         // Current Mode: 0: Stop; 1: Run; -1: Zero
int BTControl=0;    // Control taken by Bluetooth
char ExecCommand;   // Command to be execute
// ---------------- PIN DEFINITIONS ---------------------
DigitalOut myled(LED1);     // Blinking LED
//InterruptIn  buttonBox(PB_1);

// --- Define the Four PINs & Time of movement used for Motor drive -----
Motor motorRotator(PA_8, PA_11, PB_5, PB_4, 1000);
// --- Define the LEDS
int NoLED; // No LED
DigitalOut LedRouge(PB_7);
DigitalOut LedJaune(PB_0);
DigitalOut LedVerte(PA_12);
// --- Define the Speed Potentiometer
AnalogIn    SpeedPlus(PA_7);
AnalogIn    SpeedMoins(PA_6);
// --- Define the three mode switch
DigitalIn   ControlZero(PA_0, PullUp);
DigitalIn   ControlStop(PA_1, PullUp);
DigitalIn   ControlRun(PA_3, PullUp);

// ------------ Process ----------------------------------
Ticker  HWUI;

void help() // Display list of Commands
{
    DEBUG("List of commands:\n\r");
    DEBUG(" h --> Help, display list of cammands\n\r");
}

/* Stop all processes */
void stop_all()
{
    motorRotator.Stop();
}

int32_t    LireSpeed()
{
    double  inp;
    double  inm;
    int32_t TargetSpeed;
    inp=(double) SpeedPlus.read();
    inm=(double) SpeedMoins.read();
    TargetSpeed=int((inp-inm)*15.0);
    if (TargetSpeed > 9) TargetSpeed = 9;
    if (TargetSpeed < -9) TargetSpeed = -9;
    return(TargetSpeed);
}

int32_t    LireControl()
{
    if (ControlStop==0) return(0);
    if (ControlRun==0) return(1);
    if (ControlZero==0) return(-1);
    return(0);
}

void    TestHW()
{
    LedRouge=1;
    wait(0.5);
    LedJaune=1;
    wait(0.5);
    LedVerte=1;
    wait(0.5);
    LedRouge=0;
    wait(0.5);
    LedJaune=0;
    wait(0.5);
    LedVerte=0;
    wait(0.5);
}

void    HardwareUI()
{
    // Display Motor status with Green  and Yellow LEDs
    if (!NoLED) {
        if (motorRotator.GetState() == Motor_RUN) LedVerte=1;
        else if (motorRotator.GetState() == Motor_ZERO) LedVerte = !LedVerte;
        else LedVerte=0;
        if (motorRotator.direction==CLOCKWISE) LedJaune=1;
        else LedJaune=0;
        LedRouge=BTControl;
    }
}

char    ComposeCommandFromUI()
{
    char NewUICommand='-';   // Null command
    if (!BTControl) {
        int32_t TSp;
        int32_t TMod;
        int32_t TSpeed;
        int32_t TDir;
        TSp=LireSpeed();
        if (TSp>0) TDir=CLOCKWISE;
        if (TSp<0) TDir=COUNTERCLOCKWISE;
        TSpeed=abs(TSp);
        TMod=LireControl();
        if (CMod!=TMod) {
            if (TMod==0) NewUICommand = 'S';
            if (TMod==1) {
                if (TDir == CLOCKWISE) NewUICommand='R';
                else NewUICommand='L';
            }
            if (TMod==-1) NewUICommand = 'Z';
            CMod=TMod;
        } else {
            if (TSpeed!=CSpeed) {
                if (TSpeed==0)NewUICommand = 'S';
                else NewUICommand = char('0'+TSpeed);
                CSpeed=TSpeed;
            }
        }
    }
    return (NewUICommand);
}

/* Message */
void message()
{
    DEBUG("-------------------------------------------------------\n\r");
    DEBUG("-------------------------------------------------------\n\r");
}

/* Main Routine */
int main()
{
    myled = 1;      // To see something is alive
    bool flaghelp;
// -- Uncomment to program the HC-06 Module
//    DEBUG("AT+NAMECreaRoll_x");
//    wait(10);
    if (ControlZero==0) NoLED=1;
    else {
        NoLED=0;
        TestHW();
    }
    DEBUG("-------------------------------------------------------\n\r");
    DEBUG("-----        CreaRoll         version 1.0         -----\n\r");
    DEBUG("-----     faite par fbd38 le   2 Dec 2018         -----\n\r");
    DEBUG("-------------------------------------------------------\n\r");
//    DEBUG("SystemCoreClock = %d Hz =\n\r", SystemCoreClock);
//    DEBUG("Wait 2s\n\r");
    myled = 0;      // Real stuff starts here
    motorRotator.setSpeed(20.0); /* Default */
    // Install UI
    HWUI.attach(&HardwareUI, 0.3);

    while(1) {
        ExecCommand='-';    // Clear The Command List
        /*      Wait Until some command is in the pipe
         *          eitheir from BT module or HWUI
         */
        if (bt_uart.readable()) {
            char BTlc;   // BT Character to execute
            BTlc = bt_uart.getc();
            if (BTlc=='!') {
                BTControl = 1;
            } else {
                if (BTlc=='.') {
                    BTControl=0;
                } else if (BTControl) ExecCommand=BTlc;
            }
        }
        // In cas of not controlled by BT, get command from the HW UI
        if (!BTControl) {
            ExecCommand=ComposeCommandFromUI();
            }
        // ------ Test according with the receved command
        if (ExecCommand!='-') {
            DEBUG("Commande Recue: [%c]", ExecCommand);
            flaghelp = false;
            switch (ExecCommand) {
                case 'h':
                    help();
                    flaghelp=true;
                    CASE('R', "Infinite Clockwise", motorRotator.RunInfinite(CLOCKWISE);    )
                    CASE('L', "Infinite Counterclockwise", motorRotator.RunInfinite(COUNTERCLOCKWISE);    )
                    CASE('Z', "Go Back to Zero", motorRotator.SetZero(); )
                    CASE('z', "Define the Zero", motorRotator.DefineZero(); )
                    CASE('r', "15deg Clockwise", motorRotator.RunDegrees(CLOCKWISE, (float)15.0);       )
                    CASE('l', "15deg Counterclockwise", motorRotator.RunDegrees(COUNTERCLOCKWISE, (float)15.0);  )
                    CASE('1', "Speed 10m/t", motorRotator.setSpeed(600.0);  )
                    CASE('2', "Speed 2m/t", motorRotator.setSpeed(120.0);  )
                    CASE('3', "Speed 1m/t", motorRotator.setSpeed(60.0);  )
                    CASE('4', "Speed 30s/t", motorRotator.setSpeed(30.0);  )
                    CASE('5', "Speed 20s/t", motorRotator.setSpeed(20.0);  )
                    CASE('6', "Speed 15s/t", motorRotator.setSpeed(15.0);  )
                    CASE('7', "Speed 10s/t",motorRotator.setSpeed(10.0);    )
                    CASE('8', "Speed 7s/t",motorRotator.setSpeed(7.0);    )
                    CASE('9', "Speed 5s/t",motorRotator.setSpeed(5.0);    )
                    CASE('0', "STOP ", stop_all();   )
                    CASE('S', "STOP ", stop_all();   )
                    CASE('?', "Mistery", message(); )

                default :
                    DEBUG("invalid command; use: 'h' for help()");
            }
        }
    }
}