[AsteriskBrasil] Pequena brincadeira: URA Calculadora

Claudio Polegato Junior cpolegatojr.asterisk em gmail.com
Quarta Novembro 29 08:15:28 BRST 2006


Rodolfo Santos escreveu:
> Talvez eu não tenha entendido direito o propósito, e peço desculpas 
> caso esteja equivocado. Mas o que vcs estão se propondo a fazer já não 
> existe no Asterisk?
>  
> * Math( )*
>  
> Exemplo:
>  
> ; somar dois números e dizer o resultado
> exten => 666,1,Math(SUM,50000000.2+0.8)
> exten => 666,2,SayNumber(${SUM})
>  
> Math aceita ponto flutuante e todos os operadores matemáticos 
> existentes na linguagem C : +,-,/,*,%,<,>,>=,<=.
>  
> P.S.: Caio, a sua idéia de fazer uma calculadora tipo notação polonesa 
> (HP 12C), é bastante interessante. Posso imaginar o quão útil seria em 
> um sistema IPBX que atendesse uma mesa de operações de um banco ou de 
> uma corretora de valores.

Olá,

  Claro, acho que a idéia é mostrar e/ou exercitar as funções presentes 
no Asterisk. Acho que se sair para AGI fica fora de cogitação, pois será 
feito em outra linguagem e não vai exercitar/exemplificar as funções do 
Asterisk. Depois ir crescendo para funções, tipo torná-la científica, 
financeira ou até sistema polonês (como você disse).
  Já que começou, podemos ir aperfeiçoando (não tenho como testar, só 
depois do fim do expediente) minha estúpida calculadora:

[calculadora_ura]
; Atende a chamada
exten => s,1,Answer
; Depois de um dígito identificado, espera até 2 segundos para o próximo
exten => s,n,Set(TIMEOUT(digit)=2)
; Se nada for digitado em 5 segundos, dá "timeout" (vai para exten 't')
exten => s,n,Set(TIMEOUT(response)=5)
; Qual número estamos perguntando
exten => s,n,SetVar(Numero=1)
; Define Num_Op para Número (1), usado no "timeout"
exten => s,n(numero),SetVar(Num_Op=1)
; Mensagem para o usuário digitar um número
exten => s,n,BackGround(digite_numero)
; Espera pelo número de acordo com os tempos acima configurados
exten => s,n,WaitExten
; Define Num_Op para Operador (2), usado no "timeout"
exten => s,n(operador),SetVar(Num_Op=2)
; Mensagem para o usuário digitar um operador: 1->+, 2->-, 3->*, 4->/...
exten => s,n,BackGround(digite_operador)
; Espera pelo operador de acordo com os tempos acima configurados
exten => s,n,WaitExten

; Caso não digite nada em 5 segundos configurados, pergunta novamente
exten => t,1,GotoIf($[${Num_Op} = 1]?s|numero:s|operador)

; Trata o que foi digitado, desviando o fluxo se for esperado operador
exten => _X.,1,GotoIf($[${Num_Op} = 2]?operador)
; Se for o segundo número, passar para o cálculo
exten => _X.,n,GotoIf($[${Numero} = 2]?segundo)
; Guardo o primeiro número em Num1
exten => _X.,n,SetVar(Num1=${EXTEN})
; Define que será perguntado pelo segundo número
exten => _X.,n,SetVar(Numero=2)
; Desvia o fluxo para perguntar pelo operador
exten => _X.,n,Goto(s|operador)

; Guardo o segundo número em Num2
exten => _X.,n(segundo),SetVar(Num2=${EXTEN})
; Calcula e guardo o resultado em Resultado
exten => _X.,n,SetVar(Resultado=$[${Num1} ${Op} ${Num2}])
; Fala o primeiro número
exten => _X.,n,SayNumber(${Num1})
; Fala o operador
exten => _X.,n,SayAlpha(${Op})
; Fala o segundo número
exten => _X.,n,SayNumber(${Num2})
; Fala "igual"
exten => _X.,n,SayAlpha("=")
; Fala o Resultado
exten => _X.,n,SayNumber(${Resultado})
; O primeiro número agora é o resultado
exten => _X.,n,SetVar(Num1=${Resultado})
; Desvia o fluxo para perguntar pelo operador
exten => _X.,n,Goto(s|operador)

; Verifica se o operador é inválido, desviando o fluxo caso for
exten => _X.,n(operador),GotoIf($[${EXTEN} > 4]?op_invalido)
; Se digitado 1, guarda o operador de adição em Op
exten => _X.,n,ExecIf($[${EXTEN} = 1],SetVar,Op="+")
; Se digitado 2, guarda o operador de subtração em Op
exten => _X.,n,ExecIf($[${EXTEN} = 2],SetVar,Op="-")
; Se digitado 1, guarda o operador de multiplicação em Op
exten => _X.,n,ExecIf($[${EXTEN} = 3],SetVar,Op="*")
; Se digitado 1, guarda o operador de divisão em Op
exten => _X.,n,ExecIf($[${EXTEN} = 4],SetVar,Op="/")
; Desvia o fluxo para perguntar pelo próximo número
exten => _X.,n,Goto(s|numero)

; Retorna uma mensagem dizendo que o operador é inválido
exten => _X.,n(op_invalido),PlayBack(operador_invalido)
; Desvia o fluxo para perguntar novamente o operador
exten => _X.,n,Goto(s|operdor)




Quem será o primeiro a testar?


-- 
Atenciosamente

           Junior Polegato - Claudio Polegato Junior

           Engenheiro Autônomo - Ribeirão Preto e Região
           Mestre em Física Aplicada à Medicina e Biologia - USP
           Engenheiro Computacional e Eletrônico - USP
           Página Pessoal: http://cpolegatojr.no-ip.org

Um peregrino de problemas; Um pergaminho de soluções!



Mais detalhes sobre a lista de discussão AsteriskBrasil