Modularizando o src

Dependencies:   EALib EthernetInterface_vz mbed-rtos mbed

Fork of header_main_colinas_V0-20-09-14 by VZTECH

call_box.h

Committer:
klauss
Date:
2015-04-23
Revision:
117:e9facba9db27
Parent:
116:39a41ebb675c
Child:
119:ee6a53069455

File content as of revision 117:e9facba9db27:

/**
 * @file call_box.h
 * @Synopsis Implementa as funções de gerenciamento do Call_Box 
 * @author Jhonatan Casale
 * @version 1
 * @date 2014-11-06
 * \class Call_Box
 */
#ifndef __CALL_BOX_H__
#define __CALL_BOX_H__

#include "mbed.h"
#include "object.h"
#include "sip.h"
#include "debug.h"
#include "shared_variables.h"

#define __RESQUEST_TIME__ 3
#define MAX_INVITE_RETRY 1000


#define __TIMEOUT__  250
///< O tempo que a Header demora para "pingar" o Call_Box para saber se esta tudo bem.
#define __RANGE_TO_REGISTER__ 150
///< Doc. later
#define __TIME_TO_REGISTER__ __TIMEOUT__ - __RANGE_TO_REGISTER__

#define __CYCLES__ __TIME_TO_REGISTER__ / __RESQUEST_TIME__ // 200 // 3 ~ 66

#define RTP_REQUEST_PORT_TIMEOUT 45 // 600 // seconds

#define REQUEST_REGISTRY -1
#define REQUEST_PEND -2
#define REQUEST_PING -4

///< Valor usado como referencia para registro do equipamento CBx.
#define __MAX_ATTEMPTS__  5
///< O numero maximo de vezes que a Header vai tentar pingar o Call_Box
#define __STEP__ 30
///< Usado para aumentar o intervalo entre cada ping, fora de uso atualmente.
#define __MAX_TIMEOUT__ __STEP__ * __MAX_ATTEMPTS__
///< Usado para limitar o tempo maximo de timeout do Call_Box sem responder o ping, fora de uso.

#define cb_idle 1
///< Representa que o Call_Box esta disponivel
#define cb_ringing 2
///< Representa o Call_Box no status, discando.
#define cb_trying 3
///< Representa o Call_Box no status tentando concluir o pedido de ligação.
#define cb_on_call 4
///< Representa que o Call_Box já esta em uma ligação.
#define cb_busy 5
///< Representa que o Call_Box esta ocupado.
#define cb_denied 6
///< Representa que o pedido de invite do Call_Box foi negado.
#define cb_bootloader 7                                          
///< Representa que o Call_Box esta em atualizacao de firmware 

class Call_Box : public Object{
    private :
        int ext;  // ramal
        int port; // porta
        Timer t;
        Timer rtp_timer; // usado pra controlar o timeout dos pedidos de porta rtp
        uint8_t remaining_attempts;
        float timeout;
        uint8_t msg_id;
        uint8_t timeslice;
        uint8_t next_aging_type;
        bool invite_response;
        uint16_t invite_retry_count;
        bool bye_response;
        Timer seconds;
        int sip_socket_fd;
    public :
                /**
                 * @Synopsis Objeto Sip que será usado para tratativas com o servidor.
                 *
                 * \note Esse objeto é criado no construtor da classe Call_Box, com os mesmos parâmetros passados para o 
                 * construtor da classe Call_Box.
                 */
        Sip * sip;
                
                /**
                 * @Synopsis Cria um objeto Call_Box
                 *
                 * @param ext Vincula o objeto ao ramal informado
                 * @param port Vincula o objeto a porto informada.
                 *
                 * Exemplo:
                 * @code
                 * ...
                 *  int ext = 5121;
                 *  int port = 5021;
                 *  Call_Box * cb = new Call_Box( ext, port );
                 * ...
                 * @endcode
                 */
        Call_Box( int ext, int port );

                /**
                 * @Synopsis Destroi o objeto Call_Box
                 *
                 * Exemplo:
                 * @code
                 * ...
                 *  delete( cb );
                 * ...
                 * @endcode
                 * \note Deleta o objeto Sip nesse processo.
                 */
        ~Call_Box( void );
        
