/* 
 * File:   Maxon.h
 * Author: hamilton
 *
 * Created on July 19, 2018, 8:53 AM
 */

#ifndef MAXON_H
#define	MAXON_H

#define RS232_EXCHANGE_VALID 0 //A
#define RS232_TIMEOUT_ERROR 1  //No complete frame is recieved from the Maxon drive within the timeout, most likely the Maxon didn't understand the transmission
#define RS232_CRC_ERROR 2 //A complete frame is recieved, but had an invalid CRC.  Most likely the Maxon heard and understood, but there was a transmission problem with its response.
#define RS232_COMM_ERROR 3  //THe maxon explicity said that it didn't understand the command it was sent.

#define RS232_ATTEMPTS 1
#define RS232_TIMEOUT 20  //Timeout for RS232 to Maxon controller in terms of CAN interrupt periods (10Hz, so 5 = 500ms)


#define TF_POS_MOVING 7
#define TF_POS_UNKNOWN TF_POS_MOVING
#define NUM_MOVING_HOMES 5

typedef struct {
    unsigned char dle;
    unsigned char stx;
    unsigned char OpCode;
    unsigned char Len;
    unsigned int Data[144];  //Data can be up to 144 words long (288 bytes)
    unsigned int CRC;
} Maxon_Frame;
unsigned int CalcFieldCRC(unsigned int* pDataArray, unsigned int numberOfints);
//int CalcFieldCRC(int* pDataArray, int numberOfints);
//void SendCANPackets(IMU_Packet *IMU_Data);
void SendMaxonFrame(Maxon_Frame* frame_ptr);

void ReadMaxonObject(unsigned char NodeID,unsigned int Index, unsigned char SubIndex);  //Implements "ReadObject" described in section 2.1.1.1 of EPOS4-Communicatoion-Guide-En.pdf
unsigned char ReadMaxonByte(unsigned char NodeID, unsigned int Index, unsigned char SubIndex);
unsigned int ReadMaxonWord(unsigned char NodeID, unsigned int Index, unsigned char SubIndex);
unsigned long ReadMaxonDWord(unsigned char NodeID, unsigned int Index, unsigned char SubIndex);


void WriteMaxonObject(unsigned char NodeID,unsigned int Index, unsigned char SubIndex, unsigned long data);


void PowerUpMaxon();        //Power Up and wait 200ms
void PowerDownMaxon();        //Power Down



#endif	/* MAXON_H */

