Sam

ActionEncoder.txt

Committer:
s0313045
Date:
2018-10-21
Revision:
0:502b364c9f1d

File content as of revision 0:502b364c9f1d:

#include "mbed.h"
#include "millis.h"

/*
 * ActionEncoder.cpp
 *
 *  Created on: 7 Mar 2018
 *      Author: tung
 */

#include "ActionEncoder.hpp"
#include "Timer.h"

Serial Action(D8,D2 ); // tx, rx
Serial pc(USBTX, USBRX);



union {
    uint8_t data[24];
    float val[6];
} posture;
int count=0;
int i=0;
int done=0;
float xangle=0;
float yangle=0;
float zangle=0;
float d_angle=0;
float pos_x=0;
float pos_y=0;
float angleSpeed=0;
float temp_zangle=0;
int   LastRead=0;
bool newDataArrived=false;

char buffer[8];


void ActionEncoder_init()
{
    count=0;
    i=0;
    done=0;
    xangle=0;
    yangle=0;
    zangle=0;
    d_angle=0;
    pos_x=0;
    pos_y=0;
    angleSpeed=0;
    temp_zangle=0;
    LastRead=0;
    newDataArrived=false;


}

void readEncoder(char c)
{


    //sprintf(buffer,"%02X",c);
    //sprintf(buffer,"%X",c);
    //pc.printf(buffer);
    //pc.printf("\r\n");
    
    //sprintf(buffer,"%d",count);
    //pc.printf(buffer);
    //pc.printf("\r\n");
    switch(count) {
        case 0:
            if (c==0x0d) count++;
            //else count=0;
            break;
        case 1:
            if(c==0x0a) {
                i=0;
                count++;
            } else if(c==0x0d) {}
            //else count=0;
            break;
        case 2:
            posture.data[i]=c;
            i++;
            if(i>=24) {
                i=0;
                count++;
            }
            break;
        case 3:
            if(c==0x0a)count++;
            //else count=0;
            break;
        case 4:
            if(c==0x0d) {
                d_angle=posture.val[0]-temp_zangle;
                if (d_angle<-180) {
                    d_angle=d_angle+360;
                } else if (d_angle>180) {
                    d_angle=d_angle-360;
                }
                zangle+=d_angle;
                temp_zangle=posture.val[0];
                xangle=posture.val[1];
                yangle=posture.val[2];
                pos_x=posture.val[3];
                pos_y=posture.val[4];
                angleSpeed=posture.val[5];
                newDataArrived=true;
                
                pc.printf("GET\r\n");
                sprintf(buffer, "%f", pos_x);
                pc.printf(buffer);
                pc.printf("  ");
                sprintf(buffer, "%f", pos_y);
                pc.printf(buffer);
                pc.printf("  ");
                sprintf(buffer, "%f", zangle);
                pc.printf(buffer);
                pc.printf("\r\n");
            }
            count=0;
            done=1;
            LastRead=millis();
            break;
        default:
            //count=0;
            break;
    }
}

bool updated()
{
    if (done) {
        done=false;
        return true;
    } else {
        return false;
    }

}

float getXangle()
{
    return xangle;
}

float getYangle()
{
    return yangle;
}

float getZangle()
{
    return zangle;
}

float getXpos()
{
    return pos_x;
}

float getYpos()
{
    return pos_y;
}

float getAngleSpeed()
{
    return angleSpeed;
}

bool isAlive()
{
    if ((millis()-LastRead)<100) {
        return true;
    } else {
        return false;
    }
}

bool newDataAvailable()
{
    if (newDataArrived) {
        newDataArrived=false;
        return true;
    } else return false;
}

char* reset()
{
    return "ACT0";
}

char* calibrate()
{
    return "ACTR";
}
//////////////

void action_get()
{

    /*

    // Loop just in case more than one character is in UART's receive FIFO buffer
    // Stop if buffer full
      while ((device.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) {
          rx_buffer[rx_in] = device.getc();
    // Uncomment to Echo to USB serial to watch data flow
    //        monitor_device.putc(rx_buffer[rx_in]);
          rx_in = (rx_in + 1) % buffer_size;
      }
      */

    readEncoder(Action.getc());

}
/////////////////////////





int main()
{
    //Action.attach(&action_get, Serial::RxIrq);
    Action.baud(115200);
    Action.format(8,SerialBase::None,1); 
    
    
    ActionEncoder_init();

    while(1) {

        while (Action.readable()==1 ) 
        {
            //pc.printf("readable\r\n");
            char c = Action.getc();
            
            readEncoder(c);
            //pc.putc(c);
            //pc.printf("\r\n");
          
          
          /*
                sprintf(buffer, "%f", pos_x);
                pc.printf(buffer);
                sprintf(buffer, "%f", pos_y);
                pc.printf(buffer);
                sprintf(buffer, "%f", zangle);
                pc.printf(buffer);
                pc.printf("\r\n");*/
            

        }

    }



}