# POSXML

Criada 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 Linguagem
### A estrutura do POSXML

A 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.
* A linguagem POSXML é organizada e estruturada em forma de TAGs apresentando níveis e subníveis de um conjunto de comandos e instruções que formam a estrutura lógica de um aplicativo POSXML.
Exemplo:
* A primeira versão da linguagem POSXML exigia que todos os programas escritos na linguagem, possuíssem uma TAG Pai ou TAG Root identificada por um identificador/nome válido. A partir da nova versão online, onde os programadores podem escrever os programas em POSXML na WEB, disponível em formato Cloud Computing, a "TAG Pai" ou "TAG Root" foi abolida, simplificando o processo de programação.
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:
* Por padrão, a estrutura da linguagem XML possui alguns caracteres reservados sendo respeitados também pela linguagem POSXML e são escritos da forma correta:
Exemplo:
* Assim como no XML, a linguagem POSXML aceita a definição de seções de comentários que facilita a documentação do programa.
Exemplo:

### Linguagem Compilada

Assim 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:
Bytecode compilado:
* O perfeito funcionamento de um programa compilado em POSXML no terminal fica por conta de uma máquina virtual, chamada de framework, que trabalha sobre o sistema operacional do equipamento POS. Em outras palavras, uma aplicação em POSXML compilada e instalada no terminal POS fica localizada na 4a. camada de softwares encontrados no aparelho, como pode-se observar a figura abaixo:
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.
* Tal portabilidade assegura que, haverá um esforço mínimo, ou nenhum esforço para migração de aplicações entre terminais POS de diferentes marcas e diferentes modelos.

## A linguagem

De 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íntaxe

Os 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.
Comandos que requerem instruções e parâmetros para interação com o equipamento.
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ções

Por 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

* if
    Instrução de tomada de decisão ou comparação lógica
* else
    Condição lógica em um bloco da instrução if
* while
    Instrução que permite a execução de um código multiplas vezes
* break
    O comando break possibilita a saída imediata do loop while
* function
    Define um bloco de código que pode ser posteriormente executado
* callfunction
    Realiza uma chamada em uma função previamente definida
* execute
    Executa um aplicativo POSXML compilado e armazenado no POS
* exit
    Encerra imediatamente a execução do aplicativo POSXML
* getcardvariable
    Obtém o número do cartão e o armazena diretamente em uma variável
* system.readcard
    Aguarda até que um cartão seja passado ou uma tecla seja pressionada
* system.inputtransaction
    Instrução para receber os dados do cartão em uma transação contactless
* menu
    Monta um menu na tela do terminal, baseado no número de linhas do POS
* menuwithheader
    Monta um menu com cabeçalho, baseado no número de linhas do POS
* displaybitmap
    Exibe um bitmap monocromático no display do POS
* display
    Exibe uma mensagem customizada no display do terminal POS
* cleandisplay
    Apaga todo conteúdo do display do terminal POS
* system.gettouchscreen
    Captura as coordenadas (x e y) de onde o display foi pressionado
* print
    Imprime uma mensagem customizada em tamanho de fonte padrão
* printbig
    Imprime uma mensagem customizada em tamanho de fonte dupla
* printbitmap
    Imprime um bitmap monocromático presente no terminal POS
* printbarcode
    Imprime um código de barras no formato I25, na horizontal ou vertical
* checkpaperout
    Verificar se o compartimento de papel ainda contém papel
* paperfeed
    Envia um sinal para a impressora adicionando linhas em branco no ticket
* inputfloat
    Permite a entrada de um valor com ponto (.) através da tecla (*)
* inputformat
    Permite a entrada de um valor baseado em um formato pré-definido
* inputinteger
    Permite a entrada de um valor inteiro
* inputoption
    Armazena em uma variável a opção de um item de menu
* inputmoney
    Permite a entrada de um valor monetário
* crypto.crc
    Calculo CRC 16 bits, suporte a CRC-CCITT
* crypto.encryptdecrypt
    Rotinas de criptografia com algoritmos DES, 3DES ou NEWDES
* crypto.lrc
    Gera um byte de LRC da string em buffer
* crypto.xor
    Realiza uma operação binária XOR entre os bytes de 2 strings
* downloadfile
    Faz o download de um arquivo previamente cadastrado no WALK Manager
* filesystem.filesize
    Retorna o tamanho de um arquivo na memória do POS
* filesystem.listfiles
    Lista os arquivos de um diretório salvando-os em um arquivo
* filesystem.space
    Verifica o espaço (livre e utilizado) e o número de arquivos na memória
* file.open
    Abre um arquivo para leitura ou escrita
* file.close
    Fecha um arquivo que foi previamente aberto com file.open
* file.read
    Lê um arquivo que foi previamente aberto com file.open
* file.write
    Grava um arquivo que foi previamente aberto com file.open
* readfile
    Realiza a leitura de um arquivo WALK dbfile (chave/valor)
* readfilebyindex
    Realiza a leitura de uma chave de um arquivo WALK dbfile
* editfile
    Permite escrever um arquivo no formato WALK dbfile (chave/valor)
* deletefile
    Efetua a exclusão de um arquivo da memória do terminal POS
* iso8583.initfieldtable
    Inicia a tabela de campos ISO8583 baseado em um arquivo especificado
* iso8583.initmessage
    Inicia a montagem de uma mensagem ISO
* iso8583.putfield
    Insere um campo na mensagem, obrigatoriamente em ordem crescente
* iso8583.endmessage
    Finaliza a montagem da mensagem ISO
* iso8583.transactmessage
    Acrescenta size, header e trailer e envia a mensagem ISO ao autorizador
* iso8583.analyzemessage
    Inicia o processo de análise e decomposição dos campos da mensagem
