VZTECH / Mbed 2 deprecated header_main_publish

Dependencies:   EthernetInterface NTPClient mbed-rtos_old mbed

Fork of header_main_public by VZTECH

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     debug_msg("");
00059     pkg[ 0 ] = ( uint8_t )( ( ext & 0xFF00 ) >> 8 );                                                                                      
00060     pkg[ 1 ] = ( uint8_t )( ext & 0x00FF );                                                                                                                                                                                                                                 
00061     pkg[ 2 ] = ( uint8_t )( ( port & 0xFF00 ) >> 8 );                      
00062     pkg[ 3 ] = ( uint8_t )( port & 0x00FF );
00063                                                                                                                                         
00064     pkg[ 6 ] = type;
00065     
00066     size_t fill = 0x00;
00067     
00068     if( type == __AUDIO__ ){
00069         for( register int i = __VZ_HEADER_OFFSET__; i < length + __VZ_HEADER_OFFSET__; i++ )
00070             pkg[ i ] = ( uint8_t )cb_buffer[ i - __VZ_HEADER_OFFSET__ ];
00071         fill = length + __VZ_HEADER_OFFSET__;
00072     }else if( type == __INVITE__ ){
00073         pkg[ 7 ] = seq_num;
00074         //__print_clock__( pkg + 8 );
00075         pkg[ __TIMESLICE_PLACE__ ] = cb_buffer[ __TIMESLICE_PLACE__ ];
00076         fill = __TIMESLICE_PLACE__ + 1;
00077     }else if( type == __REGISTRY__ || type == __BOOT__ ){
00078         pkg[ 7 ] = seq_num;
00079         //__print_clock__( pkg + 8 );
00080         fill = __VZ_HEADER_OFFSET__ + __CLOCK_SYNC_SIZE__ + __SEQ_NUM_SIZE__;
00081     }if( type == __CB_BYE__ ){
00082         pkg[ 7 ] = seq_num;
00083         //__print_clock__( pkg + 8 );
00084         pkg[ __TIMESLICE_PLACE__ ] = cb_buffer[ __TIMESLICE_PLACE__ ];
00085         fill = __TIMESLICE_PLACE__ + 1;
00086     }else if( type == __TELEMETRY__ ){
00087         pkg[ 7 ] = seq_num;
00088         //__print_clock__( pkg + 8 );
00089         pkg[ __TIMESLICE_PLACE__ ] = cb_buffer[ __TIMESLICE_PLACE__ ];
00090         fill = __TIMESLICE_PLACE__ + 1;
00091     }
00092     
00093     for( register int i = fill; i < __CB_BUFFER_SIZE__; i++ ) pkg[ i ] = 0x00;    
00094     led2 = !led2;
00095     
00096     uint16_t cc = __checksum__( pkg, 300 );
00097     pkg[ 4 ] =( uint8_t )( ( cc & 0xFF00 ) >> 8) ;
00098     pkg[ 5 ] =( uint8_t )( cc & 0x00FF );
00099     
00100     debug_msg("");
00101     return pkg;
00102 }
00103 
00104 char * __build_eth__package__( void ){
00105     return( NULL );    
00106 }
00107 
00108 uint8_t * __read_cb_buffer__( uint8_t * dest, uint8_t * src ){    
00109     for( register int i = 0; i < __CB_BUFFER_SIZE__; i++ ) *dest++ = *src++;
00110     return( dest );
00111 }
00112 
00113 uint8_t * __read_eth_buffer__( uint8_t * dest, uint8_t * src ){
00114     
00115     for( register int i = 0; i < __ETH_BUFFER_SIZE__; i++ ) *dest++ = *src++;
00116     
00117     return( dest );
00118 }
00119 
00120 uint8_t * __write_cb_buffer__( uint8_t * dest, uint8_t * src ){    
00121     for( register int i = 0; i < __CB_BUFFER_SIZE__; i++ ) *dest++ = *src++;
00122     return( dest );
00123 }
00124 
00125 uint8_t * __write_eth_buffer__( uint8_t * dest, uint8_t * src ){
00126     for( register int i = 0; i < __ETH_BUFFER_SIZE__; i++ ) *dest++ = *src++;
00127     
00128     return( dest );
00129 }
00130 
00131 uint16_t __checksum__( uint8_t * buffer, size_t length ){
00132     uint16_t cc = 0x00;
00133     buffer[ 4 ] = buffer[ 5 ] = 0x5a;
00134     for( register int i = 0; i < length; i++ ){
00135         cc += buffer[ i ];
00136         if( cc & BIT15 ){
00137             cc <<= 1;
00138             cc |= BIT0;
00139         }else{ cc <<= BIT0; }
00140     }
00141     cc ^= 0xffff;
00142     return cc; 
00143 }
00144 
00145 void __print_clock__( uint8_t * buffer ){
00146     debug_msg("");
00147     NTPClient ntp;
00148     debug_msg("");
00149     //int ntp_result = ntp.setTime( "200.192.232.8", 123, 3 );
00150     struct tm  ts;
00151     int ntp_result = ntp.setTime( "200.192.232.8" );
00152     if( ntp_result == 0 ){
00153         debug_msg("");
00154         time_t seconds;
00155         debug_msg("");
00156         // seconds = time(NULL);
00157         time( &seconds );
00158         debug_msg("");
00159         ts = *localtime( &seconds );
00160     }
00161     
00162     debug_msg("");
00163     int ano = ts.tm_year + 1900;
00164     int mes = ts.tm_mon + 1;
00165     int dia = ts.tm_mday; 
00166     int hora = ts.tm_hour - 3;
00167     int min = ts.tm_min; 
00168     int sec = ts.tm_sec; 
00169     
00170     buffer[ 0 ] = ano / 1000;
00171     ano -= buffer[ 0 ] * 1000;
00172     buffer[ 1 ] = ano / 100;
00173     ano -= buffer[ 1 ]* 100;
00174     buffer[ 2 ] = ano / 10;
00175     ano -= buffer[ 2 ] * 10;
00176     buffer[ 3 ] = ano;
00177     buffer[ 4 ] = mes / 10;
00178     buffer[ 5 ] = mes % 10;
00179     buffer[ 6 ] = dia / 10;
00180     buffer[ 7 ] = dia % 10;
00181     buffer[ 8 ] = hora / 10;
00182     buffer[ 9 ] = hora % 10;
00183     buffer[ 10 ] = min / 10;
00184     buffer[ 11 ] = min % 10;
00185     buffer[ 12 ] = sec / 10;
00186     buffer[ 13 ] = sec % 10;
00187     
00188     /* convertendo pro ascii do nro */
00189     for( register int i = 0; i < 14; i++ ) buffer[ i ] += 0x30;
00190     debug_msg("");
00191 }