/*******************************************
 *   Copyright (C) 2008 by Mauro Rodrigues *
 *******************************************/

#ifndef _Message_h_
#define _Message_h_

#include <fcntl.h>
#include <errno.h>
#include <iostream>
#include <string>
#include <vector>
#include "data.h"
#include "SerialPort.h"

class Message: public SerialPort
{
public:
	/*
	 * Teste da porta serie
	 * Pedido de envio de uma sequencia de teste por parte do master.
	 */
	int testcom(void);

	/*
	 * Leitura do estado do barramento CAN entre slaves.
	 *
	 * Saidas:
	 * [estado de erro, #erros de transmissao, #erros de recepcao,Bits de estado dos servos,tries]
	 * Codigo de erro, se existente
	 * String descritiva do erro
	 */
	int readcanstate(void);

	/* 
	 * Leitura de um parametro sensorial dos servos de um SCU
	 *
	 * Entradas:
	 * [Vector para o valor das juntas(3),Identificador do SCU alvo, Parametro a ler]
	 *
	 * Saidas:
	 * [posicao dos servos, Bits de estado dos servos, tries ]
	 * Codigo de erro, se existente
	 * String descritiva do erro
	 */
	int readjoint(signed char *joint, unsigned char scu_id,unsigned char param);

	/* 
	 * Leitura dos sensores especiais de um SCU
	 *
	 * Entradas:
	 * [Vector para o valor dos sensores(4),Identificador do SCU alvo]
	 *
	 * Saidas:
	 * [Valores dos sensores]
	 * Codigo de erro, se existente
	 * String descritiva do erro
	*/
	int readspecial(signed char *sensor, unsigned char scu_id);



	/* 
	 * Leitura dos sensores de orientação (inclinometro e giroscopio)
	 *
	 * Entradas:
	 * [Vector para o valor dos sensores(4)]
	 *
	 * Saidas:
	 * [Valores dos sensores]
	 * Codigo de erro, se existente
	 * String descritiva do erro
	 */
	int readorient(signed char *sensor);

	/* 
	 * Aplicação de uma ordem de posição ou velocidade a cada motor de uma junta
	 *
	 * Entradas:
	 * [Identificador do SCU alvo, Parametro a aplicar, Dados a aplicar]
	 *
	 * Saidas:
	 * [Mensagem de baixo nível recebida, tries]
	 * Codigo de erro, se existente
	 * String descritiva do erro
	 */
	int applyjoint(unsigned char scu_id,unsigned char param,signed char *servos);

	/* 
	 * Ajuste dos parametros do controlador PID para o posicionamento do servo e Jacobiano e Proporcional
	 *
	 * Entradas:
	 * [Identificador do SCU alvo, Parametro a aplicar, Dados a aplicar]
	 *
	 * Saidas:
	 * [Mensagem de baixo nível recebida, tries]
	 * Codigo de erro, se existente
	 * String descritiva do erro
	 */
	int applycontrol(unsigned char scu_id,unsigned char param,signed char *servos);

private:
	/*
	 * Funcoes auxiliares para as comunicacoes
	 */


	/*
	 * Funcao de envio de menssagem
	 */	
	int sendmessage (unsigned char *msg_tx,unsigned char *msg_rx);
	
	/*
	 * Funcao de contrucao de menssagem
	 */
	int buildmessage(unsigned char * message,unsigned char operation,unsigned char scu_id,unsigned char param,signed char *val);

};

#endif // #ifndef _Message_h_