                /**
                 * @Synopsis Representa o status do Call_Box.
                 *
                 * \note Este valor sempre é atualizado ( por convenção ) com o uso da macro set_status(a,b), definida em utils.h
                 */
        uint8_t status;
        
                /**
                 * @Synopsis Informa o ramal vinculado ao objeto Call_Box.
                 *
                 * @return O numero do ramal contido atualmente no objeto Call_Box
                 *
                 * Exemplo:
                 * @code
                 * ...
                 *  int ext = cb->get_ext();
                 * ...
                 * @endcode
                 */
        int get_ext( void );

                /**
                 * @Synopsis Informa o numero da porta vinculada ao objeto Call_Box.
                 *
                 * @return O numero da porta contido atualmente no objeto Call_Box
                 *
                 * Exemplo:
                 * @code
                 * ...
                 *  int port = cb->get_port();
                 * ...
                 * @endcode
                 */
        int get_port( void );
       
                /**
                 * @Synopsis Informa o tempo decorrido.
                 * \note O timer de cada objeto é iniciado no momento da criação do objeto Call_Box.
                 *
                 * @return O tempo decorrido desde a ultima vez que o timer do objeto foi resetado.
                 *
                 * Exemplo:
                 * @code
                 * ...
                 *  float elapsed_time = cb->get_elapsed_time();
                 * ...
                 * @endcode
                 */
        float get_elapsed_time( void );

                /**
                 * @Synopsis Informa se o Call_Box esta inativo acima do tempo previsto.
                 *
                 * @retval True - Caso o timer do objeto seja maior que o definido. 
                 * @retval False - Caso o timer do objeto seja menor que o definido..
                 *
                 * Exemplo:
                 * @code
                 * ...
                 *  printf(" %s ", ( cb->is_timeout() ) ? "Call_Box is outdated" : "Call_Box is okay" );
                 * ...
                 * @endcode
                 */
        bool is_timeout( void );

                /**
                 * @Synopsis Reconfigura o timeout de forma incremental, informando se ainda existe alguma tentativas de "ping" nesse Call_Box
                 *
                 * @return O numero de tentativas restantes de registro desse Call_Box. Retorno 0 significa que as tentativar acabaram.
                 *
                 * Exemplo:
                 * @code
                 * ...
                 *  if( cb->has_next_try() == 0x00 ){
                 *      // faça alguma coisa ...
                 *  }
                 * ...
                 * @endcode
                 */
        bool has_next_try( void );

                /**
                 * @Synopsis Reseta o timer do objeto Call_Box.
                 *
                 * Exemplo:
                 * @code
                 * ...
                 *  cb->reset_elapsed_time();
                 * ...
                 * @endcode
                 */
        void reset_elapsed_time( void );

                /**
                 * @Synopsis Invoca o método de registro deste Call_Box ( via objeto Sip vinculado ).
                 *
                 * Exemplo:
                 * @code
                 * ...
                 *  cb->registry();
                 * ...
                 * @endcode
                 */
        void registry( void );

                /**
                 * @Synopsis Invoca o método de pedido de ligação.
                 *
                 * @return Um ponteiro para um objeto VZ_call quando o pedido foi aceito pelo server, NULL caso em que o pedido de invite foi 
                 * negado pelo server ou aconteceu timeout do invite.
                 *
                 * Exemplo:
                 * @code
                 * ...
                 *  VZ_call * call = cb->invite();
                 * ...
                 * @endcode
                 */
        VZ_call * invite( void );

                /**
                 * @Synopsis Valor inicial para preenchimento deste campo nos pacotes trocados entre Header/Call_Box.
                 *
                 * @param msg_id Seta o valor recebido como parâmetro na variável do objeto.
                 *
                 * Exemplo:
                 * @code
                 * ...
                 *  cb->set_msg_id( 0x12 );
                 * ...
                 * @endcode
                 */
        void set_msg_id( uint8_t msg_id );

                /**
                 * @Synopsis Informa o numero atual de msg_id que será enviado na próxima mensagem desse Call_Box
                 *
                 * @return O valor atual de msg_id.
                 *
                 * Exemplo:
                 * @code
                 * ...
                 *  uint8_t msg_id = cb->get_msg_id();
                 * ...
                 * @endcode
                 */
        uint8_t get_msg_id( void );

        
                /**
                 * @Synopsis Armazena o valor de Timeslice atualmente em uso pelo Call_Box.
                 *
                 * @param timeslice O valor que corresponde ao Timeslice disponivel para comunição do Call_Box
                 *
                 * Exemplo:
                 * @code
                 * ...
                 *  Timeslice * ts = new Timeslice();
                 *  cb->set_timeslice( ts->get_timeslice() );
                 * ...
                 * @endcode
                 */
                void set_timeslice( uint8_t timeslice );