* iso8583.getfield
    Extrai um campo de uma mensagem previamente analisada
* openserialport
    Abre a porta serial para comunicação com periféricos externos
* writeserialport
    Escreve um buffer na porta serial
* readserialport
    Lê um buffer de um dispositivo externo capturado pela porta serial
* closeserialport
    Fecha a porta serial
* getdatetime
    Armazena em uma variável a data e a hora no momento da execução
* time.calculate
    Calculo de tempo com suporte a adição, subtração e diferença
* adjustdatetime
    Atualiza o relógio interno do terminal POS
* predial
    Inicializa o dispositivo de discagem
* preconnect
    Efetua a conexão ao host autorizador
* shutdownmodem
    Desliga o modem e cancela as operações do dispositivo de conexão
* network.checkgprssignal
    Verifica o status da conexão, caso o POS tenha suporte a GPRS
* network.hostdisconnect
    Desconecta o terminal do host, mantendo-o conectado a rede
* network.ping
    Verifica o status da conexão com o host
* network.send
    Envia um buffer para o host previamente conectado
* network.receive
    Recebe um buffer do host previamente conectado
* pinpad.open
    Habilita a comunicação com o pinpad externo ou interno
* pinpad.loadipek
    Grava uma chave inicial e uma ksn inicial na memória do pinpad
* pinpad.getkey
    Captura uma tecla que seja pressionada no pinpad externo
* pinpad.getpindukpt
    Captura um PIN e o encripta usando o padrão DUKPT
* pinpad.display
    Exibe uma mensagem customizada no display do pinpad
* pinpad.close
    Encerra a comunicação com o pinpad externo ou interno
* emv.open
    Inicializa biblioteca EMV
* emv.loadtables
    Carrega tabelas EMV e PKI de arquivo por adquirente
* emv.cleanstructures
    Limpa todos os Parâmetros de entrada e saída
* emv.adddata
    Adiciona parâmetros ao processo EMV
* emv.getinfo
    Retorna parâmetros de informação após execução de processo EMV
* emv.inittransaction
    Inicializa o processo EMV com os parâmetros inseridos
* emv.processtransaction
    Inicia a execução do processo EMV
* emv.finishtransaction
    Finaliza a execução do processo EMV
* emv.removecard
    Aguarda remoção do cartão
* emv.settimeout
    Define Timeout (em segundos) da biblioteca de processos EMV
* system.readcard
    Aguarda até que um cartão seja passado ou uma tecla seja pressionada
* system.inputtransaction
    Instrução para receber os dados do cartão em uma transação contactless
* integervariable
    Cria uma instância de variável do tipo inteiro
* stringvariable
    Cria uma instância de variável do tipo string
* integerconvert
    Conversão de inteiro para binário, octal ou hexadecimal
* convert.toint
    Conversão de binário, decimal ou hexadecimal para inteiro
* inttostring
    Conversão de inteiro para string
* stringtoint
    Conversão de string para inteiro
* integeroperator
    Incrementa em +1 ou decrementa em -1 uma variável do tipo inteiro
* string.tohex
    Converte uma string para sua representação em hexadecimal
* string.fromhex
    Converte uma representação em hexadecimal para uma string
* string.charat
    Extrai um character da string especificada
* string.elementat
    Retorna um elemento em um index específico na string
* string.elements
    Retorna quantos elementos existem na string especificada
* string.find
    Procura por uma substring na string especificada
* string.getvaluebykey
    Procura em uma string por um valor baseado em key/value
* string.trim
    Elimina os espaços em branco a esquerda e a direita da string
* string.insertat
    Insere um elemento em um índice específico na string
* string.length
    Retorna o tamanho da string especificada
* string.pad
    Efetua um padding com um caracter específico na string
* string.removeat
    Remove um elemento em um índice específico na string
* string.replace
    Substitui todas as ocorrências da substring especificada
* string.replaceat
    Substitui um elemento em um índice específico na string
* string.substring
    Captura uma parte específica da string
* substring
    Copia o trecho de uma variável string para outra variável
* joinstring
    Concatena em uma string o valor de outras 2 strings
* input.getvalue
    Captura uma string e a exibe na tela em qualquer posição
* smartcard.insertedcard
    Verifica se o cartão está inserido no leitor de smart card do POS
* smartcard.closereader
    Finaliza o processo de comunicação com o smart card
* smartcard.startreader
    Inicia o leitor de smart card e tenta iniciar o cartão
* smartcard.transmitapdu
    Envia um comando APDU para o smart card
* mathematicaloperation
    Realiza uma operação matemática entre dois valores
* system.beep
    Produz um sinal sonoro curto no terminal POS
* system.checkbattery
    Verifica o status da bateria do terminal
* system.backlight
    Permite controlar o nível de intensidade do backlight do terminal
* system.info
    Busca de informações no sistema do POS (MAC Address, SIM ID, etc)
* system.restart
    Executa uma instrução que reinicia o terminal POS
* unzipfile
    Descompacta um arquivo compactado no formato zip
* waitkey
    Pausa a execução até que o operador pressione uma tecla
* waitkeytimeout
    Idem ao comando waitkey, mas possui um timeout
* readkey
    Idem ao comando waitkey, mas a guarda a tecla pressionada
* wait
    Pause a execução por um tempo definido
Outros comandos e instruções podem futuramente fazer parte da linguagem.

### Variáveis e tipos de dados

Como 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
Variável do tipo Inteiro
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:

### Sistema de arquivos

Na 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:
Exemplos:

## Visão geral
### História

Em 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

* Flexível
* Expansível
* Estruturada
* Compilada
* Fácil aprendizado
* Interativa
* Rápida
* Não exige conhecimento do hardware (máquina)
* Não exige conhecimento da linguagem C

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