[AsteriskBrasil] Pequena brincadeira: URA Calculadora

Claudio Polegato Junior cpolegatojr.asterisk em gmail.com
Sexta Dezembro 1 08:15:45 BRST 2006


Olá pessoal,

  Agora sim, consegui testar, fiz os devidos ajustes, mas só faz
operações com inteiros, porém ficou muito legal!
  Quanto eu tiver mais uma insônia, eu aperfeiçoo mais. Qualquer dica
será bem válido e logo logo vou "arrumar" minha página e colocar essa
calculadora lá! :P


[calculadora_ura]
; Atende a chamada
exten => s,1,Answer

; Configurações de tempos e iniciais

; 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" e continua o fluxo
exten => s,n,Set(TIMEOUT(response)=5)
; Qual número estamos perguntando
exten => s,n,SetVar(Numero=1)

; Obter número

; Define Num_Op para Número (1), usado no "timeout"
exten => s,n(numero),SetVar(Num_Op=1)
; Zera os acumuldor de dígitos, Digitado
exten => s,n,SetVar(Digitado=)
; 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
; Caso não digite nada em 5 segundos configurados, pergunta novamente
exten => s,n,Goto(numero)

; Obter operação

; 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 => s,n,Goto(operador)

; Depois de digitado, desvia o fluxo se for esperado operador
exten => _X,1,GotoIf($[${Num_Op} = 2]?operador)

; Pegar mais dígitos no caso de número, com espera máxima de 2 seg

; Guardando os dígitos
exten => _X,n,SetVar(Digitado=${Digitado}${EXTEN})
; Reconfigura para esperar dígito por 2 segundos
exten => _X,n,Set(TIMEOUT(response)=2)
; Aguarda mais um dígito, que ao digitar vai para "exten => _X,1,..."
exten => _X,n,WaitExten
; Reconfigura para a espera inicial de 5 segundos
exten => _X,n,Set(TIMEOUT(response)=5)

; Se for o segundo número, desvia o fluxo para a rotina de cálculo
exten => _X,n,GotoIf($[${Numero} = 2]?segundo)

; Tratando o primeiro número

; Guarda o primeiro número em Num1
exten => _X,n,SetVar(Num1=${Digitado})
; 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)

; Rotina de cálculo com o segundo número passado

; Guarda o segundo número em Num2
exten => _X,n(segundo),SetVar(Num2=${Digitado})
; 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)

; Tratando o 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)

; Trato o caso em que o operador é inválido

; 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|operador)


-- 
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