VZTECH / Mbed 2 deprecated header_main

Dependencies:   EthernetInterface NTPClient mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers vz_protocol.cpp Source File

vz_protocol.cpp

00001 #include "vz_protocol.h"
00002     
00003 extern DigitalOut led2;
00004 extern DigitalOut led3;
00005     
00006 uint8_t * __parse_cb_buffer__( int * ext, int * port, volatile uint8_t * type, uint8_t * cb_buffer ){
00007     /**
00008     * parse and split vz package,
00009     * | E | E | P | P | C | C | T | [ Seq_num | Audio ] | 14[ Clock | Audio ] | [ TS | Audio ] | ... |
00010     * E = Ext = Ramal
00011     * P = Port = Porta
00012     * C = Checksum
00013     * T = Type = Tipo
00014     * Seq_num = Sequence Number = Numero de sequencia
00015     * Clock = 14 bytes to sync
00016     * ... = demais __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__  bytes
00017     */   
00018     uint8_t p_lsb, p_msb;
00019     uint8_t e_lsb, e_msb;
00020     
00021     if( cb_buffer == NULL ) return( NULL );
00022     
00023     uint16_t cc = ( uint16_t )cb_buffer[ 4 ] << 8 | cb_buffer[ 5 ];
00024     
00025     /*
00026     UDPSocket debug;
00027     Endpoint debug_server;
00028     char debug_msg[ 1024 ];
00029     
00030     debug_server.set_address( "192.168.120.180", 9897 );
00031     debug.bind( 8182 );
00032     debug.init();
00033     
00034     //if( cc != __checksum__( cb_buffer + __CHECKSUM_OFFSET__, 
00035     //    __CB_BUFFER_SIZE__ - __CHECKSUM_OFFSET__ ) ){
00036         
00037     sprintf( debug_msg, " -- cc :: %x :: __checksum %x -- bit[4] %x :: bit[5] %x", cc, __checksum__( cb_buffer, __CB_BUFFER_SIZE__ ), cb_buffer[ 4 ], cb_buffer[ 5 ] );
00038     debug.sendTo( debug_server, debug_msg, strlen( debug_msg ) );
00039     debug.sendTo( debug_server, debug_msg, strlen( debug_msg ) );
00040     */
00041     if( cc != __checksum__( cb_buffer, __CB_BUFFER_SIZE__ ) ){
00042             return( NULL );
00043     }else{
00044         e_msb = cb_buffer[ 0 ];
00045         e_lsb = cb_buffer[ 1 ];
00046         *ext = e_msb << 8  | e_lsb;
00047     
00048         p_msb = cb_buffer[ 2 ];
00049         p_lsb = cb_buffer[ 3 ];
00050         *port = p_msb << 8 | p_lsb; 
00051     
00052         *type = cb_buffer[ 6 ];
00053 
00054         return( cb_buffer + __VZ_HEADER_OFFSET__ );    
00055     }
00056 }
00057 uint8_t * __build_cb_package__( int ext, int port, uint8_t type, char * cb_buffer, uint8_t seq_num, int length,  uint8_t * pkg ){
00058     pkg[ 0 ] = ( uint8_t )( ( ext & 0xFF00 ) >> 8 );                                                                                      
00059     pkg[ 1 ] = ( uint8_t )( ext & 0x00FF );                                                                                                                                                                                                                                 
00060     pkg[ 2 ] = ( uint8_t )( ( port & 0xFF00 ) >> 8 );                      
00061     pkg[ 3 ] = ( uint8_t )( port & 0x00FF );
00062                                                                                                                                         
00063     pkg[ 6 ] = type;
00064     
00065     size_t fill = 0x00;
00066     
00067     if( type == __AUDIO__ ){
00068         for( register int i = __VZ_HEADER_OFFSET__; i < length + __VZ_HEADER_OFFSET__; i++ )
00069             pkg[ i ] = ( uint8_t )cb_buffer[ i - __VZ_HEADER_OFFSET__ ];
00070         fill = length + __VZ_HEADER_OFFSET__;
00071     }else if( type == __INVITE__ ){
00072         pkg[ 7 ] = seq_num;
00073         //__print_clock__( pkg + 8 );
00074         pkg[ __TIMESLICE_PLACE__ ] = cb_buffer[ __TIMESLICE_PLACE__ ];
00075         fill = __TIMESLICE_PLACE__ + 1;
00076     }else if( type == __REGISTRY__ || type == __BOOT__ ){
00077         pkg[ 7 ] = seq_num;
00078         __print_clock__( pkg + 8 );
00079         fill = __VZ_HEADER_OFFSET__ + __CLOCK_SYNC_SIZE__ + __SEQ_NUM_SIZE__;
00080     }if( type == __CB_BYE__ ){
00081         pkg[ 7 ] = seq_num;
00082         //__print_clock__( pkg + 8 );
00083         pkg[ __TIMESLICE_PLACE__ ] = cb_buffer[ __TIMESLICE_PLACE__ ];
00084         fill = __TIMESLICE_PLACE__ + 1;
00085     }
00086     
00087     for( register int i = fill; i < __CB_BUFFER_SIZE__; i++ ) pkg[ i ] = 0x00;    
00088     led2 = !led2;
00089     
00090     uint16_t cc = __checksum__( pkg, 300 );
00091     pkg[ 4 ] =( uint8_t )( ( cc & 0xFF00 ) >> 8) ;
00092     pkg[ 5 ] =( uint8_t )( cc & 0x00FF );
00093     
00094     return pkg;
00095 }
00096 
00097 char * __build_eth__package__( void ){
00098     return( NULL );    
00099 }
00100 
00101 uint8_t * __read_cb_buffer__( uint8_t * dest, uint8_t * src ){    
00102     for( register int i = 0; i < __CB_BUFFER_SIZE__; i++ ) *dest++ = *src++;
00103     return( dest );
00104 }
00105 
00106 uint8_t * __read_eth_buffer__( uint8_t * dest, uint8_t * src ){
00107     
00108     for( register int i = 0; i < __ETH_BUFFER_SIZE__; i++ ) *dest++ = *src++;
00109     
00110     return( dest );
00111 }
00112 
00113 uint8_t * __write_cb_buffer__( uint8_t * dest, uint8_t * src ){    
00114     for( register int i = 0; i < __CB_BUFFER_SIZE__; i++ ) *dest++ = *src++;
00115     return( dest );
00116 }
00117 
00118 uint8_t * __write_eth_buffer__( uint8_t * dest, uint8_t * src ){
00119     
00120     for( register int i = 0; i < __ETH_BUFFER_SIZE__; i++ ) *dest++ = *src++;
00121     
00122     return( dest );
00123 }
00124 
00125 uint16_t __checksum__( uint8_t * buffer, size_t length ){
00126     uint16_t cc = 0x00;
00127     buffer[ 4 ] = buffer[ 5 ] = 0x5a;
00128     for( register int i = 0; i < length; i++ ){
00129         cc += buffer[ i ];
00130         if( cc & BIT15 ){
00131             cc <<= 1;
00132             cc |= BIT0;
00133         }else{ cc <<= BIT0; }
00134     }
00135     cc ^= 0xffff;
00136     return cc; 
00137 }
00138 
00139 void __print_clock__( uint8_t * buffer ){
00140     NTPClient ntp;
00141     ntp.setTime( "200.192.232.8", 123, 3 );
00142     time_t seconds;
00143     // seconds = time(NULL);
00144     struct tm  ts;
00145     time( &seconds );                                                                                                                           
00146     ts = *localtime( &seconds );
00147     
00148     int ano = ts.tm_year + 1900;
00149     int mes = ts.tm_mon + 1;
00150     int dia = ts.tm_mday; 
00151     int hora = ts.tm_hour - 3;
00152     int min = ts.tm_min; 
00153     int sec = ts.tm_sec; 
00154     
00155     buffer[ 0 ] = ano / 1000;
00156     ano -= buffer[ 0 ] * 1000;
00157     buffer[ 1 ] = ano / 100;
00158     ano -= buffer[ 1 ]* 100;
00159     buffer[ 2 ] = ano / 10;
00160     ano -= buffer[ 2 ] * 10;
00161     buffer[ 3 ] = ano;
00162     buffer[ 4 ] = mes / 10;
00163     buffer[ 5 ] = mes % 10;
00164     buffer[ 6 ] = dia / 10;
00165     buffer[ 7 ] = dia % 10;
00166     buffer[ 8 ] = hora / 10;
00167     buffer[ 9 ] = hora % 10;
00168     buffer[ 10 ] = min / 10;
00169     buffer[ 11 ] = min % 10;
00170     buffer[ 12 ] = sec / 10;
00171     buffer[ 13 ] = sec % 10;
00172     
00173     /* convertendo pro ascii do nro */
00174     for( register int i = 0; i < 14; i++ ) buffer[ i ] += 0x30;
00175 }