Monitor de bateria em Prisma (Linux)

Iniciado por adalberto, Dezembro 20, 2017, 07:00:49 PM

tópico anterior - próximo tópico

adalberto



Uma boa função em Prisma é a es.pabra() que chama um programa externo capturando sua saída. Aproveitando isso criei um simples script que monitora a bateria, mostrando uma mensagem quando estiver descarregando.

Segue o código para análise, bons estudos.


/*
  * Monitor de bateria simples em Prisma usando es.pabra() com o programa upower (linux);
  * e xmessage para a mensagem.
  */
//Sem licença (use como bem entender - o autor não será responsabilizado!)

//2017 - 12 Adalberto Amorim Felipe

// linguagemprisma@gmail.com

//Biblioteca para permitir o uso de acentos e alguns caracteres especiais no cmd e gui do windows.
//Não converte todos os tipos de utf8, basico pt-br
//estou criando em C uma biblioteca mais completa para esta funcionalidade.

//ATENÇÃO este arquivo deverá ser salvo no formato utf8

funcao parse(s)
  local tmp;
  a = s:analise('\n');
  local info = {};
  para i,v em pares(a) inicio
    se v <> '\n' entao
      tmp = v:analise(':');
      se tipo(tmp)=='tabela' entao
        se tmp[1] e tmp[3] entao
          info[tmp[1]:apare()] = tmp[3]:apare();
        fim
      fim
    fim
  // -- imprima(i,v);
  fim
  retorne info;
fim//fim funcao

local term  = inclua'terminal';

local funcao mensagem(titulo,txt, ...)
   local botoes = {...};
   local bts = '';
   para i,v em ipares(botoes) inicio
     bts = bts .. '"' .. v .. '",'
   fim
   bts = bts:corte(1,-2);
   local cmd = 'xmessage -title ' .. titulo .. ' "' .. txt .. '"  -center -buttons ' .. bts .. ' "$@" "" ;'
  // imprima(cmd);
   local ret,_,num = sis.execute(cmd);
   
   se num entao retorne convnumero(num); senao retorne falso; fim
fim

local cmd = 'upower -i /org/freedesktop/UPower/devices/battery_BAT0';
local a;

local cont = 1;
local info;
enquanto 1 inicio
  term.defCorletra(term.verde);
  a, err = es.pabra(cmd);
  se a entao
    info = a:leia'*t';
    a:feche();
    info = parse(info);
    se info.present == 'yes' entao info.present = verdadeiro;
    senao
      info.present = falso;
    fim
   
    imprima('bateria presente?',info.present);
    se info.state == 'charging' entao info.state = 'carregando';
    senaose info.state=='discharging' entao info.state='descarregando';
    fim
   
    imprima('Estado:', (info.state:troque('charging','carregando')));
    imprima('Porcentagem:',info.percentage);
   
    local perc = convnumero(info.percentage:corte(1,info.percentage:procure('%%') -1 ));
   // imprima(perc);   
    se perc < 30 e info.state == 'descarregando' entao
      local aviso = string.formate('Bateria em estado critico, conecte o carregador agora!\n\ndescarregando: %0.2f%%',perc);
      imprima('Aviso::',aviso);
      mensagem("Aviso", aviso, '       ok       ');
   
    fim
  senao
    imprima('Erro', err);
  fim
  sis.durma(1000);
  //term.limpeTela();
  term.cursorInicio();
  local alt,larg = term.tamanho();
  para i = 1,alt inicio
    es.escreva((' '):nconcat(larg));
  fim
  term.cursorInicio();
  imprima('------['..cont..']------');
  cont=cont+1;
fim
term.defPadrao();




Por enquanto é isso, até mais!