Manual

do

Maker

.

com

Migração de código do MicroPython para Sming

Migração de código do MicroPython para Sming

É, caros leitores. Fico triste em informar, mas o MicroPython no ElectroDragon deu continuamente bugs no sistema de arquivos, tendo-o corrompido periodicamente. Não posso afirmar que o problema seja diretamente relacionado com o firmware, mas talvez do firmware relacionado com o ESP12E. Enfim, tenho um NodeMCU mini rodando 24x7 e funcional. Do mesmo modo, o ElectroDragon rodando Sming já há mais de 48 horas. Como eu já tinha um projeto quase finalizado e tive esse problema, estou confiante na migração para C++ e, vejam só, é excelente, mas é necessário conhecer o framework para implementar muitos dos recursos. Vou dando as dicas.

Esse artigo é de abril de 2017. Obviamente houve evolução em todas as plataformas, portanto não considere a condição frágil de outrora como atual. Todavia, a migração para C++ é completamente válida.

#include

Não. Não inclua essa lib porque o firmware não compilará. Muitas funcionalidades estão implementadas diretamente na SmingCore.h e consultar os recursos da lib é bastante simples se você estiver utilizando o NetBeans.

Que recursos nativos estão disponíveis?

Claro que existe a possibilidade de fazer includes e ocasionalmente será necessário, mas para saber o que está disponível nativamente sem consulta online, basta você digitar uma letra qualquer e usar a combinação Ctrl+Space. Isso abrirá um menu com todos os recursos iniciados com a letra escolhida. E você pode fazê-lo com o alfabeto inteiro, se tiver paciência para isso.

Como fazer delay no Sming

Eu nem me dei ao trabalho de consultar como funcionam, mas nativamente você tem 3 tipos de delay disponíveis como função; a delayMiliseconds(ms), delay(t) e delayMicroseconds. Porém eu prefiro escrever uma função de delay por causa do risco de paralizar as tarefas de background relacionadas ao WiFi, o que pode inclusive causar um reset por WDT (Watch Dog Timer). Para isso, escrevo uma função assim:

void sleep(unsigned long interval_ms){
    unsigned long initial_time = millis();
    unsigned long delta        = millis()-initial_time;
    
    while (delta < interval_ms){
        delta = millis()-initial_time;
        delayMilliseconds(1); //apenas para a CPU 'respirar'
    }
}

Criação de arquivos

Essa é matadora. O Sming tem uma função que simplifica o modo de escrita em um arquivo, desse jeito:

fileSetContent(nome_arquivo,var_conteudo);

Mas se for pelo modo convencional, também tem suas peculiariedades. Algo como:

file_t variavel = fileOpen(nome_arquivo, FLAGS);

O objeto do arquivo é do tipo file_t e as flags pode ser observadas como citado anteriormente; comece digitando 'eFO' e use a combinação Ctrl+Space para ver as opções. Eu criei uma função de log, deixando o a função assim:

void logEvent(String msg){
    fileSetContent(LOG_FILE,msg);
    char data[5] = "";
    
    file_t fileObj = fileOpen(LOG_FILE, eFO_Append | eFO_CreateIfNotExist);
    int chk = fileRead(fileObj,&data,1);
    if (chk > -1){
        Serial.println("Arquivo yevesta.log criado com sucesso");
        Serial.println("Reiniciando agora...");
        sleep(300);
        System.restart();
    }
}

Não testei ainda se o append cria o arquivo caso não exista, mas a flag 'eFO_CreateIfNoExist' tem esse propósito.

Reiniciar o ESP8266

Parece um comportamento meio Windows, mas acontece que o programa pode falhar em alguma função. Esse problema se apresentou quando rodando o programa no MicroPython e para retornar à normalidade, se fazia necessário um reset. Como você pode ver na função acima, o reset está na classe System, no método restart. Portanto:

System.restart()

Como saber o que uma classe oferece de recursos?

A combinação Ctrl+LeftClick abre a classe de um include em uma nova aba. O mesmo para qualquer função ou método que você utilizar essa combinação, indo direto para a referência, no segundo caso. Faça um teste utilizando essa combinação sobre o SmingCore.h. Você verá que tudo que está contido nela são includes de recursos do sistema, cujo recursos podem ser comentados para desabilitá-los no firmware, ou ainda, novos recursos escritos por você podem ser adicionados aí.

Listar arquivos

É possível receber entrada do usuário também, assim como no Arduino. Apesar de não ter ainda adicionado essa funcionalidade, já deixei pronto um recurso que utilizava muito no console do MicroPython, que é a listagem de arquivos contida no sistema de arquivos. Provavelmente vou consultar a listagem de arquivos via MQTT.

A listagem de arquivos retorna um vetor de strings, depois é necessário iterar nessa 'lista':

void listDir(){
    Vector<String> files = fileList();
    Serial.println("Listando arquivos:");
    for (int i=0; i<files.count(); i++){
        Serial.println(files.get(i));
    }
}

Código da migração

No próximo artigo, disponibilizarei no git do parceiro Ye Vesta Home Brewing, nesse link o código de migração do controle de temperatura para um kegerator. Estou fazendo justamente a migração, mas algumas coisas em Python são bem diferentes em C++, por isso uma certa variação no comportamento poderá ser notada.

Nem setup(){} nem loop(){}

No Sming não se utiliza as funções setup() e loop(), mas sim init(). Dentro de init fica a seu critério manter o código em um loop ou finalizar sua execução ao término de uma rotina.

Talvez você tenha reparado a chamade de Serial.println, compatível com Arduino propositalmente. Mas do mesmo modo, é necessário também inicializar a serial, e isso é feito em init():

void init(){
    Serial.begin(115200);
    spiffs_mount();
    ...
    MqttClient mqtt(MQTT_BROKER,MQTT_PORT,onMessageReceived);
    
}

Documentação oficial

Não encontrei tudo o que precisava lá, uma parte tive que pesquisar dentro das bibliotecas, outras, pesquisando no Google. Mas a grande maioria está disponível nesse link, onde você encontra a documentação feita com Doxygen.

Logo mais termino o código de migração (já atrasado) e conforme avançar o kegerator, vou escrevendo novos artigos.

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.