FYP

Dependencies:   LSM6DSL

Fork of humanoid by Junjie Wang

kondo3.cpp

Committer:
ha731548874
Date:
2018-05-24
Revision:
4:45bd9ba6c0da

File content as of revision 4:45bd9ba6c0da:

#include "mbed.h"
#include "kondo3.h"
#include "servo.h"
#define KONDO3_COMMAND_POSITION_FREE 1
#define KONDO3_COMMAND_POSITION_SET 2
#define KONDO3_STEP_PER_DEGREE 8000/270
RawSerial KONDO3_serial(PA_0,PA_1);
unsigned char KONDO3_Buffer_Tx[3];
unsigned char KONDO3_Buffer_Tx_Ptr = 0;
unsigned char KONDO3_Buffer_Tx_Full = false;
unsigned char KONDO3_Buffer_Rx[6];
unsigned char KONDO3_Buffer_Rx_Ptr = 0;
unsigned char KONDO3_Buffer_Rx_Full = false;
signed short int KONDO3_Positions_Initial[] = {7500,7500,7500,7500,7500,7500,7500,7500,7500,7500,7500,7500,7500,7500,7500,7500,7500,7500};
signed short int KONDO3_Positions_Current[KONDO3_MAX_TOTAL];
signed short int KONDO3_Positions_Target[KONDO3_MAX_TOTAL];
unsigned char KONDO3_SendOrder[]= {16,15,14,13,12,11};
signed char KONDO3_Directions = 1;
signed char KONDO3_ID = 0;
signed char KONDO3_PtrCommands_Set;
EventQueue KONDO3_queue;
void KONDO3_Positions_Set(double* KONDO3_Degrees)
{
    unsigned char id;
    for(KONDO3_ID=0;KONDO3_ID < sizeof(KONDO3_SendOrder);KONDO3_ID++)
    {
    id = KONDO3_SendOrder[KONDO3_ID];
//            switch(KONDO1_PtrCommands_Set)
//            {
//                case KONDO1_COMMAND_POSITION_FREE:
//                    KONDO1_Positions[id]=0;
//                    break;
//                KONDO1_COMMAND_POSITION_SET:
    KONDO3_Positions_Target[id] = KONDO3_Degrees[id] * KONDO3_STEP_PER_DEGREE * KONDO3_Directions + KONDO3_Positions_Initial[id];
//    wait(0.0008);
    }  
}
void KONDO3_Interrupt_Tx() 
{
    while(KONDO3_serial.writeable())
    {
        KONDO3_serial.putc(KONDO3_Buffer_Tx[KONDO3_Buffer_Tx_Ptr]);
        KONDO3_Buffer_Tx_Ptr++;
        if(KONDO3_Buffer_Tx_Ptr==3)
              KONDO3_Buffer_Tx_Ptr = 0;
    }
}
void KONDO3_Interrupt_Rx()
{
    while(KONDO3_serial.readable())
    {
        KONDO3_Buffer_Rx[KONDO3_Buffer_Rx_Ptr] = KONDO3_serial.getc();
        KONDO3_Buffer_Rx_Ptr++;
        if(KONDO3_Buffer_Rx_Ptr==6)
        {
            KONDO3_Buffer_Rx_Full = true;
            KONDO3_Buffer_Rx_Ptr=0;
        }
    }
} 
void KONDO3_update(unsigned char Id, unsigned short int Position)
{
    unsigned char id,lo,hi;
    id=0x80|Id;
    hi=(Position>>7)&0x007F;
    lo=Position&0x007F;
    NVIC_DisableIRQ(USART1_IRQn);
    KONDO3_Buffer_Tx[0] = id;
    KONDO3_Buffer_Tx[1] = hi;
    KONDO3_Buffer_Tx[2] = lo;
//    wait(0.0008);
    KONDO3_Buffer_Rx_Full = false;
    NVIC_EnableIRQ(USART1_IRQn);
}
void KONDO3_task() 
{
    signed char id;
    signed char i;
    for(i=0 ; i < sizeof(KONDO3_SendOrder) ; i++)
    {
        id = KONDO3_SendOrder[i];
        KONDO3_update(id, KONDO3_Positions_Target[id]);
        wait_us(650);
//        wait_us(825);
    }
}
void KONDO3_init() 
{
    KONDO3_serial.format(8,Serial::Even,1);
    KONDO3_serial.baud(115200);
    KONDO3_Buffer_Rx_Ptr = 0;
    KONDO3_Buffer_Rx_Full = false;
    KONDO3_serial.attach(&KONDO3_Interrupt_Rx, Serial::RxIrq);
    KONDO3_serial.attach(&KONDO3_Interrupt_Tx, Serial::TxIrq);
    NVIC_EnableIRQ(USART1_IRQn);
    KONDO3_queue.call_every(10, KONDO3_task); //1000
    KONDO3_queue.dispatch();
}