Oliver Wenzel / Mbed 2 deprecated mbed_amf_controlsystem_iO_copy

Dependencies:   mbed-rtos mbed

Fork of mbed_amf_controlsystem by Matti Borchers

Files at this revision

API Documentation at this revision

Comitter:
mborchers
Date:
Wed Feb 03 17:19:21 2016 +0000
Child:
1:7eddde9fba60
Commit message:
Erster Commit

Changed in this revision

Misc/SystemTimer.cpp Show annotated file Show diff for this revision Revisions of this file
Misc/SystemTimer.h Show annotated file Show diff for this revision Revisions of this file
Periphery/SupportSystem.cpp Show annotated file Show diff for this revision Revisions of this file
Periphery/SupportSystem.h Show annotated file Show diff for this revision Revisions of this file
Starter.h Show annotated file Show diff for this revision Revisions of this file
Threads/MachineDirectionControl.cpp Show annotated file Show diff for this revision Revisions of this file
Threads/MachineDirectionControl.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Misc/SystemTimer.cpp	Wed Feb 03 17:19:21 2016 +0000
@@ -0,0 +1,33 @@
+#include <Misc/SystemTimer.h>
+
+
+SystemTimer::SystemTimer(){
+
+    systemUptimeMillis = 0;
+
+    systemTicker.attach_us(this,&SystemTimer::systemTickerHandler,1000);
+
+}
+
+void SystemTimer::systemTickerHandler(){
+
+    systemUptimeMillis++;
+
+}
+
+
+uint64_t SystemTimer::getUptimeMillis(){
+    return systemUptimeMillis;
+}
+
+
+bool SystemTimer::isTimeoutPassed(uint64_t *timestampMillis, uint32_t timeoutMillis){
+
+    if((systemUptimeMillis - *timestampMillis) > timeoutMillis){
+        *timestampMillis = systemUptimeMillis;
+        return true;
+    }else{
+        return false;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Misc/SystemTimer.h	Wed Feb 03 17:19:21 2016 +0000
@@ -0,0 +1,29 @@
+#ifndef SYSTEMTIMER_H_
+#define SYSTEMTIMER_H_
+
+#include "mbed.h"
+
+class SystemTimer {
+
+private:
+
+    uint64_t systemUptimeMillis;
+
+    Ticker systemTicker;
+
+public:
+
+    SystemTimer();
+
+    void systemTickerHandler();
+
+    uint64_t getUptimeMillis();
+
+    bool isTimeoutPassed(uint64_t *timestampMillis, uint32_t timeoutMillis);
+
+
+};
+
+
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Periphery/SupportSystem.cpp	Wed Feb 03 17:19:21 2016 +0000
@@ -0,0 +1,265 @@
+#include <Periphery/SupportSystem.h>
+
+
+SupportSystem::SupportSystem(){
+
+    init(0,0);
+
+    transmissionErrorCount = 0;
+    lightManagerCommand = 0;
+}
+
+SupportSystem::SupportSystem(uint8_t i2cAddress, I2C *i2c){
+
+    init(i2cAddress, i2c);
+
+    transmissionErrorCount = 0;
+    lightManagerCommand = 0;
+}
+
+void SupportSystem::init(uint8_t i2cAddress, I2C *i2c){
+
+    this->i2cAddress = i2cAddress;
+    this->i2c = i2c;
+
+}
+
+
+
+void SupportSystem::readData(uint8_t registerAddress, void *buffer, size_t length){
+
+
+    i2c->write(i2cAddress,(const char*)&registerAddress,sizeof(uint8_t),false);
+    i2c->read(i2cAddress,(char*)buffer,length,false);
+
+}
+
+void SupportSystem::writeData(uint8_t registerAddress, void *buffer, size_t length){
+
+
+    i2c->start();
+
+
+    if(!i2c->write(i2cAddress & 0xfe)){
+        i2c->stop();
+        return;
+    }
+
+    if(!i2c->write(registerAddress)){
+        i2c->stop();
+        return;
+    }
+
+    for(uint32_t i=0; i<length; i++){
+        if(!i2c->write(*((uint8_t*)buffer))){
+            *(uint8_t*)buffer += 1;
+            i2c->stop();
+            return;
+        }
+    }
+
+    i2c->stop();
+
+
+}
+
+
+uint16_t SupportSystem::crc16_update(uint16_t crc, uint8_t a) {
+    int i;
+
+    crc ^= a;
+    for (i = 0; i < 8; ++i) {
+        if (crc & 1)
+            crc = (crc >> 1) ^ 0xA001;
+        else
+            crc = (crc >> 1);
+    }
+
+    return crc;
+}
+
+uint16_t SupportSystem::generateChecksum(void *data, size_t len){
+
+    uint16_t i, crc = 0;
+
+    char *baseAddress = (char*)(data);
+
+    for(i=0;i<len;i++){
+        char c = baseAddress[i];
+        crc = crc16_update(crc, c);
+    }
+
+    return crc;
+
+}
+
+uint32_t SupportSystem::getTransmissionErrorCount(){
+    return transmissionErrorCount;
+}
+
+/************************************************************
+ *
+ * Maintenance
+ *
+ ***********************************************************/
+
+uint32_t SupportSystem::readMaintenanceUptimeMillis(){
+
+    uint32_t uptimeMillis;
+
+    readData(SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_UPTIME,(void*)&uptimeMillis,sizeof(uint32_t));
+
+    return uptimeMillis;
+}
+
+/************************************************************
+ *
+ * IMU
+ *
+ ***********************************************************/
+
+//float SupportSystem::readImuDistanceX(){
+//
+//  float traveledDistance;
+//
+//  readData(SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_DISTANCE_X,(void*)&traveledDistance,sizeof(float));
+//
+//  return traveledDistance;
+//
+//}
+//
+//
+//void SupportSystem::writeImuCommandResetDistanceX(){
+//
+//  uint8_t command = (1<<1);
+//
+//  writeData(SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_COMMAND,(void*)&command,sizeof(uint8_t));
+//
+//}
+
+
+IMU_RegisterDataBuffer_t *SupportSystem::getImuRegisterDataBuffer(){
+
+    uint8_t tries = 0;
+    uint16_t checksum;
+
+    do{
+
+        readData(SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET,(void*)&IMU_registerDataBuffer,sizeof(IMU_RegisterDataBuffer_t));
+        checksum = generateChecksum(&IMU_registerDataBuffer,(sizeof(IMU_RegisterDataBuffer_t) - sizeof(uint16_t)));
+
+    }while(tries++ < 5 && checksum != IMU_registerDataBuffer.completeChecksum);
+
+    transmissionErrorCount += tries-1;
+
+    return &IMU_registerDataBuffer;
+
+}
+
+
+/************************************************************
+ *
+ * LightManager
+ *
+ ***********************************************************/
+
+void SupportSystem::writeLightManagerCommand(){
+
+    uint8_t tries = 0;
+    uint8_t control;
+
+    do{
+
+        writeData(SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_COMMAND,(void*)&lightManagerCommand,sizeof(uint8_t));
+        readData(SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_COMMAND,(void*)&control,sizeof(uint8_t));
+
+    }while(tries++ < 5 && control != lightManagerCommand);
+
+    transmissionErrorCount += tries-1;
+
+}
+
+void SupportSystem::setLightManagerCommandBit(bool value, uint8_t bit){
+
+    if(value){
+        lightManagerCommand |= (1<<bit);
+    }else{
+        lightManagerCommand &= ~(1<<bit);
+    }
+}
+
+void SupportSystem::setLightManagerBrakeLight(bool active, bool writeOut){
+
+    setLightManagerCommandBit(active,SUPPORT_SYSTEM_LIGHTMANAGER_BIT_BRAKE_LIGHT);
+
+    if(writeOut){
+        writeLightManagerCommand();
+    }
+
+}
+
+void SupportSystem::setLightManagerRemoteLight(bool active, bool writeOut){
+
+    setLightManagerCommandBit(active,SUPPORT_SYSTEM_LIGHTMANAGER_BIT_REMOTE_LIGHT);
+
+    if(writeOut){
+        writeLightManagerCommand();
+    }
+
+}
+
+void SupportSystem::setLightManagerSignalLeft(bool active, bool writeOut){
+
+    setLightManagerCommandBit(active,SUPPORT_SYSTEM_LIGHTMANAGER_BIT_SIGNAL_LEFT);
+
+    if(writeOut){
+        writeLightManagerCommand();
+    }
+
+}
+
+void SupportSystem::setLightManagerSignalRight(bool active, bool writeOut){
+
+    setLightManagerCommandBit(active,SUPPORT_SYSTEM_LIGHTMANAGER_BIT_SIGNAL_RIGHT);
+
+    if(writeOut){
+        writeLightManagerCommand();
+    }
+
+}
+
+void SupportSystem::setLightManagerSignalBoth(bool active, bool writeOut){
+
+
+    setLightManagerCommandBit(active,SUPPORT_SYSTEM_LIGHTMANAGER_BIT_SIGNAL_BOTH);
+
+    if(writeOut){
+        writeLightManagerCommand();
+    }
+
+}
+
+
+/************************************************************
+ *
+ * RadioDecoder
+ *
+ ***********************************************************/
+
+RadioDecoder_RegisterDataBuffer_t *SupportSystem::getRadioDecoderRegisterDataBuffer(){
+
+    uint8_t tries = 0;
+    uint16_t checksum;
+
+    do{
+
+        readData(SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET,(void*)&RadioDecoder_registerDataBuffer,sizeof(RadioDecoder_RegisterDataBuffer_t));
+        checksum = generateChecksum(&RadioDecoder_registerDataBuffer,sizeof(uint8_t)*12);
+
+    }while(tries++ < 5 && checksum != RadioDecoder_registerDataBuffer.checksum);
+
+    transmissionErrorCount += tries-1;
+
+    return &RadioDecoder_registerDataBuffer;
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Periphery/SupportSystem.h	Wed Feb 03 17:19:21 2016 +0000
@@ -0,0 +1,218 @@
+#ifndef SUPPORTSYSTEM_H_
+#define SUPPORTSYSTEM_H_
+
+#include <mbed.h>
+#include <I2C.h>
+
+/*
+ * Necessary for strcut sizes
+ */
+#pragma pack (1)
+
+
+/*
+ * Data container
+ */
+
+typedef struct {
+    uint8_t i2cDeviceAddress;
+    uint32_t uptimeMillis;
+} Main_MaintenanceRegisterDataBuffer_t;
+
+typedef struct {
+
+    uint8_t commandRegister;
+
+    int32_t sensorRawXRegister;
+    int32_t sensorRawYRegister;
+
+    float velocityXRegister;
+    float velocityXFilteredRegister;
+    float velocityAngularRegister;
+    float velocityAngularFilteredRegister;
+
+    float positionXRegister;
+    float positionYRegister;
+    float positionAngleRegister;
+
+    float conversionFactorRegister;
+
+    float sensorPositionXRegister;
+    float sensorPositionYRegister;
+    float sensorPositionAngleRegister;
+
+    int32_t curveRadiusRegister;
+
+    float distanceXRegister;
+
+    uint16_t squal;
+
+    uint16_t completeChecksum;
+//  uint16_t velocityChecksumRegister;
+//  uint16_t positionChecksumRegister;
+
+} IMU_RegisterDataBuffer_t;
+
+typedef struct {
+    uint8_t commands;
+} LightManager_RegisterDataBuffer_t;
+
+typedef struct {
+
+    uint8_t  channelValid[3];
+    uint16_t channelActiveTime[3];
+    int8_t   channelPercent[3];
+    uint16_t checksum;
+
+} RadioDecoder_RegisterDataBuffer_t;
+
+
+
+
+/*
+ * Support system - software register
+ */
+
+// Maintenance
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_OFFSET                  0
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_ADDRESS                 (SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_OFFSET + 0)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_UPTIME                  (SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_OFFSET + 1)
+
+// IMU
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET                          sizeof(Main_MaintenanceRegisterDataBuffer_t)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_COMMAND                         (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 0)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_RAW_X                    (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 1)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_RAW_Y                    (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 5)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_X                      (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 9)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_X_FILTERED             (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 13)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_ANGULAR                (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 17)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_ANGULAR_FILTERED       (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 21)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_POSITION_X                      (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 25)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_POSITION_Y                      (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 29)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_POSITION_ANGLE                  (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 33)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_CONVERSION_FACTOR               (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 37)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_POSITION_X               (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 41)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_POSITION_Y               (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 45)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_POSITION_ANGLE           (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 49)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_CURVE_RADIUS                    (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 53)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_DISTANCE_X                      (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 57)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SQUAL                           (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 61)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_COMPLETE_CHECKSUM               (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 63)
+
+//#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_CHECKSUM             (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 63)
+//#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_POSITION_CHECKSUM             (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 65)
+
+// Light manager
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_OFFSET                 (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + sizeof(IMU_RegisterDataBuffer_t))
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_COMMAND                (SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_OFFSET + 0)
+
+// Radio decoder
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET                     (SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_OFFSET + sizeof(LightManager_RegisterDataBuffer_t))
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_ONE_VALID          (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 0)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_TWO_VALID          (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 1)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_THREE_VALID        (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 2)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_ONE_ACTIVE_TIME    (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 3)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_TWO_ACTIVE_TIME    (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 5)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_THREE_ACTIVE_TIME  (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 7)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_ONE_PERCENTAGE     (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 9)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_TWO_PERCENTAGE     (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 10)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_THREE_PERCENTAGE   (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 11)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHECKSUM                   (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 12)
+
+
+
+/*
+ * LightManager
+ */
+#define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_REMOTE_LIGHT    0
+#define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_SIGNAL_LEFT     1
+#define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_SIGNAL_RIGHT    2
+#define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_SIGNAL_BOTH     3
+#define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_BRAKE_LIGHT     4
+
+
+class SupportSystem{
+
+
+private:
+
+    uint8_t i2cAddress;
+    I2C *i2c;
+    uint32_t transmissionErrorCount;
+
+    uint16_t crc16_update(uint16_t crc, uint8_t a);
+    uint16_t generateChecksum(void *data, size_t len);
+
+    /*
+     * IMU
+     */
+    uint8_t imuCommand;
+    IMU_RegisterDataBuffer_t IMU_registerDataBuffer;
+
+    /*
+     * LightManager
+     */
+    uint8_t lightManagerCommand;
+    void setLightManagerCommandBit(bool value, uint8_t bit);
+
+    /*
+     * RadioDecoder
+     */
+    RadioDecoder_RegisterDataBuffer_t RadioDecoder_registerDataBuffer;
+
+public:
+
+    SupportSystem();
+    SupportSystem(uint8_t i2cAddress, I2C *i2c);
+
+    void init(uint8_t i2cAddress, I2C *i2c);
+
+    void readData(uint8_t registerAddress, void *buffer, size_t length);
+    void writeData(uint8_t registerAddress, void *buffer, size_t length);
+
+    uint32_t getTransmissionErrorCount();
+
+    /*
+     * Maintenance
+     */
+    uint32_t readMaintenanceUptimeMillis();
+
+
+    /*
+     * IMU
+     */
+    IMU_RegisterDataBuffer_t *getImuRegisterDataBuffer();
+
+
+
+    /*
+     * LightManager
+     */
+    void writeLightManagerCommand();
+    void setLightManagerBrakeLight(bool active, bool writeOut=true);
+    void setLightManagerRemoteLight(bool active, bool writeOut=true);
+    void setLightManagerSignalLeft(bool active, bool writeOut=true);
+    void setLightManagerSignalRight(bool active, bool writeOut=true);
+    void setLightManagerSignalBoth(bool active, bool writeOut=true);
+
+    /*
+     * RadioDecoder
+     */
+    RadioDecoder_RegisterDataBuffer_t *getRadioDecoderRegisterDataBuffer();
+
+};
+
+
+
+#endif /* SUPPORTSYSTEM_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Starter.h	Wed Feb 03 17:19:21 2016 +0000
@@ -0,0 +1,6 @@
+#ifndef STARTER_H
+#define STARTER_H
+
+
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Threads/MachineDirectionControl.cpp	Wed Feb 03 17:19:21 2016 +0000
@@ -0,0 +1,7 @@
+#include "Threads/MachineDirectionControl.h"
+
+void machine_direction_control_thread(void const *args) {
+    while (true) {
+        Thread::wait(100);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Threads/MachineDirectionControl.h	Wed Feb 03 17:19:21 2016 +0000
@@ -0,0 +1,10 @@
+#ifndef MACHINE_DIRECTION_CONTROL_H
+#define MACHINE_DIRECTION_CONTROL_H
+
+#include <mbed.h>
+#include <I2C.h>
+#include <rtos.h>
+
+void machine_direction_control_thread(void);
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Feb 03 17:19:21 2016 +0000
@@ -0,0 +1,226 @@
+#include <mbed.h>
+#include "rtos.h"
+#include "Periphery/SupportSystem.h"
+#include "Misc/SystemTimer.h"
+#include "Threads/MachineDirectionControl.h"
+
+#define PI 3.14159265
+
+Serial serialMinnow(p13, p14);
+PwmOut drivePWM(p22);
+PwmOut steerPWM(p21);
+I2C i2c(p9, p10);
+
+DigitalOut heartbeatLED(LED1);
+DigitalOut buttonLED(LED2);
+DigitalOut redlightLED(LED3);
+
+DigitalIn buttonOne(p25);
+DigitalIn buttonTwo(p26);
+DigitalIn buttonThree(p29);
+DigitalIn buttonFour(p30);
+
+IMU_RegisterDataBuffer_t *IMU_registerDataBuffer;
+RadioDecoder_RegisterDataBuffer_t *RadioDecoder_registerDataBuffer;
+
+uint32_t pulse_duration_drive_pwm_current, pulse_duration_drive_pwm_last;
+
+// Queues von der Bahnplanung
+Queue<float, 2> quadrature_queue;
+Queue<float, 2> machine_direction_queue;
+float steering_angle_minnow_queue;
+float velocity_minnow_queue;
+
+
+// Queues von dem Maussensor
+Queue<float, 2> imu_queue_velocity;
+Queue<float, 2> imu_queue_steering_angle;
+float steering_angle_imu_queue;
+float velocity_imu_queue;
+
+
+// Variablen von der Trajektorienplanung
+
+float velocity_set = 0, steering_angle_set = 0;
+
+// Variablen für die Längsregelung
+float velocity_current = 0, velocity_last = 0;
+
+
+// Variablen für die Querregelung
+float steering_angle_current = 0, steering_angle_last = 0;
+
+uint8_t timer_steering_angle_sampling_time = 0.01;
+
+float q_Kp = 8.166343211;
+float q_Ki = 18.6661236;
+float feed_forward_control_factor = 13.37091452;
+float q_esum = 0;
+float feed_forward = 0;
+float q_Ki_sampling_time = q_Ki * timer_steering_angle_sampling_time;
+float q_PI_controller, q_PWM, q_e, q_output;
+
+// Variablen für die Querregelung Ende
+
+void serial_thread(void const *args) {
+    while (true) {
+        Thread::wait(100);
+    }
+}
+
+void machine_direction_control(void const *args) {
+    osEvent velocity_set_event = machine_direction_queue.get(0);
+    if (velocity_set_event.status == osEventMessage) {
+        velocity_set = *(float*)velocity_set_event.value.p;
+    }
+    
+    osEvent velocity_current_event = imu_queue_velocity.get(0);
+    if (velocity_current_event.status == osEventMessage) {
+        velocity_current = *(float *)velocity_current_event.value.p;
+    }
+    
+    drivePWM.pulsewidth_us(1800);
+}
+
+void quadrature_control(void const *args) {
+    osEvent steering_angle_set_event = quadrature_queue.get(0);
+    if (steering_angle_set_event.status == osEventMessage) {
+        steering_angle_set = *(float *)steering_angle_set_event.value.p;
+    }
+    
+    osEvent steering_angle_current_event = imu_queue_steering_angle.get(0);
+    if (steering_angle_current_event.status == osEventMessage) {
+        steering_angle_current = *(float *)steering_angle_current_event.value.p;
+    }
+    
+    q_e = steering_angle_set - steering_angle_current;
+    q_esum = q_esum + q_e;
+    
+    feed_forward = steering_angle_set * feed_forward_control_factor;
+    q_PI_controller = q_Kp*q_e + q_Ki_sampling_time * q_esum;
+
+    q_output = feed_forward + q_PI_controller;
+
+    if(q_output > 500){q_output = 500;}           // evtl Begrenzung schon auf z.b. 300/ -300 stellen (wegen Linearität)
+    if(q_output < -500){q_output = - 500;}
+
+    q_PWM = 1500 + q_output;
+    
+    steerPWM.pulsewidth_us(q_PWM);
+}
+
+int main() {
+    serialMinnow.baud(115200);
+
+    drivePWM.period_ms(20);
+    steerPWM.period_ms(20);
+
+    SystemTimer *millis = new SystemTimer();
+
+    SupportSystem *supportSystem = new SupportSystem(0x80, &i2c);
+
+    Thread machineDirectionControl(test_thread);
+    
+    RtosTimer machine_direction_control_timer(machine_direction_control);
+    RtosTimer quadrature_control_timer(quadrature_control);
+
+    // Konfiguration AMF-IMU
+    // [0]: Conversation Factor
+    // [1]: Sensor Position X
+    // [2]: Sensor Position Y
+    // [3]: Sensor Position Angle
+    float configData[4] = {0.002751114f, 167.0f, 0.0f, 269.0f};
+
+    supportSystem->writeData(SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_CONVERSION_FACTOR, configData, sizeof(float)*4);
+
+    // Flag setzen
+    uint8_t command = 1<<3;
+    supportSystem->writeData(SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_COMMAND, &command, sizeof(uint8_t));
+    
+    bool timer_started = false;
+
+    wait(0.1);
+    
+    velocity_minnow_queue = 12.0;
+    quadrature_queue.put(&velocity_minnow_queue);
+
+    while(true) {
+        IMU_registerDataBuffer = supportSystem->getImuRegisterDataBuffer();
+        RadioDecoder_registerDataBuffer = supportSystem->getRadioDecoderRegisterDataBuffer();
+
+        for(uint8_t i=0; i<3; i++) {
+            serialMinnow.printf("RadioDecoder - Ch[%d] Valid:      %d\r\n",i,RadioDecoder_registerDataBuffer->channelValid[i]);
+            serialMinnow.printf("RadioDecoder - Ch[%d] ActiveTime: %d\r\n",i,RadioDecoder_registerDataBuffer->channelActiveTime[i]);
+            serialMinnow.printf("RadioDecoder - Ch[%d] Percentage: %d\r\n",i,RadioDecoder_registerDataBuffer->channelPercent[i]);
+        }
+
+        uint16_t rc_percentage = RadioDecoder_registerDataBuffer->channelActiveTime[0];
+        uint8_t rc_valid = RadioDecoder_registerDataBuffer->channelValid[0];
+        
+        uint16_t drive_percentage = RadioDecoder_registerDataBuffer->channelActiveTime[1];
+        uint8_t drive_valid = RadioDecoder_registerDataBuffer->channelValid[1];
+
+        uint16_t steer_percentage = RadioDecoder_registerDataBuffer->channelActiveTime[2];
+        uint8_t steer_valid = RadioDecoder_registerDataBuffer->channelValid[2];
+
+
+        if (rc_percentage > (uint16_t) 1800 && rc_valid != 0) {
+            // oben => Wettbewerb
+            heartbeatLED = true;
+            buttonLED = false;
+            redlightLED = false;
+            supportSystem->setLightManagerRemoteLight(false, true);
+            if (!timer_started) {
+                timer_started = true;
+                machine_direction_control_timer.start(10);
+                quadrature_control_timer.start(10);
+            }
+        } else if (rc_percentage > (uint16_t) 1200 && rc_valid != 0) {
+            // unten => RC-Wettbewerb
+            heartbeatLED = false;
+            buttonLED = false;
+            redlightLED = true;
+            supportSystem->setLightManagerRemoteLight(true, true);
+            if (drive_valid) {
+                drivePWM.pulsewidth_us(drive_percentage);
+            }
+            if (steer_valid) {
+                steerPWM.pulsewidth_us(steer_percentage);
+            }
+            if (timer_started) {
+                timer_started = false;
+                machine_direction_control_timer.stop();
+                quadrature_control_timer.stop();
+            }
+        } else if (rc_percentage > (uint16_t) 800 && rc_valid != 0) {
+            // mitte => RC-Training
+            heartbeatLED = false;
+            buttonLED = true;
+            redlightLED = false;
+            supportSystem->setLightManagerRemoteLight(true, true);
+            if (drive_valid) {
+                drivePWM.pulsewidth_us(drive_percentage);
+            }
+            if (steer_valid) {
+                steerPWM.pulsewidth_us(steer_percentage);
+            }
+            if (timer_started) {
+                timer_started = false;
+                machine_direction_control_timer.stop();
+                quadrature_control_timer.stop();
+            }
+        }
+        
+        velocity_imu_queue = IMU_registerDataBuffer->velocityXFilteredRegister;
+        imu_queue_velocity.put(&velocity_imu_queue);
+        
+        float radius = IMU_registerDataBuffer->velocityXFilteredRegister/IMU_registerDataBuffer->velocityAngularFilteredRegister;
+        
+        steering_angle_imu_queue = atan(0.205/radius)*180/PI;
+        imu_queue_steering_angle.put(&steering_angle_imu_queue);
+        
+
+        serialMinnow.printf("%f\r\n\r\n", IMU_registerDataBuffer->sensorPositionAngleRegister);
+        Thread::wait(50);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Wed Feb 03 17:19:21 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-rtos/#3d9d2b8b8f17
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Feb 03 17:19:21 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/6f327212ef96
\ No newline at end of file