BA / SerialCom

Fork of OmniWheels by Gustav Atmel

Main.cpp

Committer:
gustavatmel
Date:
2018-03-12
Revision:
0:d698f15ceaf1
Child:
1:9c5af431a1f1

File content as of revision 0:d698f15ceaf1:

/*
 * Main.cpp
 * Copyright (c) 2017, ZHAW
 * All rights reserved.
 *
 *  Created on: 06.10.2017
 *      Author: Marcel Honegger
 */

#include <cstdlib>
#include <mbed.h>
#include "IRSensor.h"
#include "Controller.h"
#include "StateMachine.h"
#include "SerialServer.h"

using namespace std;

class Main {
    
    public:
        
                    Main();
        virtual     ~Main();
        
    private:
        
        static const uint32_t   STACK_SIZE = 8192;  // stack size of thread, given in [bytes]
        
        Thread      thread;
        void        run();
};

Main::Main() : thread(osPriorityNormal, STACK_SIZE) {
    
    thread.start(callback(this, &Main::run));
}

Main::~Main() {}

void Main::run() {
    
    // create miscellaneous periphery objects
    
    DigitalOut led(LED1);
    DigitalIn button(USER_BUTTON);
    
    DigitalOut led0(PB_1);
    DigitalOut led1(PC_3);
    DigitalOut led2(PD_2);
    
    // create motor control objects
    
    DigitalOut enableMotorDriver0(PB_5);
    DigitalIn motor0Error(PA_13);
    PwmOut pwm0(PB_8);
    AnalogIn motor0Current(PA_0);
    
    DigitalOut enableMotorDriver1(PB_4);
    DigitalIn motor1Error(PA_14);
    PwmOut pwm1(PB_9);
    AnalogIn motor1Current(PA_1);
    
    DigitalOut enableMotorDriver2(PB_3);
    DigitalIn motor2Error(PA_15);
    PwmOut pwm2(PB_6);
    AnalogIn motor2Current(PA_4);
    
    // create distance sensor objects
    
    AnalogIn distance0(PC_0);
    AnalogIn distance1(PC_1);
    AnalogIn distance2(PC_2);
    
    IRSensor irSensor0(distance0);
    IRSensor irSensor1(distance1);
    IRSensor irSensor2(distance2);
    
    // create robot controller objects
    
    Controller controller(pwm0, pwm1, pwm2);
    StateMachine stateMachine(controller, enableMotorDriver0, enableMotorDriver1, enableMotorDriver2, led0, led1, led2, button, irSensor0, irSensor1, irSensor2);
    
    // create serial server object
    
    RawSerial serial(PA_11, PA_12);
    serial.baud(38400);
    serial.format(8, SerialBase::None, 1);
    
    DigitalOut reset(PB_12);
    DigitalOut modes1(PB_0);
    
    modes1 = 0;
    
    reset = 1; Thread::wait(100);
    reset = 0; Thread::wait(100);
    reset = 1; Thread::wait(100);
    
    SerialServer serialServer(serial, stateMachine);
    
    // enter main loop
    
    while (true) {
        
        led = !led;
        
        if (stateMachine.getState() == StateMachine::STATE_MANUAL) {
            Thread::wait(100);
        } else if (stateMachine.getState() == StateMachine::STATE_AUTOMATIC) {
            Thread::wait(200);
        } else {
            Thread::wait(500);
        }
    }
}

/**
 * This is the main program of the ROME2RevG firmware.
 */
int32_t main() {
    
    Main main;
    
    Thread::wait(osWaitForever);
}