local json = inclua'json'; //incluindo a biblioteca json.
//Basta usar a criatividade para criar funções de busca de cidades, estados etc.
local procure_estado_por_sigla;
funcao principal(ARG)
local tab_uf = json.decod_arquivo("uf_cidades.json");
local ret,err = procure_estado_por_sigla(tab_uf, "DF");//criei uma função para procurar mais facilmente por estado.
se ret entao
poe(ret.nome); //nome do estado
poe(ret.cidades[1]);//primeira cidade
senao
poe(err);
fim
retorne 0; //retorna sucesso (0);
fim
funcao procure_estado_por_sigla(tab,sigla)
local estados = tab.estados;
para i=1,#estados inicio
se estados[i].sigla == sigla entao
retorne estados[i];
fim
fim
retorne nulo, ("estado não encontrado: " .. sigla);
fim
sis.deflocal("pt_BR.UTF-8")
//exemplo de imagens de estoque.
inclua'igbr'
funcao principal()
jan = crie_janela();
rol = crie_rolagem(jan);
poe_estoque(rol, func_bt);
ig.botao_mostre_imagem();
mostre(jan);
fim //fim principal
//================================= funcoes abaixo =====================//
funcao crie_janela()
local ret = ig.janela("Exemplo de Estoque", 500 , 400);
ig.caixa_def_borda_largura(ret,6);
ig.conecte_permutado(ret,ig['destruido'], sis.saia, 0 );
ig.janela_def_posicao(ret,ig.JANELA_POS_CENTRO);
retorne ret;
fim
funcao mostre(jan)
ig.componente_mostre_todos(jan);
ig.loop();
fim
funcao crie_rolagem(jan)
local rol = ig.janela_rolagem();
ig.ad(jan,rol);
local caixav = ig.caixavertical();
ig.janela_rolagem_ad( rol, caixav);
retorne caixav;
fim
funcao poe_estoque(rol, func_bt)
local horiz = ig.caixahorizontal();
ig.caixa_ad(horiz, ig.rotulo(" imagem "),falso,falso,0 );
ig.caixa_ad(horiz, ig.separadorvertical(),falso,falso,0 );
ig.caixa_ad(horiz, ig.rotulo(" rótulo "),falso,falso,0 );
ig.caixa_ad(horiz, ig.separadorvertical(),falso,falso,0 );
ig.caixa_ad(horiz, ig.rotulo(" código"),falso,falso,0 );
ig.caixa_ad(rol,horiz,falso,falso, 2);
ig.ad( rol, ig.separadorhorizontal() );
para i , v em pares(ig) inicio
se string.procure( i , 'estoque_') entao
local horiz = ig.caixahorizontal();
local img = ig.imagem_estoque( ig[i], 5 );
ig.caixa_ad(horiz, img, falso, falso, 4 );
ig.caixa_ad(horiz, ig.separadorvertical(),falso,falso,0 );
local bt = ig.botao_estoque(ig[i]);
ig.componente_def_tamanho(bt, 200 , 40 );
ig.botao_def_relevo( bt, ig.RELEVO_NULO);
ig.caixa_ad( horiz, bt,falso,falso,2);
ig.caixa_ad(horiz, ig.separadorvertical(),falso,falso,0 );
ig.conecte_funcao( bt , ig.clique, func_bt,i);
ig.caixa_ad(horiz, ig.rotulo( 'ig.' .. string.maiuscula(i) ) ,falso,falso,2);
ig.caixa_ad( rol,horiz, falso , falso , 2);
// imprima(i);
fim
fim
fim
funcao func_bt(comp,dado)
// ig.msg(jan,'', dado );
local img = ig.imagem_estoque(ig[dado],6);
local jan = ig.janela'';
ig.caixa_def_borda_largura(jan,6);
ig.janela_def_posicao(jan, 2); //2 = mouse
caixah = ig.caixahorizontal();
ig.ad(jan,caixah);
ig.ad(caixah,img);
ig.ad(caixah,ig.rotulo(' '.. string.troque(dado,'_' , ' ') ) );
ig.componente_mostre_todos(jan);
fim
//Controle de clientes em Prisma com ig
/**programa livre, open-source, para qualquer fim a qualquer um que
o queira usar, para modificar, usar em outros programas, comercial,
sem precisar pagar ou mencionar o autor aqui presente: Adalberto.
O programa é dado como está, gratuito, mas sem garantias, o autor
não poderá ser responsabilizado por qualquer uso.
**///
local ig = inclua'ig' //biblioteca gráfica (janela, botoes etc.)
local sql = inclua'psqlite3' //biblioteca de banco de dados SQlite3
local nomebd = 'Clientes.bd'
funcao principal(Args) //funcao main do programa
//criando a janela
local jan = ig.janela('Controle de Clientes', 700,400);
ig.conecte_funcao(jan,ig.destruido,ig.fimjanela);
cria_bd_e_tabelas(jan);
//criando o painel fixo para colocar os componentes:
local fixo = ig.fixo();
ig.ad(jan,fixo);
//criando os componentes:
local cabecalho = ig.rotulo'Controle de Clientes:';
ig.fixo_ad(fixo,cabecalho,10,10);
ig.componente_modifique_fonte(cabecalho,'Times New Roman',ig.NEGRITO,16);
local rot_nome = ig.rotulo'Nome:';
ig.fixo_ad(fixo,rot_nome,10,40);
local txt_nome = ig.texto();
ig.componente_def_tamanho(txt_nome,550,28);
ig.fixo_ad(fixo,txt_nome,10,55);//col:10 x lin:80;
local rot_endereco = ig.rotulo'Endereço:';
ig.fixo_ad(fixo,rot_endereco,10,85);
local txt_endereco = ig.texto();
ig.componente_def_tamanho(txt_endereco,550,28);
ig.fixo_ad(fixo,txt_endereco,10,100);
local rot_tel = ig.rotulo'Telefone:';
ig.fixo_ad(fixo,rot_tel,10,130);
local txt_tel = ig.texto();
ig.componente_def_tamanho(txt_tel,220,28);
ig.fixo_ad(fixo,txt_tel,10,145);
local rot_nasc = ig.rotulo'Data de nasc.:';
ig.fixo_ad(fixo,rot_nasc,10,175);
local txt_nasc = ig.texto();
ig.fixo_ad(fixo,txt_nasc,10,190);
//criando o botao incluir
//é bastante código, mas isso te dá mais domínio sobre o componente!
local bt_incluir = ig.botao();
local caxh = ig.caixahorizontal();
local img = ig.imagem_estoque(ig.ESTOQUE_OK,2);
local rot = ig.rotulo(' Incluir');
ig.ad(caxh,img);
ig.ad(caxh,rot);
ig.ad(bt_incluir,caxh);
ig.fixo_ad(fixo,bt_incluir,10,220);
//criando o botao Alterar
local bt_alterar = ig.botao();
caxh = ig.caixahorizontal();//reaproveitamos as variaveis caxh,img e rot
img = ig.imagem_estoque(ig.ESTOQUE_DISQUETE,2);
rot = ig.rotulo(' Alterar');
ig.ad(caxh,img);
ig.ad(caxh,rot);
ig.ad(bt_alterar,caxh);
ig.fixo_ad(fixo,bt_alterar,100,220);
//criando o botao Excluir
local bt_excluir = ig.botao();
caxh = ig.caixahorizontal();//reaproveitamos as variaveis caxh,img e rot
img = ig.imagem_estoque(ig.ESTOQUE_DELETAR,2);
rot = ig.rotulo(' Excluir');
ig.ad(caxh,img);
ig.ad(caxh,rot);
ig.ad(bt_excluir,caxh);
ig.fixo_ad(fixo,bt_excluir,190,220);
//criando o botao Sair
local bt_sair = ig.botao();
caxh = ig.caixahorizontal();//reaproveitamos as variaveis caxh,img e rot
img = ig.imagem_estoque(ig.ESTOQUE_SAIR,2);
rot = ig.rotulo(' Sair');
ig.ad(caxh,img);
ig.ad(caxh,rot);
ig.ad(bt_sair,caxh);
ig.fixo_ad(fixo,bt_sair,280,220);
//criando botao Limpar banco de dados:
local bt_limparbd = ig.botao(' Apagar todos os registros do bd ');
ig.fixo_ad(fixo,bt_limparbd,360,220);
//criando uma janela de rolagem:
local jan_rol = ig.janela_rolagem();
ig.fixo_ad(fixo,jan_rol,10,250);
ig.componente_def_tamanho(jan_rol,700,300);
//criando a caixa de listagem
local list = ig.listagem(' Id ',' Nome ',' Endereço ',' Telefone ',' Data de nasc. ');
ig.janela_rolagem_ad(jan_rol,list);
para i=1,5 inicio
ig.listagem_def_col_auto_ajuste(list,i,verdadeiro);//definido auto ajuste da col 1 ate 5
fim
ig.componente_modifique_fonte(list,'Arial',11);
ig.componente_modifique_corletra(list,ig.cor_analise(ig.azul,'*t'));
//Terminamos a parte gráfica agora vamos às funções callbacks:
//criando tabela com todos os componentes criados para as callbacks:
local tab = {
jan = jan,
list = list,
txt_nome = txt_nome,
txt_endereco = txt_endereco;
txt_tel = txt_tel;
txt_nasc = txt_nasc
}
//atualizando a listagem com dados do bd se houver.
atualiza_listagem(tab);
//conectando a listagem:
ig.conecte_funcao(
list,ig.clique_linha,
list_clique, tab //passando tabela como dado extra.
);
//conectando botao incluir
ig.conecte_funcao(bt_incluir,ig.clique,incluir,tab);
ig.conecte_funcao(bt_alterar,ig.clique,alterar,tab);
ig.conecte_funcao(bt_excluir,ig.clique,excluir,tab);
ig.conecte_funcao(bt_sair,ig.clique,sair,tab);
ig.conecte_funcao(bt_limparbd,ig.clique,limpar_bd,tab);
ig.conecte_funcao(jan,ig.evento_delete, sair,tab);
ig.componente_mostre_todos(jan);
ig.fimprograma();
retorne 0;
fim
/*========================================== Call backs ========================*/
funcao sair(comp,evento,dado)
se nao dado entao dado = evento fim;
local dialog = ig.dialogo_mensagem(dado.jan,'Atenção','Sair do programa?',
ig.MSG_QUESTAO , //tipo de mensagem
ig.BOTAO_SIM_NAO //tipos de botões
);
ig.botao_mostre_imagem(verdadeiro);
local ret = ig.dialogo_execute( dialog );
ig.componente_destrua( dialog );
se ret == ig.RET_SIM entao
ig.componente_destrua(dado.jan);
ig.fimjanela();
senao
retorne verdadeiro;//para não fechar é necessário retornar verd.
fim
fim
//=====================================================
funcao obt_valores_listagem(list,lin)
local id = string.apare( ig.listagem_obt_texto(list, lin,1) );
local Nome = string.apare(ig.listagem_obt_texto(list, lin,2));
local End = string.apare(ig.listagem_obt_texto(list,lin,3));
local Tel = string.apare(ig.listagem_obt_texto(list,lin,4));
local Nasc = string.apare(ig.listagem_obt_texto(list,lin,5));
retorne{id=id,Nome=Nome,End=End,Tel=Tel,Nasc=Nasc};
fim
//define os campos Nome, Endereço, Telefone etc.
funcao def_valores_campos(tab,Nome,End,Tel,Nasc)
ig.texto_def_texto(tab.txt_nome,Nome);
ig.texto_def_texto(tab.txt_endereco,End);
ig.texto_def_texto(tab.txt_tel,Tel);
ig.texto_def_texto(tab.txt_nasc,Nasc);
fim
//limpa valores dos campos:
funcao limpe_campos(dado)
ig.texto_def_texto(dado.txt_nome,'');
ig.texto_def_texto(dado.txt_endereco,'');
ig.texto_def_texto(dado.txt_tel,'');
ig.texto_def_texto(dado.txt_nasc,'');
fim
//obtém valores dos campos:
funcao obt_valores_campos(dado)
local Nome =string.apare( ig.texto_obt_texto(dado.txt_nome));
local End = string.apare(ig.texto_obt_texto(dado.txt_endereco));
local Tel = string.apare(ig.texto_obt_texto(dado.txt_tel));
local Nasc = string.apare(ig.texto_obt_texto(dado.txt_nasc));
retorne{ Nome=Nome,End=End,Tel=Tel,Nasc=Nasc};
//retorna uma tabela com campos iguais aos nomes das variáveis
fim
funcao algum_campo_vazio(cmp)
se cmp.Nome=='' ou cmp.End == '' ou cmp.Tel=='' ou cmp.Nasc=='' entao
retorne verdadeiro;
senao
retorne falso;
fim
fim
//======================================================
//ao clicar na listagem:
funcao list_clique(list,lin,col,evento,tab)
local lcmp = obt_valores_listagem(list,lin);// lcmp = listagem campos.
def_valores_campos(tab,lcmp.Nome,lcmp.End,lcmp.Tel,lcmp.Nasc);
tab.id_atual = lcmp.id; //este campo da tabela é adicionado para alterar ou excluir.
//ao modificar a tabela aqui ela é modificada fora da função também
fim
funcao incluir(comp,dado)
cria_bd_e_tabelas(dado.jan); //criando o banco de dados e tabelas caso não existam.
local ret , base = sql.abra( nomebd );//abre o banco de dados sqlite3
se ret <> sql.SQLITE_OK entao //testando se base é o retorno é de sucesso
ig.msg(dado.jan,'ERRO', " ERRO, NAO FOI POSSIVEL ABRIR O BANCO DE DADOS " ..
sql.mensagem_erro(base) //pega o ultimo erro contido em base.
);
fim
//(Nome,End,Tel,Nasc);
local str_sql = "INSERT INTO clientes(Nome,Endereco,Tel,Nasc) VALUES ('%s','%s','%s','%s');";//os `%s' serão substituídos depois:
local cmp = obt_valores_campos(dado);//ret: cmp = campos (tabela);
se algum_campo_vazio(cmp) entao//Campos vazios?
ig.msg(dado.jan,'Atenção','Preencha todos os campos!');
senao
str_sql = string.formate(str_sql,cmp.Nome,cmp.End,cmp.Tel,cmp.Nasc);//formatando a string, poderia concatenar
//também se preferisse, mas eu acho bem mais fácil assim.
ret = sql.exec(base, str_sql,funcao()es.escreva'*'fim);//funcao vazia para evitar erros.
se ret == sql.SQLITE_OK entao
ig.msg(dado.jan,'','Dados gravados com sucesso!');
limpe_campos(dado);
senao
ig.msg(dado.jan,'', sql.mensagem_erro(base));
fim
//finalmente, não se esqueça de fechar o bd aberto
sql.feche(base);
atualiza_listagem(dado);
fim
fim
//cria banco de dados e tabelas se já não existirem:
funcao cria_bd_e_tabelas(jan)
local ret , base = sql.abra(nomebd);
se ret <> sql.SQLITE_OK entao
ig.msg(jan,'Erro',sql.mensagem_erro(base));
fim
//
local str_sql = [[CREATE TABLE IF NOT EXISTS clientes(
id INTEGER PRIMARY KEY AUTOINCREMENT,
Nome TEXT,
Endereco TEXT,
Tel TEXT,
Nasc TEXT);]];
local ret , erro_msg = sql.exec(base, str_sql,funcao()fim);
se ret <> sql.SQLITE_OK entao
ig.msg(jan,'Erro', erro_msg);
fim
sql.feche(base); //fechado a base de dados.
fim
//atualizando a caixa de listagem:
funcao atualiza_listagem(tab)//lendo o banco de dados novamente e inserindo na listagem.
ig.listagem_limpe(tab.list);//limpando a listagem;
local ret , base = sql.abra(nomebd);
se ret <> sql.SQLITE_OK entao//tratamento de erro
ig.msg(tab.jan,"Erro: ", sql.mensagem_erro(base));
sql.feche(base);
retorne;
fim //fim se ret <>
local str_sql = "SELECT * FROM clientes;";//seleciona tudo de carros;
local ret , res = sql.prepare_v2( base , str_sql ); //ret é o retorno de erro, res é o retorno da instancia da string compilada
se ret == sql.SQLITE_OK entao
local cont = 1;
enquanto 1 inicio
local pas = sql.passe(res); //executa a string compilada res.
se (pas == sql.SQLITE_LIN) entao
//imprima (cont, sql.coluna_texto( res , 2),sql.coluna_texto( res , 3),sql.coluna_texto( res , 4) ,sql.coluna_texto( res , 5));
local id,Nome,End,Tel,Nasc = sql.coluna_texto(res,1), sql.coluna_texto( res , 2),sql.coluna_texto( res , 3),sql.coluna_texto( res , 4),sql.coluna_texto( res , 5);
ig.listagem_anexe(tab.list,id, ' ' ..Nome..' ',' '..End..' ',' '..Tel,Nasc..' ');
se cont % 2 == 0 entao //se cont for par
local Cor = ig.cor_analise( ig.cinza,'*t' ); //definindo uma cor para letra
ig.listagem_def_cor_fundo( tab.list , cont , Cor );
fim //se i % 2
cont = cont + 1;//contador para enumerar a sequencia da listagem
senao
quebre;
fim
fim
tab.id_atual = nulo;//reseta o valor do id atual para nao ser repetido em outra operação
sql.finalize(res); /**finaliza o objeto sql**/
sql.feche(base);
senao
ig.msg(tab.jan,'Erro', "Falha na execucao: " .. sql.mensagem_erro(base) );
sql.feche(base);
fim
fim
//==================== ALTERAR DADOS =========================== //
funcao alterar(comp,dado)
local cmp = obt_valores_campos(dado);
se algum_campo_vazio(cmp) ou nao dado.id_atual entao
ig.msg(dado.jan,'','Clique em um nome da lista abaixo para alterar');
senao
local str_sql = "UPDATE clientes set Nome = '%s',Endereco = '%s',Tel = '%s',Nasc = '%s' where Id = %s;"
str_sql = string.formate(str_sql,cmp.Nome,cmp.End,cmp.Tel,cmp.Nasc, dado.id_atual); //troca os `%s' pelos valores dos campos
//abrindo o bd
local ret,bd = sql.abra(nomebd);//nomebd está definido no comeco do fonte principal();
se ret <> sql.SQLITE_OK entao
ig.msg(dado.jan,'Erro', sql.mensagem_erro(bd) );
sql.feche(bd);
retorne;
fim
//executando a string sql:
ret = sql.exec(bd, str_sql, funcao()fim);
se ret <> sql.SQLITE_OK entao
ig.msg(dado.jan,'Erro', sql.mensagem_erro(bd) );
sql.feche(bd);
ig.msg(nulo,'', str_sql);
retorne;
senao
ig.msg(dado.jan,'', 'Dados alterados com sucesso!' );
sql.feche(bd);
atualiza_listagem(dado);
limpe_campos(dado);
fim//fim se ret <> sql.
fim//fim se algum_campo_vazio();
fim//fim função
//=================== EXCLUIR:
funcao excluir(comp,dado)
local cmp = obt_valores_campos(dado);
se algum_campo_vazio(cmp) ou nao dado.id_atual entao
ig.msg(dado.jan,'','Clique em um nome da lista abaixo para excluir');
senao
local str_sql = 'DELETE from clientes where Id = %s;'//deleta da tabela Carros onde o Id for igual a 2;
str_sql = string.formate(str_sql, dado.id_atual); //troca os `%s' pelos valores dos campos
//abrindo o bd
local ret,bd = sql.abra(nomebd);//nomebd está definido no comeco do fonte principal();
se ret <> sql.SQLITE_OK entao
ig.msg(dado.jan,'Erro', sql.mensagem_erro(bd) );
sql.feche(bd);
retorne;
fim
//executando a string sql:
ret = sql.exec(bd, str_sql, funcao()fim);
se ret <> sql.SQLITE_OK entao
ig.msg(dado.jan,'Erro', sql.mensagem_erro(bd) );
sql.feche(bd);
ig.msg(nulo,'', str_sql);
retorne;
senao
ig.msg(dado.jan,'', 'Dado excluído com sucesso!' );
sql.feche(bd);
atualiza_listagem(dado);
fim//fim se ret <> sql.
fim//fim se algum_campo_vazio();
limpe_campos(dado);
fim//fim função
funcao limpar_bd(comp,dado)
se sis.remova(nomebd) entao//apaga/deleta o arquivo de dados.
ig.msg(dado.jan,'','Banco de dados excluído com sucesso!');
atualiza_listagem(dado);
fim
fim
imprima(term.versao) //--> lib terminal-1.0.2
term.defTitulo('Mudei o Título');
local term = inclua'terminal'
term.defCorfundo(term.branco);
term.defCorletra(term.preto);
imprima('Cor de fundo branco');
term.defCorletra(term.verde);
imprima('Letra em cor verde');
local term = inclua'terminal';
term.defPadrao();
local term = inclua'terminal';
term.limpeTela();
local term = inclua'terminal';
term.cursorPos(1,2); //posiciona o cursor em 1x2
local term = inclua'terminal';
term.cursorInicio();
local term = inclua'terminal';
alt, larg = term.tamanho();
imprima("Altura:",alt, "Largura:",larg);
leia();
local term = inclua'terminal';
s = term.obtCari(); //obtem a tecla
imprima('-->',car(s));
local term = inclua'terminal';
s = term.obtCar(); //obtem a tecla
imprima('-->',car(s));
local term = inclua'term'
local imprima=imprima;
se sis.nome:procure'win' entao
local win=inclua'win';
//win.poe'dentro';
local conv_c = conv_c;
imprima=funcao(...)
//poe'dentro';
local t = {...};
para i,v em ipares(t) inicio
es.escreva(conv_c(v),'\t');
fim
poe'';
fim
fim
//essa biblioteca devera crescer e conter funcoes para manipulacao em terminal linux
//vou tentar fazer para windows no futuro.
//uma funcao interessante é obter um caractere digitado sem precisar pressionar enter.
//essas funções não surtem efeito no windows, apenas para compatibilidade;
enquanto c <> 's' e c <> 'S' inicio
c = term.leia('digite algo: ');
term.ad_historico(c);//com as teclas seta acima e seta abaixo é possivel pegar os ultimos comandos digitados.
imprima('\nuse seta acima ou abaixo para ver o histórico\n');
imprima('Você digitou:', c);
fim
//teste da biblioteca
inclua'terminal'; //esta biblioteca inclui também a terminal
local imprima=imprima;
se sis.nome:procure('win') entao
local win=inclua'win';
//win.poe'dentro';
local conv_c = conv_c;
imprima=funcao(...)
//poe'dentro';
local t = {...};
para i,v em ipares(t) inicio
es.escreva(conv_c(v),'\t');
fim
poe'';
fim
fim
//poe(conv_c('olá'));
//leia();
term.defCorfundo(term.branco);
term.defCorletra(term.preto);
imprima('Cor de fundo branco');
term.defCorletra(term.verde);
imprima('Letra em cor verde');
term.defCorletra(term.vermelho);
imprima("Letra em cor Vermelha");
term.defPadrao(); //volta a cor padrao
imprima('Cmd voltou ao padrão');
term.cursorPos(1,2); //posiciona o cursor em 1x2
leia(); //pressione enter para sair;
local term = inclua'term';
//a lib term.pris é uma biblioteca feita em prisma com funções para mudar cor do terminal.
//quando ela é incluída, inclui automaticamente a lib terminal.so
//essa biblioteca devera crescer e conter funcoes para manipulacao em terminal linux
//vou tentar fazer para windows no futuro.
//uma funcao interessante é obter um caractere digitado sem precisar pressionar enter.
funcao leia_senha(s,dig)
local dig = dig ou '*';
local tam = #s;
local novalin = 10;
se sis.nome=='win32' entao novalin=13; fim
es.escreva(s);
local senha = '';
enquanto 1 inicio
local x = term.obtcar();//não aparece a letra quando você digita no terminal
//imprima(x);
se (x >= 97 e x <= 122 ) ou (x>=32 e x<=90) entao
//poe'dentro';
senha = senha .. car(x);
tam = #s + #senha;
es.escreva(dig);
senaose x == 127 entao //backspace
senha = string.corte(senha,1,#senha -1);
local ss = string.nconcat(' ',tam);
local sss = string.nconcat(dig,#senha);
es.escreva('\r' .. ss);
es.esvazie();
es.escreva(string.formate("\r%s%s",s,sss));
es.esvazie();
tam = #s + #senha;
senaose x == novalin entao
retorne senha;
fim
fim
fim //fim função
imprima('\n\nSua senha é:', leia_senha("Digite sua senha: ",'*') );
s = [[ [
{
"mac": "58:10:8C:0D:73:07",
"name": "ELCIONE PEREIR",
"lastip": "0.0.0.0",
"associd": 10,
"aprepeater": 0,
"tx": 26.0,
"rx": 78.0,
"signal": -64,
"rssi": 32,
"chainrssi": [ 30 , 27 , 0 ],
"rx_chainmask": 3,
"ccq": 86,
"idle": 0,
"tx_latency": 18,
"uptime": 171272,
"ack": 32,
"distance": 1500,
"txpower": 23,
"noisefloor": -88,
"tx_ratedata":[3654,83042,607651,1477318,510535,348901,507585,264507,0,0],
"airmax": {
"priority": 0,
"quality": 0,
"beam": -1,
"signal": 0,
"capacity": 0
},
"stats": {
"rx_data": 955312,
"rx_bytes": 142819636,
"rx_pps": 55,
"tx_data": 1507368,
"tx_bytes": 1891154263,
"tx_pps": 102
},
"rates": [ "MCS0", "MCS1", "MCS2", "MCS3", "MCS4", "MCS5", "MCS6", "MCS7", "MCS8", "MCS9", "MCS10", "MCS11", "MCS12", "MCS13", "MCS14", "MCS15" ],
"signals": [ -64, -64, -64, -64, -65, -65, 0, 0, 0, 0, 0, 0, -65, -66, -67, -69 ]
},
{
"mac": "58:10:8C:05:19:54",
"name": "ROSELIA LIMA",
"lastip": "0.0.0.0",
"associd": 5,
"aprepeater": 0,
"tx": 117.0,
"rx": 78.0,
"signal": -69,
"rssi": 27,
"chainrssi": [ 24 , 24 , 0 ],
"rx_chainmask": 3,
"ccq": 94,
"idle": 0,
"tx_latency": 20,
"uptime": 874192,
"ack": 28,
"distance": 900,
"txpower": 23,
"noisefloor": -88,
"tx_ratedata":[29,13,59,19297,131642,1165526,8662417,2857366,0,0],
"airmax": {
"priority": 0,
"quality": 0,
"beam": -1,
"signal": 0,
"capacity": 0
},
"stats": {
"rx_data": 16272039,
"rx_bytes": 3282813633,
"rx_pps": 28,
"tx_data": 23553807,
"tx_bytes": 27574610883,
"tx_pps": 100
},
"rates": [ "MCS0", "MCS1", "MCS2", "MCS3", "MCS4", "MCS5", "MCS6", "MCS7", "MCS8", "MCS9", "MCS10", "MCS11", "MCS12", "MCS13", "MCS14", "MCS15" ],
"signals": [ 0, -69, -69, -69, -69, -69, 0, 0, 0, 0, 0, 0, -70, -70, -72, 0 ]
},
{
"mac": "00:27:22:B2:3B:84",
"name": "LEIDE",
"lastip": "192.168.10.1",
"associd": 3,
"aprepeater": 0,
"tx": 65.0,
"rx": 19.500,
"signal": -61,
"rssi": 35,
"chainrssi": [ 20 , 35 , 0 ],
"rx_chainmask": 3,
"ccq": 96,
"idle": 0,
"tx_latency": 5,
"uptime": 874163,
"ack": 30,
"distance": 1200,
"txpower": 23,
"noisefloor": -88,
"tx_ratedata":[0,2,23,394,1047,18092,817019,1673225,0,0],
"airmax": {
"priority": 0,
"quality": 0,
"beam": -1,
"signal": 0,
"capacity": 0
},
"stats": {
"rx_data": 2899294,
"rx_bytes": 459771501,
"rx_pps": 1,
"tx_data": 3831484,
"tx_bytes": 4017321527,
"tx_pps": 0
},
"rates": [ "MCS0", "MCS1", "MCS2", "MCS3", "MCS4", "MCS5", "MCS6", "MCS7" ],
"signals": [ 0, -61, -61, -61, 0, 0, 0, -61 ],
"remote": {
"uptime": 874194,
"hostname": "LEIDE",
"platform": "AirGrid M5 HP",
"version": "XM.ar7240.v6.0.3.30600.170329.1831",
"signal": -50,
"tx_power": 16,
"rssi": 46,
"chainrssi": [ 47 , 0 , 0 ],
"rx_chainmask": 1,
"tx_latency": 2,
"noisefloor": -91,
"distance": 450,
"time": "2017-04-08 21:20:47",
"cpuload": 0,
"totalram": 29508,
"freeram": 9788,
"netrole": "router",
"tx_bytes": 460237568,
"rx_bytes": 4167485529,
"tx_ratedata":[7530,13616,28940,74290,269840,731283,1179656,329248,0,0]
}
},
{
"mac": "58:10:8C:0C:9A:42",
"name": "ANNA CAROLINA",
"lastip": "0.0.0.0",
"associd": 12,
"aprepeater": 0,
"tx": 6.500,
"rx": 26.0,
"signal": -57,
"rssi": 39,
"chainrssi": [ 38 , 31 , 0 ],
"rx_chainmask": 3,
"ccq": 79,
"idle": 0,
"tx_latency": 17,
"uptime": 32131,
"ack": 34,
"distance": 1800,
"txpower": 23,
"noisefloor": -88,
"tx_ratedata":[1327264,460254,267086,217583,118507,196798,482899,169262,0,0],
"airmax": {
"priority": 0,
"quality": 0,
"beam": -1,
"signal": 0,
"capacity": 0
},
"stats": {
"rx_data": 341968,
"rx_bytes": 81551275,
"rx_pps": 68,
"tx_data": 461878,
"tx_bytes": 531390721,
"tx_pps": 106
},
"rates": [ "MCS0", "MCS1", "MCS2", "MCS3", "MCS4", "MCS5", "MCS6", "MCS7", "MCS8", "MCS9", "MCS10", "MCS11", "MCS12", "MCS13", "MCS14", "MCS15" ],
"signals": [ -57, -57, -57, -57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
},
{
"mac": "00:1A:3F:69:75:DD",
"name": "Jorge Cunha",
"lastip": "0.0.0.0",
"associd": 15,
"aprepeater": 0,
"tx": 130.0,
"rx": 39.0,
"signal": -66,
"rssi": 30,
"chainrssi": [ 27 , 26 , 0 ],
"rx_chainmask": 3,
"ccq": 91,
"idle": 0,
"tx_latency": 9,
"uptime": 420645,
"ack": 27,
"distance": 750,
"txpower": 23,
"noisefloor": -88,
"tx_ratedata":[0,0,0,5106,83699,517215,1119450,256071,0,0],
"airmax": {
"priority": 0,
"quality": 0,
"beam": -1,
"signal": 0,
"capacity": 0
},
"stats": {
"rx_data": 2407008,
"rx_bytes": 352079430,
"rx_pps": 2,
"tx_data": 3667035,
"tx_bytes": 4378262254,
"tx_pps": 3
},
"rates": [ "MCS0", "MCS1", "MCS2", "MCS3", "MCS4", "MCS5", "MCS6", "MCS7", "MCS8", "MCS9", "MCS10", "MCS11", "MCS12", "MCS13", "MCS14", "MCS15" ],
"signals": [ -65, -66, -66, -66, -67, -66, 0, 0, 0, 0, 0, 0, -67, -67, -68, -69 ]
},
{
"mac": "24:A4:3C:A6:E4:18",
"name": "Posto Policial",
"lastip": "192.168.10.1",
"associd": 4,
"aprepeater": 0,
"tx": 58.500,
"rx": 19.500,
"signal": -60,
"rssi": 36,
"chainrssi": [ 15 , 36 , 0 ],
"rx_chainmask": 3,
"ccq": 80,
"idle": 0,
"tx_latency": 9,
"uptime": 259832,
"ack": 36,
"distance": 2100,
"txpower": 23,
"noisefloor": -88,
"tx_ratedata":[49401,6961,2256,2590,4129,11790,35030,74925,0,0],
"airmax": {
"priority": 0,
"quality": 0,
"beam": -1,
"signal": 0,
"capacity": 0
},
"stats": {
"rx_data": 193407,
"rx_bytes": 31274300,
"rx_pps": 2,
"tx_data": 185872,
"tx_bytes": 32258333,
"tx_pps": 1
},
"rates": [ "MCS0", "MCS1", "MCS2", "MCS3", "MCS4", "MCS5", "MCS6", "MCS7" ],
"signals": [ 0, 0, -60, -59, 0, -61, -63, -64 ],
"remote": {
"uptime": 543018,
"hostname": "Posto Policial",
"platform": "AirGrid M5 HP",
"version": "XM.ar7240.v6.0.4.30805.170505.1525",
"signal": -59,
"tx_power": 23,
"rssi": 37,
"chainrssi": [ 38 , 0 , 0 ],
"rx_chainmask": 1,
"tx_latency": 3,
"noisefloor": -88,
"distance": 1200,
"time": "2017-05-11 22:15:11",
"cpuload": 1,
"totalram": 29508,
"freeram": 10508,
"netrole": "router",
"tx_bytes": 63926545,
"rx_bytes": 125557017,
"tx_ratedata":[6367,7871,10452,14094,18493,27038,41603,67703,0,0]
}
},
{
"mac": "00:1A:3F:D0:4F:62",
"name": "Isaias Fernand",
"lastip": "0.0.0.0",
"associd": 17,
"aprepeater": 0,
"tx": 65.0,
"rx": 52.0,
"signal": -65,
"rssi": 31,
"chainrssi": [ 20 , 31 , 0 ],
"rx_chainmask": 3,
"ccq": 92,
"idle": 0,
"tx_latency": 15,
"uptime": 253064,
"ack": 26,
"distance": 600,
"txpower": 23,
"noisefloor": -88,
"tx_ratedata":[2,31,1187,7228,70392,522788,985949,113147,0,0],
"airmax": {
"priority": 0,
"quality": 0,
"beam": -1,
"signal": 0,
"capacity": 0
},
"stats": {
"rx_data": 2105908,
"rx_bytes": 258755944,
"rx_pps": 1,
"tx_data": 3210887,
"tx_bytes": 4017773431,
"tx_pps": 2
},
"rates": [ "MCS0", "MCS1", "MCS2", "MCS3", "MCS4", "MCS5", "MCS6", "MCS7" ],
"signals": [ -66, -66, -65, -66, -68, -68, -69, -71 ]
}
]
]]
local json = inclua'json'
tab, err = json.decod(s);
se nao tab entao erro(err) fim;
para r,f em pares(tab) inicio
imprima(r,tab[r].mac,tab[r].name,tab[r].signal,tab[r].stats.tx_bytes)
MAC = tab[r].mac
Nome = tab[r].name
Sinal = tab[r].signal
Qualidade = tab[r].ccq
Latencia = tab[r].tx_latency
TXMbps = tab[r].tx
RXMbps = tab[r].rx
TXBytes = tab[r].stats.tx_bytes
RXBytes = tab[r].stats.rx_bytes
TempoLigado = tab[r].uptime
fim
[root@aurora ~]# ./teste.prisma
./teste.prisma: line 1: s: comando não encontrado
./teste.prisma: line 816: erro de sintaxe próximo do `token' não esperado `]]'
./teste.prisma: line 816: `]]'
[root@aurora ~]# ./teste.prisma
./teste.prisma: line 1: s: comando não encontrado
./teste.prisma: line 816: erro de sintaxe próximo do `token' não esperado `]]'
./teste.prisma: line 816: `]]'
/usr/local/bin/prisma: /usr/local/share/prisma/1.0/plib/json.pris:29: argumento incorreto #3 to 'separe' (espera-se numero, ao inves de string)
Rastro da pilha:
[C]: em funcao 'separe'
/usr/local/share/prisma/1.0/plib/json.pris:29: em funcao 'skip_delim'
/usr/local/share/prisma/1.0/plib/json.pris:118: em funcao 'decod'
/usr/local/share/prisma/1.0/plib/json.pris:124: em funcao 'decod'
./teste.prisma:278: em trecho principal
[C]: em ?