VZTECH / Mbed 2 deprecated main_src

Dependencies:   EALib EthernetInterface_vz mbed-rtos mbed

Fork of header_main_colinas_V0-20-09-14 by VZTECH

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers vz_protocol.h Source File

vz_protocol.h

Go to the documentation of this file.
00001 /**
00002  * @file vz_protocol.h
00003  * @Synopsis Implementa as principais funcionalidades do protocolo de comunicação entre os CBx -> Header e Header -> CBx.
00004  * @author Jhonatan Casale
00005  * @version 1
00006  * @date 2014-11-05
00007  */
00008 
00009 #ifndef __VZ_PROTOCOL_H__
00010 #define __VZ_PROTOCOL_H__
00011 
00012 #include "EthernetInterface.h"
00013 #include "mbed.h"
00014 #include <string.h>
00015 #include <stdlib.h>
00016 #include <stdint.h>
00017 #include "debug.h"
00018 #include "bits.h"
00019 #include "clock.h"
00020 #include "utils.h"
00021 %: include "shared_variables.h"
00022 %: include "config_manager.h"
00023 
00024 extern int begin;
00025 ///< Registra o numero do menor ramal conhecido pela header até o momento
00026 
00027 extern int end;
00028 ///< Registra o numero do maior ramal conhecido pela header até o momento
00029 
00030 const uint8_t VZ_HEADER_OFFSET = 7;
00031 ///< Indica o inicio dos dados recebidos efetivamente no pacote VZ.
00032 
00033 const uint8_t CLOCK_SYNC_SIZE = 14;
00034 ///< Indica o numero de bytes ocupados pelo relogio no pacote transmitido.
00035 
00036 const uint8_t SEQ_NUM_SIZE = 1;
00037 ///< Indica o numero de bytes ocupados para uso de sequence number.
00038 
00039 const uint8_t SEQ_NUM_PLACE = 7;
00040 ///< Indica o numero de bytes ocupados para uso de sequence number.
00041 
00042 const uint8_t CB_AUDIO_DATA_SIZE = 240; 
00043 ///< Indica o numero de pacotes enviados pelo CBx referente a dados de audio.
00044 
00045 const uint8_t TIMESLICE_PLACE = 22; 
00046 ///< Indica o local ( em relação ao começo do pacote ) onde se encontra o timeslice.
00047 
00048 const uint8_t TYPE_PLACE = 6; 
00049 ///< Indica o local ( em relação ao começo do pacote ) onde se encontra o timeslice.
00050 
00051 const uint16_t BASE_PORT = 5000;
00052 ///< Estabelece o menor ramal aceito para tratamento
00053 
00054 const uint8_t u8_MAX_CB_IN_A_BRANCH = 52;
00055 ///< Estabelece o nro máximo de CBx em um mesmo ramo
00056 
00057 const uint8_t BOOT = 0x00; 
00058 ///< Indica o tipo boot, enviado pelo CBx, assim que o mesmo liga ou sofre reboot.
00059 
00060 const uint8_t REGISTRY = 0x02; 
00061 ///< Tipo de registro, enviado pelo CBx, quando o mesmo quer se registrar, enviado pela Header para verificar se determinado CBx ainda esta ativo.
00062 
00063 const uint8_t REGISTRY_ACK = 0x02 bitor BIT7;
00064 ///< "ack de resposta" do tiop REGISTRY
00065 
00066 const uint8_t INVITE = 0x04;
00067 ///< Representa o tipo de pedido de invite, enviado pelo CBx sempre quando o mesmo quer iniciar uma ligação com o server.
00068 
00069 const uint8_t INVITE_ACK = 0x04 bitor BIT7;
00070 ///< "ack de resposta" do tiop INVITE
00071 
00072 const uint8_t AUDIO = 0x08;
00073 ///< Pacotes do tipo audio são trocados entre Header e CBx durante a ligação, representam os dados RTP.
00074 
00075 const uint8_t TELEMETRY = 0x10;
00076 ///< Define o tipo de pacote de telemetria enviado pelo CBx.
00077 
00078 const uint8_t BOOTLOADER_CBX = 0x03;
00079 ///< Define o tipo de pacote para a gravação do CBx
00080 
00081 const uint8_t CB_BYE = 0x20;
00082 ///< Representa o tipo de pacote que o CBx envia para a Header solicitando o final da ligação.
00083 
00084 const uint8_t CB_BYE_ACK = 0x20 bitor BIT7;
00085 ///< "ack de resposta" do tiop CB_BYE
00086 
00087 const uint8_t PROMPT = 0x01;
00088 ///< Identifica o tipo de pacote responsavel por mandar comandos executáveis no Cbx.
00089 
00090 const uint8_t FLOOD = 0x40;
00091 ///< Representa os pacotes de flood, úteis para validação de comunicação Header-CBx.
00092 
00093 const uint8_t FW = 0x50;
00094 ///< Tipo para redirecionamento semn tratamento para uma determinada porta UDP pré-configurada.
00095 
00096 const uint8_t FW1 = 0x51;
00097 ///< Tipo para redirecionamento semn tratamento para uma determinada porta UDP pré-configurada.
00098 
00099 const uint8_t FW2 = 0x52;
00100 ///< Tipo para redirecionamento semn tratamento para uma determinada porta UDP pré-configurada.
00101 
00102 const uint8_t FW3 = 0x53;
00103 ///< Tipo para redirecionamento semn tratamento para uma determinada porta UDP pré-configurada.
00104 
00105 const uint8_t FW4 = 0x54;
00106 ///< Tipo para redirecionamento semn tratamento para uma determinada porta UDP pré-configurada.
00107 
00108 const uint8_t FW5 = 0x55;
00109 ///< Tipo para redirecionamento semn tratamento para uma determinada porta UDP pré-configurada.
00110 
00111 const uint8_t FW6 = 0x56;
00112 ///< Tipo para redirecionamento semn tratamento para uma determinada porta UDP pré-configurada.
00113 
00114 const uint8_t CB_STATS = 0x07;
00115 ///< Tipo de comunicação de estatisticas de rede, enviadas pela CBx
00116 
00117 const uint8_t CB_STATS_ACK = 0x07 bitor BIT7;
00118 ///< "ack de resposta" do tiop CB_STATS_ACK
00119 
00120 const uint16_t BROADCAST_EXT = 0xf0f3;
00121 ///< Ramal de broadcast, usado na comunicação Header -> CBx
00122 
00123 const uint8_t DO_NOTHING = 0x7f;
00124 ///< Representa o tipo de idle, importante para algumas comunicações.
00125 
00126 const uint16_t RX_CB_IDLE = 300;
00127 ///< Tempo maximo ( countdown em segundos ) que a Header espera por algum pacote no lado fibra, deixa de tickar o wdt.
00128 
00129 const uint16_t ETH_CONNECT_TIMEOUT = 330;
00130 ///< Tempo maximo ( countdown em segundos ) que a Header espera tentando conectar na interface ETH, deixa de tickar o wdt quando chega em zero.
00131 
00132 const uint16_t RTP_MSG_SIZE = 160;
00133 ///< Tamanho em bytes ocupados pelos pacotes de audio no sentido * -> Header -> CBx
00134 
00135 extern uint32_t pkg_zero; 
00136 ///< Contador de pacotes contendo somente zeros
00137 
00138 extern uint32_t pkg_ckserr; 
00139 ///< Contador de pacotes em que o checksum resultou divergente do calculado/recebido
00140 
00141 extern uint32_t pkg_cksok; 
00142 ///< Contador de pacotes em que o checksum resultou o mesmo calculado e o recebido
00143 
00144 /**
00145  * @Synopsis Calcula o checksum do pacote.
00146  *
00147  * @param buffer Um ponteiro para a região de memória onde os dados de interesse estão localizados.
00148  * @param length O numero de elementos que serão considerados no cálculo do checksum
00149  *
00150  * @return 0 - caso em que o vetor apontado por buffer estiver setado em NULL. O checksum propriamente
00151  * calculado caso contrário.
00152  *
00153  * Exemplo:
00154  * @code
00155  * ...
00156  *  // onde cb_buffer contém os dados vindos do Call_Box, Obs. as posições 4 e 5 contém o MSB e LSB do CC calculado pelo Call_Box.
00157  *  uint16_t cc = ( uint16_t )cb_buffer[ 4 ] << 8 or cb_buffer[ 5 ];
00158  *  if( cc != __checksum__( cb_buffer, __CB_BUFFER_SIZE__ ) ){
00159  *      //faça alguma coisa ...
00160  *  }
00161  * ...
00162  * @endcode
00163  */
00164 uint16_t vz_checksum ( uint8_t * buffer, size_t length );
00165 
00166 /* incorporar a parte de cc */
00167 /**
00168  * @Synopsis Esta é a função responsável por, dado um pacote recebido dos CBx, quebra-lo em ramal( ext ), porta, type e dados.
00169  *
00170  * @param ext Um ponteiro para onde sera setado o ramal do CBx que enviou este pacote.
00171  * @param port Um ponteiro para onde sera setado a porta do CBx que enviou este pacote.
00172  * @param type Um ponteiro para onde sera setado o type de mensagem enviada pelo CBx.
00173  * @param cb_buffer O pacote que se deseja decodificar.
00174  *
00175  * @return NULL, caso em que o checksum( cc ) calculado não bater com o cc recebido no pacote, retorna NULL também em pacotes do
00176  * tipo flood, ou no caso em que o pacote recebido para processamento apontar para NULL; em todos esses casos os valores de ext,
00177  * port e type devem ser desconsiderados para manter a integridade do processamento; retorna um ponteiro para o inicio dos dados
00178  * enviados pelo CBx e seta ramal, porta e type nos casos em que o pacote recebido for válidado pelo protocolo.
00179  *
00180  * Exemplo:
00181  * @code
00182  * ...
00183  *  int ext, port, type;
00184  *  uint8_t * data, buffer[ __CB_BUFFER_SIZE__ ];
00185  *      //assumindo que os dados vindos do Call_Box estão armazenados em buffer;
00186  *  data = __parse_vz_pkg__( &ext, &port, &type, buffer );
00187  * ...
00188  * @endcode
00189  */
00190 
00191 /**
00192  * \note Formato do pacote VZ :
00193  *
00194  * | E | E | P | P | C | C | T | [ Seq_num | Audio ] | 14[ Clock | Audio ] | [ TS | Audio ] |...|
00195  *
00196  * E = Ext = Ramal 
00197  *
00198  * P = Port = Porta
00199  *
00200  * C = Checksum 
00201  *
00202  * T = Type = Tipo 
00203  *
00204  * Seq_num = Sequence Number = Numero de sequencia 
00205  *
00206  * Clock = 14 bytes to sync 
00207  *
00208  * ...= demais __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__  bytes 
00209  *
00210  */
00211 uint8_t * parse_vz_pkg ( int * ext, int * port, volatile uint8_t * type, uint8_t * cb_buffer );
00212 
00213 /**
00214  * @Synopsis Função responsavel por montar o pacote para envio para o CBx seguindo o formato do protocolo VZ. 
00215  *
00216  * @param ext O ramal do CBx destino deste pacote.
00217  * @param port A porta do CBx destino deste pacote.
00218  * @param type O tipo do pacote que será enviado para o CBx.
00219  * @param cb_buffer Os dados que serão colocados nesse pacote.
00220  * @param seq_num O numero do sequência deste pacote.
00221  * @param length O tamanho ( em bytes ) dos dados que serão enviados.
00222  * @param pkg Um ponteiro que recebera o pacote montado e pronto para envio.
00223  *
00224  * @return O pacote montado e pronto para envio.
00225  *
00226  * Exemplo:
00227  * @code
00228  * ...
00229  *  int ext = 1011;
00230  *  port = 1011;
00231  *  type = __REGISTRY__;
00232  *  send2callboxes( __build_cb_package__( ext, port, type, 
00233  *              ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); 
00234  * ...
00235  * @endcode
00236  */
00237 uint8_t * build_cb_package ( const int ext, const int port, const uint8_t type, const char * cb_buffer, const uint8_t seq_num, const int length,  uint8_t * pkg );
00238 
00239 /**
00240  * @Synopsis Obtém uma referência de clock de um servidor.
00241  *
00242  * @param buffer Imprime a referência do relógio nesta posição de memória.
00243  *
00244  * \note Por definição de projeto, o relógio ocupa 14 bytes, seguindo o formato
00245  *
00246  * | ano | ano | ano | ano | mes | mes | dia | dia | hora | hora | minuto | minuto | segundo | segundo |
00247  *
00248  * Exemplo:
00249  *
00250  * 20141105101235
00251  */
00252 
00253 int init_ranges ( void );
00254 
00255 /**
00256  * @Synopsis Converte o current_time do sistema para string.
00257  *
00258  * @param buffer Buffer de escrita onde sera preenchido com o current_time no formato VZ
00259  *
00260  * Exemplo:
00261  * @code
00262  * ...
00263  *  char buffer [ 16 ];
00264  *  print_clock ( buffer );
00265  * ...
00266  * @endcode
00267  */
00268 void print_clock ( uint8_t * buffer );
00269 
00270 #endif