                /**
                 * @Synopsis Informa o timeslice ocupado atualmente pelo Call_Box.
                 *
                 * @return O valor do timeslice em uso pelo Call_Box.
                 *
                 * Exemplo:
                 * @code
                 * ...
                 *  uint8_t ts = cb->get_timeslice();
                 * ...
                 * @endcode
                 */
        uint8_t get_timeslice( void );

        //void set_sip( Sip * sip );
                
                /**
                 * @Synopsis Faz chamada ( via objeto Sip vinculado ) a função que irá escutar a porta SIP associada neste Call_Box.
                 *
                 * @return Um valor menor que zero se a execução falhar, igual a zero se a execução for bem sucedida e nenhum dado foi
                 * recebido, ou quando a execução foi bem sucedida e nenhuma mensagem que demanda tramamento foi recebida;  um numero 
                 * maior do que zero, caso tenha recebido um pacote do tipo "bye" do servidor; este numero corresponde ao ramal do Call_Box.
                 * 
                 * Exemplo:
                 * @code
                 * ...
                 *  int returned_value = cb->listen_SIP_server();
                 * ...
                 * @endcode
                 */
        int listen_SIP_server( void );

                /**
                 * @Synopsis Invoca ( no objeto Sip ) o método de pedido de "desregistro".
                 *
                 * Exemplo:
                 * @code
                 * ...
                 *  cb->unregistry();
                 * ...
                 * @endcode
                 */
        void unregistry( void );

                /**
                 * @Synopsis Invoca ( via objeto Sip ) o método de envio do pacote de "bye" para o servidor.
                 *
                 * Exemplo:
                 * @code
                 * ...
                 *  cb->send_bye();
                 * ...
                 * @endcode
                 */
        void send_bye( void );

                /**
                 * @Synopsis Destroi o objeto Sip vinculado ao Call_Box, criando e vinculando outro em seguida.
                 *
                 * Exemplo:
                 * @code
                 * ...
                 *  cb->reset_sip();
                 * ...
                 * @endcode
                 */
        void reset_sip( void );

                /**
                 * @Synopsis Altera o valor do status do objeto Sip vinculado.
                 *
                 * @param status O novo valor de status que será associado ao objeto Sip vinculado ao Call_Box.
                 *
                 * Exemplo:
                 * @code
                 * ...
                 *  cb->set_sip_status( 0 );
                 * ...
                 * @endcode
                 */
        void set_sip_status( int status );

                /**
                 * @Synopsis Inicia ( ou re-inicia ) o Timer do objeto Call_Box.
                 *
                 * Exemplo:
                 * @code
                 * ...
                 *   cb->re_start_timer();
                 * ...
                 * @endcode
                 */
        void re_start_timer( void );
        
        
        int get_sip_status( void );
        int set_sip_status( uint8_t sip_status );
        
        int get_status( void );
        void cb_set_status( uint8_t status );
        
        int8_t get_next_aging_type( void );
        
        //void set_first_invite_response_ok( void );
        //void set_first_invite_response_pending( void );
        //bool get_first_invite_response( void );
        
        void set_invite_response_ok( void );
        void set_invite_response_pending( void );
        bool get_invite_response( void );
        
        void set_bye_response_ok( void );
        void set_bye_response_pending( void );
        bool get_bye_response( void );
        
        int get_sip_socket_fd( void );
        int sip_udp_incomming_pkg( void );
        void reset_cb_status( void );
        void invite_retry_count_reset( void );
        uint8_t get_invite_retry_count( void );
        int get_sip_ext( void );
        int get_sip_port( void );
        int get_timer( void );
        int get_rtp_port ( void );
        int print_yourself ( void );
        void set_rtp_port ( int );
        void init_rtp_timer ( void );
        void reset_rtp_timer ( void );
        bool is_rtp_timer_timeout ( void );
        int get_rtp_timer ( void );
};
#endif