|
|
O CPDigiFirmware é um projeto que faz parte do grupo [CosmicPampa](https://git.cta.if.ufrgs.br/CosmicPampa) e lida com a parte da implementação do firmware do [CPDigi](https://git.cta.if.ufrgs.br/CosmicPampa/cpdigi). Através de seu código, o hardware deverá ser capaz de realizar a detecção de múons e enviar uma série de dados anexos a um servidor web, onde serão armazenados num banco de dados.
|
|
|
|
|
|
A página pode estar um pouco vazia agora, mas é porque ainda estamos no início do desenvolvimento do projeto e iremos documentar aqui (e nos Issues!) conforme formos desenvolvendo-o. Algumas partes do projeto se encontram documentadas [no antigo site do CTA](http://cta.if.ufrgs.br/projects/detector-de-raios-cosmicos/wiki) e toda a nossa documentação aqui no git é feita a partir do que já se encontra nele.
|
|
|
A página pode estar um pouco vazia agora, mas é porque ainda estamos no início do desenvolvimento do projeto e iremos documentar aqui (e nos [Issues](https://git.cta.if.ufrgs.br/CosmicPampa/cpdigifirmware/issues)!) conforme formos desenvolvendo-o. Algumas partes do projeto se encontram documentadas [no antigo site do CTA](http://cta.if.ufrgs.br/projects/detector-de-raios-cosmicos/wiki) e toda a nossa documentação aqui no git é feita a partir do que já se encontra nele.
|
|
|
|
|
|
## Estruturação da lógica do código
|
|
|
|
|
|
### Loop:
|
|
|
|
|
|
A estrutura básica por trás do *void loop* se encontra representado no fluxograma abaixo:
|
|
|
|
|
|
![](https://i.imgur.com/7NgWOR0.png)
|
|
|
|
|
|
Ele foi feito usando o [dia diagram editor](http://dia-installer.de/).
|
|
|
|
|
|
Ele é uma representação genérica, modular e macro daquilo que se espera e de como se imagina o *loop* do firmware.
|
|
|
|
|
|
A primeira ilha checa se foi ou não levantado um flag de evento. Este flag é definido dentro do interrupt ativado pelo CPAmp. Um pino de trigger faz o alerta ao NodeMCU que ele deve executar um interrupt quando o CPAmp detecta sinal na PMT. Neste interrupt, mede-se o valor do sinal da PMT através do conversor analógico-digital, obtêm-se o tempo exato da ocorrência do evento e então levanta-se o flag de evento, sinalizando que temos a ocorrência da detecção de um múon. A medição do sinal e do tempo é feita dentro do interrupt pois estas duas informações são de importância crítica. Como a chegada do múon e o efeito Cherenkov são muito rápidos, qualquer delay no momento de medição do sinal ou do tempo exato da ocorrência do evento podem acarretar em percas de informações preciosas.
|
|
|
|
|
|
Quando este flag for verdadeiro, deveremos dar início ao processamento deste evento. Para isso, iremos construir uma string na qual deverá constar os seguintes dados:
|
|
|
* Valor do sinal medido na PMT
|
|
|
* Tempo de ocorrência
|
|
|
* Temperatura
|
|
|
* Umidade
|
|
|
* Localização espacial
|
|
|
|
|
|
Estes três últimos dados serão variáveis globais que atualizaremos periodicamente. Como há uma variação muito menor destes dados no tempo, optamos por medi-los eles com menos frequência, evitando o desperdício de processamento.
|
|
|
|
|
|
A criação da string será feito então com o método *build_data_string()* (vide [a lista de métodos](https://git.cta.if.ufrgs.br/CosmicPampa/cpdigifirmware/wikis/metodos) ). Ela irá nos retornar esta string única com os dados que necessitaremos. Então, através do método *queue_data()* iremos enviar essa string para uma lista de espera. Ela é um ponto intermediário entre a detecção do evento e seu envio para o server. Essa lista será processada ao final do *loop*, como veremos. Também usaremos então o método *store_data()* para realizar o armazenamento da string dentro do cartão SD.
|
|
|
|
|
|
Depois disto, há a checagem dos timers dos sensores. Neste ponto, caso o flag de evento fosse falso, teríamos pulado diretamente para esta parte. Aqui, checamos se o tempo que se passou entre a última checagem dos sensores já é suficiente para atualizarmos seus valores. Caso sim, ocorre a leitura de seus valores e seu armazenamento em variáveis globais. Caso não, passamos à próxima ilha.
|
|
|
|
|
|
Finalmente, temos novamente uma checagem de timers, mas desta vez para o processamento da fila. Aqui, caso o tempo desde a última checagem seja suficiente, iremos executar uma rotina de tentativa de envio dos dados da fila ao servidor. Caso haja algum erro, eles permanecem armazenados e será tentada novamente o envio no próximo ciclo do loop. Caso o envio seja feito, eles são removidos da lista.
|
|
|
|
|
|
A estruturação até o momento é bastante genérica e expeculativa, e isto se deve ao fato de estamos ainda em fase de planejamento do código. Assim que termos definido de forma clara as funções que seram necessárias e sua respectiva estruturação em headers, se dará ínicio à escrita de pseudocódigo, o que trará um entendimento mais concreto ao futuro funcionamento do algoritmo em si.
|
|
|
|
|
|
[Página para lista com todos os métodos utilizados dentro do código](metodos). |
|
|
\ No newline at end of file |