POSXMLCriada no Brasil em 2005, POSXML(acrônimo para Point Of Sale eXtended Markup Language) é uma linguagem de programação usada para criar aplicações para um terminal P.O.S., do inglês, Point Of Sale ou Point Of Service. Geralmente, o desenvolvimentos de aplicações para terminais POS, são realizados através de uma linguagem de programação chamada C ou C++, o que demanda um conhecimento profundo das especificações técnicas da máquina (Hardware) e um programador qualificado para exercer tal tarefa. Seu propósito principal é facilitar o trabalho de desenvolvimento de aplicações para os terminais POS, pois possui um conjunto de instruções e comandos previamente programados que interagem diretamente com a máquina, por assim dizer, reduzindo consideravelmente o tempo de programação de aplicações. Características da LinguagemA estrutura do POSXMLA linguagem POSXML, assim como o próprio nome sugere, segue o padrão aberto de linguagem XML, amplamente difundido atualmente na indústria de software. O padrão XML é totalmente flexível e possibilita uma rápida expansão da linguagem.
Exemplo: Display
<stringvariable value="" variable="sTicketInfo"/>
<stringvariable value="" variable="sCityInfo"/>
<integervariable value="0" variable="iQtdTickets"/>
<integervariable value="0" variable="iInvalidInfo"/>
<!-- Function Display MAIN Menu -->
<function name="fMainMenu">
<integervariable value="0" variable="iOption"/>
<!-- Main Menu -->
<menu options="MENU PRINCIPAL:\\1.VENDA DE INGRESSO\2.RELATORIO\3.SAIR" variable="$(iOption)"/>
<!-- 1.VENDA DE INGRESSO -->
<if operator="equalto" value="1" variable="$(iOption)">
...
</if>
...
</function>
A única limitação que o programador encontra é o tamanho do aplicativo que não pode ultrapassar 32 kbytes de código compilado! Para se ter uma ideia da compilação oferecida pela plataforma, um aplicativo comum de 1600 linhas de códigos POSXML e 76 kbytes, quando compilado tem seu tamanho reduzido para 15 kbytes. Exemplo: <function name="display_test">
<display line="1" column="0" message="Aplicativo POSXML" />
<display line="2" column="0" message="Empresa A"/>
<waitkey />
<cleandisplay />
</function>
* < ; < * > ; > * & ; & * &apos ; ' * " ; " Exemplo: <function name="mostramensagem">
<display line="0" colunm="0" message="< = menor" />
<waitkey />
</function>
<function name="display_test">
<callfunction name="mostramensagem" />
</function>
Exemplo: <function name="mostramensagem">
<display line="0" column="0" message="< = menor" />
<waitkey />
</function>
<function name="display_test">
<!-- Este exemplo demonstra a utilização de uma -->
<!-- função que apresenta uma mensagem no display -->
<callfunction name="mostramensagem"/>
</function>
Linguagem CompiladaAssim como a grande maioria das linguagens de programação existentes, POSXML também é compilada em um formato específico, de tamanho reduzido para que possa ser executado no terminal POS através de um framework (máquina virtual). Um programa escrito em POSXML, quando compilado, transforma-se em um conjunto de bytecodes que são interpretados pela máquina virtual resultando na execução do programa no terminal POS. Cada comando, função ou instrução do programa escrito em POSXML, quando compilado, se transforma em um bytecode único que o identifica na biblioteca de comandos do framework (máquina virtual). Exemplo: <display line="0" column="0" message="Exemplo de Bytecode" />
Bytecode compilado: d0 \x0A 0 \x0A Exemplo de Bytecode \x0A \x0D
O modelo usado de compilação em bytecodes que podem ser interpretados por uma máquina virtual, permite que um programa escrito em linguagem POSXML possa ser usado, ou melhor, possa ser interpretado pela máquina virtual em diferentes terminais POS, desde que a marca e modelos especificados possuam um framework próprio. Isso significa que, uma vez programada uma aplicação para um determinado modelo de terminal POS, o programador pode escolher usar a mesma aplicação em outro terminal, cuja máquina virtual seja compatível com tal equipamento, não havendo a necessidade de nenhuma alteração ou implementação no código-fonte POSXML original do primeiro equipamento.
A linguagemDe fácil leitura e sua forma estruturada em formato XML, a linguagem POSXML é caracterizada por um conjunto de comandos e instruções próprios que interagem com o equipamento e torna fácil tarefas como a impressão de dados, a leitura de dados em um cartão com tarja magnética, a entrada de dados através de um teclado numérico, entre outras funções do terminal POS. SíntaxeOs comandos e instruções do POSXML devem obrigatoriamente obedecer algumas regras de formação, e uma delas é a observância quanto ao uso de letras maiúsculas e minúsculas (case sensitive). Alguns comandos pertencentes à linguagem não requerem parâmetros, ao contrário de outros comandos que precisam de parâmetros para interagir com a máquina. Exemplos: Comandos que não exigem instruções ou parâmetros. <exit />
<cleandisplay />
<waitkey />
Comandos que requerem instruções e parâmetros para interação com o equipamento. <display line="1" column="1" message="POSXML" />
<menu variable="$(option)" options="OPTION 1\OPTION 2\OPTION 3" />
<waitkeytimeout seconds="10"/>
Os nomes atribuídos à funções, variáveis e funções também devem obedecer as regras de escrita em letras maiúsculas e minúsculas, portanto, se um programador criar uma função chamada "calcula_digito", ele não terá êxito se fizer uma chamada na função "Calcula_Digito", ou seja, a invocação de uma função, aplicativo ou variável deve obedecer o nome exatamente igual ao nome atribuído pelo programador. Comandos e instruçõesPor se tratar de uma linguagem estruturada e baseada no formato XML, o POSXML é uma linguagem que está constantemente evoluindo, e novos comandos e instruções podem ser adicionados em sua biblioteca a qualquer momento. Inicialmente a linguagem contava com não menos que duas dezenas de comandos básicos, indispensáveis para se criar um programa, digamos, no mínimo funcional em um terminal POS, com poucos recursos, apenas o básico de display (visor), teclado numérico, cartão magnético e impressão. Com a evolução da linguagem, atualmente são quase uma centena de comandos e instruções que lidam com arquivos, imagens, operadores matemáticos, funções para manipular variáveis do tipo string, definição de variáveis, operadores lógicos, classes para se trabalhar com protocolo ISO 8583 (protocolo padrão para intercâmbio de informações nas operações com cartões de crédito), comandos e instruções para trabalhar com transações EMV e com transações Contacless, entre outros. Lista de comandos/instruções da linguagem
Outros comandos e instruções podem futuramente fazer parte da linguagem. Variáveis e tipos de dadosComo toda linguagem de programação, assim como Basic, Pascal, C, C++ ou outra linguagem, POSXML também permite o uso de variáveis de memória com tipos definidos. Não tão abrangente na variação de tipos de dados como a grande maioria das linguagens, POSXML apresenta na verdade, dois tipos de variáveis possíveis: inteiros e strings. Na programação em POSXML pode-se ainda obter uma variável do tipo Double (Decimal ou Ponto Flutuante) através da declaração de uma variável do tipo string, porém alimentando-a com valores que contenham casas decimais separadas da parte inteira por um ponto (".") e não por uma vírgula (","). Apesar de se poder declarar variáveis de memória em um programa em POSXML, há uma limitação que deve ser citada. O número máximo de variáveis inteiras e strings não pode ultrapassar o limite de 512 ao todo, portanto, se um programador precisar declarar 256 variáveis do tipo string e 256 variáveis do tipo inteiro, é possível, não mais que isso. Vale lembrar também que todas as variáveis de memória declaradas são globais, ou seja, são compartilhadas em todo o programa POSXML e em todas as páginas programadas, isso em tempo de execução. Exemplos: Variável do tipo String <!-- Declarando uma variável do tipo String com o conteúdo: "http://pt.wikipedia.org/wiki/posxml" -->
<stringvariable value="http://pt.wikipedia.org/wiki/posxml" variable="url" />
<!-- Acessando o conteúdo de uma variável declarada -->
<display line="0" column="0" message="$(url)" />
Variável do tipo Inteiro <!-- Declarando uma variável do tipo Inteiro com o conteúdo: "0" -->
<integervariable value="0" variable="iValor" />
<!-- Acessando o conteúdo de uma variável declarada -->
<inputmoney column="0" line="0" message="Digite o valor:" variable="$(iValor)" />
O programador deve observar que, sempre que se referir a uma variável de memória já declarada, deve-se usar a convenção $(nome_da_variavel), independente do tipo declarado. Trabalhar com variáveis de memória quase sempre requer a troca de tipos ou a conversão do tipo de dados em algum momento na programação. Em POSXML é possível realizar a conversão de dados do tipo inteiro para dados do tipo string e também da forma inversa, através de dois comandos existentes na linguagem: inttostring e stringtoint. Exemplos: <integervariable value="1" variable="iOpcao_Tipo_Inteiro" />
<integervariable value="" variable="sOpcao_Tipo_String" />
<inttostring integervariable="$(iOpcao_Tipo_Inteiro)" stringvariable="$(sOpcao_Tipo_String)" />
Sistema de arquivosNa grande maioria das vezes, ao se programar um terminal POS, o programador se depara com a necessidade de gravar informações no sistema de arquivos do equipamento. A linguagem POSXML consegue trabalhar com arquivos do tipo WALK dbFile (Um sistema de arquivos definido pelo framework ou máquina virtual que interpreta um programa em POSXML compilado). O sistema de arquivos WALK dbFile usa o formato: key=buffer\nkey=buffer\n, basicamente o formato de arquivos textos em ambiente Unix, onde o \n é usado para quebra de linhas. Existem 8 comandos básicos na linguagem POSXML para se trabalhar com arquivos no terminal POS, são eles: * editfile * readfile * readfilebyindex * deletefile * file.open * file.read * file.write * file.close Exemplos: <editfile filename="teste.txt" key="$(sChave)" value="$(sValor)" />
<readfile filename="teste.txt" key="$(sChave)" variabledestination="$(sRetorno)" />
<readfilebyindex filename="teste.db" index="0" variablekey="$(var1)" variablevalue="$(var2)" variablereturn="$(var3)" />
<deletefile filename="teste.txt" />
Visão geralHistóriaEm meados de 2005, em um momento em que a utilização de equipamentos como os terminais POS encontravam-se em constante crescimento, impulsionado por um crescente número de empresas regionais que administravam seus próprios cartões de crédito, cartões Private label e com o surgimento de novos negócios, um programador brasileiro e seu sócio, que já trabalhavam com o desenvolvimento de aplicações para terminais POS e atendiam alguns clientes, se esbarravam com alguns problemas que os impediam ganhar velocidade e flexibilidade com estes terminais POS. O desenvolvimento das aplicações tinham que ser realizados em linguagem C e cada vez que o mercado lançava um novo modelo de terminal ou quando surgia uma nova marca ou novo fabricante, a mesma aplicação desenvolvida em C tinha que ser totalmente reescrita e adaptada para o novo terminal a ser usado, um esforço elevado que resultava em algumas restrições: o processo era considerado lento e caro. Até mesmo quando se precisava implementar uma nova funcionalidade no terminal POS em uma aplicação em C já existente, esbarrava-se em tal dificuldade. Pensando na necessidade de ganhar velocidade e flexibilidade no desenvolvimento de suas aplicações para atender seus clientes com mais eficácia, esse programador pensou em inovar de alguma forma e decidiu que, criando uma linguagem padrão, única e flexível, seria a melhor saída para resolverem seus problemas com seus clientes. Nascia então o conceito da programação através de uma linguagem própria para terminais POS, cujos comandos e instruções fossem pré-programados e que de uma forma simples, interagissem com o equipamento. O uso da estrutura em padrão XML foi decisão importante, pois daria flexibilidade suficiente para expandir a linguagem o quanto fosse necessário, sem muitas modificações na API básica da linguagem. Meses depois da prova de conceito da linguagem estar pronta, decidiram que a linguagem poderia se tornar acessível a outros programadores e outros desenvolvedores de aplicações, o que pode expandir a cadeia de valor dos terminais POS. A linguagem POSXML e suas ferramentas já foram testadas e usadas por programadores de vários países como México, Chile, Argentina, Colômbia, República Dominicana, EUA, Turquia, Índia, Rússia e alguns países do oriente médio. Atributos
O que não éApesar da linguagem ser estruturada no padrão XML, POSXML não é uma linguagem aberta que pode ser usada por um browser (navegador) padrão como a linguagem WML, geralmente utilizada em aplicações WAP que são executadas por dispositivos móveis, tais como telefones celulares. Exemplos de códigosO tradicional "Hello World"<!-- Uma aplicação de exemplo que mostra no display do terminal POS a frase: Hello World. -->
<!-- O comando 'display' exibe o conteúdo de mensagem na linha e coluna especificados -->
<display column="0" line="3" message="Hello World" />
<!-- O comando 'waitkey' aguarda até que o operador pressione alguma tecla para continuar a execução -->
<waitkey/>
Menu, funções e impressão<stringvariable value="" variable="sNome" />
<stringvariable value="" variable="sValor" />
<integervariable value="0" variable="iValor" />
<integervariable value="0" variable="iOpcao" />
<!-- O comando 'menu' monta um menú de opções no display do terminal. O operador pode digitar de 0 a 9, ou seja,
pode-se inserir até 10 opções no menu. O valor digitado fica armazenado em uma variável -->
<menu variable="$(iOpcao)" options="\Menu\ 1) Funcao Main\ 2) Funcao Impressao" />
<if operator="equalto" value="1" variable="$(iOpcao)">
<!-- O comando 'callfunction' realiza uma chamada em uma função previamente programada,veja neste exemplo a chamada na função 'Main' -->
<callfunction name="Main"/>
</if>
<if operator="equalto" value="2" variable="$(iOpcao)">
<callfunction name="Impressao"/>
</if>
<!-- Definindo uma função de nome 'Main' -->
<function name="Main">
<!-- O comando 'inputmoney' é usado para guardar em uma variável do tipo inteiro os valores digitados pelo operador -->
<inputmoney column="0" line="0" message="Digite o valor:" variable="$(iValor)" />
<cleandisplay />
<!-- O comando 'inttostring' converte valores de variáveis do tipo 'inteiro' em valores do tipo 'string' -->
<inttostring integervariable="$(iValor)" stringvariable="$(sValor)" />
<display column="0" line="2" message="Valor digitado:" />
<display column="0" line="3" message="$(sValor)" />
<waitkey />
</function>
<function name="Impressao">
<!-- O comando 'inputformat' é responsável de guardar em uma variável do tipo string valores ou caracteres digitados pelo operador.
A quantidade máxima de caracteres é definida no parâmetro 'format'
-->
<inputformat column="0" format="AAAAAAAAAA" line="0" message="Digite o nome:" variable="$(sNome)" />
<print message="$(sNome)" />
<!-- O comando 'paperfeed' avança o papel bobina em 3 linhas. -->
<paperfeed />
</function>
Lidando com arquivo no POS<stringvariable value="" variable="sRet" />
<stringvariable value="" variable="sWriteKey" />
<stringvariable value="" variable="sWriteValue" />
<inputformat column="0" format="AAAAAAAAAA" line="0" message="Digite uma chave:" variable="$(sWriteKey)" />
<inputformat column="0" format="9999999999" line="2" message="Digite um valor:" variable="$(sWriteValue)" />
<!-- o comando 'editfile' edita o valor de uma chave no arquivo especificado em 'filename'. Caso
este arquivo não exista, o comando criará um arquivo com esta chave automaticamente -->
<editfile filename="teste.txt" key="$(sWriteKey)" value="$(sWriteValue)" />
<!-- O comando 'readfile' procura no sistema de arquivos do terminal algum arquivo com o nome especificado em
'filename'. Dentro deste arquivo o comando procura por uma chave com o nome especificado em 'key',
adicionando o valor da chave encontrada à variável do tipo string em 'variabledestination'. Caso não exista
esta chave ou arquivo, o valor da variável em 'variabledestination' será um espaco em branco. -->
<readfile filename="teste.txt" key="$(sWriteKey)" variabledestination="$(sRet)" />
<!-- O comando 'deletefile' apaga um arquivo especificado em 'filename' do sistema de arquivos do terminal -->
<deletefile filename="teste.xml" />
<!-- O comando 'joinstring' concatena dois valores do tipo string e armazena o resultado em 'variabledestination' -->
<joinstring firstvalue="Result:" secondvalue="$(sRet)" variabledestination="$(sRet)" />
<cleandisplay />
<display column="0" line="4" message="$(sRet)" />
<waitkey />
Um exemplo com "While"<!-- O comando 'stringvariable' cria na memória do terminal, uma variavel do tipo string, neste exemplo, com o nome 'sData' -->
<stringvariable value="" variable="sData" />
<stringvariable value="KEY_CANCEL" variable="sKey" />
<!-- O comando 'while' realiza um loop até que a condição especificada seja satisfeita,
neste exemplo, quando o valor de 'sKey' for diferente de 'KEY_CANCEL'
-->
<while variable="$(sKey)" operator="equalto" value="KEY_CANCEL" >
<!-- o comando 'getdatetime' extrai a data e a hora interna no formato especificado e a grava na string em variabledestination -->
<getdatetime format="d/M/yy h:m:s" variabledestination="$(sData)" />
<!-- o comando 'display' neste caso vai mostrar na linha 2 na coluna 0 a data e a hora -->
<display column="0" line="2" message="$(sData)" />
<!-- o comando 'readkey' espera o tempo especificado em miliseconds para gravar na string em variablereturn
caso nao seja pressionado nenhuma tecla sera retornado o valor 'KEY_CANCEL' por default -->
<readkey miliseconds="800" variablereturn="$(sKey)" />
</while>
<display column="0" line="2" message="$(sKey)" />
<waitkey />
Ver tambémLigações externas
|