[AsteriskBrasil] Pequena brincadeira: URA Calculadora

Claudio Polegato Junior cpolegatojr.asterisk em gmail.com
Domingo Dezembro 3 18:45:03 BRST 2006


Em 01/12/06, Fred Banionis<fred em omicron.com.br> escreveu:
> Bacana Junior!
> Assim que eu tiver um pouco de tempo vou dar uma estudada nela e por pra
> testar.
> Eu gosto dessas coisas, pq lendo os códigos podemos estar aprimorando o
> conhecimento. Exemplos nunca são de mais. ;-)

Olá pessoal,


  Mais algumas alteraçõezinhas e arquivos de som amador, feitos por
mim num microfone de menos de meia dúzia de notas de R$ 1,00 e placa
de som onboard, disponíveis em:

http://cpolegatojr.no-ip.org

  Em minha mensagem de boas vindas, queria saber se posso deixar como
está anunciando a Calculadora como fruto da AsteriskBrasil, posso?

  Acho que já poderíamos até colocar uma licença para garantir
direitos autorais e distribuição, tipo GPL, o que acham?


; Projeto: Calculadora URA para Asterisk
; Autor: Claudio Polegato Junior
; Data: 03 de Dezembro de 2006
; Licença: em andamento, mas será com certeza GPL v2
; Copyright (c) Claudio Polegato Junior - 2006

[calculadora_ura]
; Atende a chamada e dá as boas vindas
exten => s,1,Answer
exten => s,n,Wait(2)
exten => s,n,PlayBack(bvccab)

; 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(d1n)
; 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(e1o)
exten => s,n,BackGround(1pa)
exten => s,n,BackGround(2ps)
exten => s,n,BackGround(3pm)
exten => s,n,BackGround(4pd)
; 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 guarda 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 | ${EXTEN} = 0]?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(oi)
; 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