[AsteriskBrasil] Pequena brincadeira: URA Calculadora

Fred Banionis fred em omicron.com.br
Sexta Dezembro 1 10:32:06 BRST 2006


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

A propósito, também sou de Ribeirao Preto =)

[ ] 's

Fred

Claudio Polegato Junior escreveu:
> 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)
>   



Mais detalhes sobre a lista de discussão AsteriskBrasil