Repository navigation
Home
Esta aplicação foi desenvolvida no âmbito da unidade curricular de Sistemas Embutidos lecionada na Faculdade de Ciências da Universidade do Porto.
A aplicação móvel foi desenvolvida usando o IDE Android Studio com a linguagem de programação Java e a linguagem de marcação XML (markup language). O principal objetivo da aplicação é a comunicação com o sistema e por isso é necessário o envio e receção de dados e da sua visualização. Foi usada a linguagem de marcação XML para desenvolver uma simples interface gráfica capaz de mostrar ao utilizador informação como a dose diária escolhida, a quantidade de comida despejada, as taças associadas e os seus nomes e a última hora em que alimentou o animal. Toda esta informação é obtida através de pedidos GET ao servidor Cloud usando a biblioteca OkHttp. A linguagem de programação Java foi usada para fazer a interface gráfica da aplicação funcional, isto é, é usada para o backend da aplicação e responsável pela navegação, pela validação de inputs, e pelos pedidos GET e POST usados.
O backend está divido em 5 ficheiros cada um responsável por cada página da aplicação.
A classe MainActivity é responsável pela autenticação do utilizador na aplicação. Para um utilizador se registar na aplicação, é usada a classe RegisterActivity. Para a autenticação e registo, foi criado um projeto no Firebase (ferramenta disponibilizada pela Google) que facilita esse processo.
A classe UserActivity é responsável por mostrar ao utilizador as taças que este adicionou e permitir que o utilizador adicione novas taças caso estas estejam disponíveis. Uma taça disponível significa que existe um arduíno (cada arduíno é responsável por uma taça) que não tem nenhum nome associado (o nome atribuído à taça é usado como ID dessa taça). Nesta página o utilizador também poderá observar a dose diária e a quantidade de comida despejada para cada taça.
A classe FeedingActivity é a página principal deste projeto. É através desta página que decorre o processo de alimentação do animal. Nesta página é possivel observar a quantidade de comida despejada, a dose diária (com a opção de poder editar este valor) e a última vez que o animal foi alimentado. Caso a quantidade de comida despejada seja igual ou superior a 75% da dose diária, será possível visualizar um aviso. É também disponibilizada a opcção de tarar a taça caso o utilizador escolha alterar a taça física podendo esta ter um peso diferente do inicial. A principal interação do utilizador com esta página será com o botão que permite ao sistema disponibilizar a comida ao animal. Para realizar esta ação são percorridos os seguintes passos: deteção de quando o utilizador começa a carregar no botão (é enviado um pedido POST para informar o sistema que o motor deve ligar), deteção do botão a ser premido (enquanto o botão é premido, são feitos pedidos GET para obter o peso da comida despejada e esse valor é atualizado na UI; são também feitos pedidos POST para atualizar a hora que o utilizador alimentou o animal), deteção de quando o utilizador liberta o botão (é enviado um pedido POST que informa o sistema que a ação de alimentação terminou e para desligar o motor).
A classe ServerRequests é responsável pela comunicação entre a aplicação e servidor. Esta classe faz os seguintes pedidos:
- getBowlsList : retorna a lista de taças de um utilizador
- getFoodAmount : dada uma tijela, retorna o valor de comida que já foi despejada e está guardado na base de dados
- getDailyGoal : retorna o valor da dose diária escolhida pelo utilizador
- getLastFeedingTime : retorna a hora da última alimentação do animal
- getFoodPoured : retorna o valor do peso da comida que está a ser despejada quando utilizador está a carregar no botão de alimentar o animal
- getUndefinedBowlsCount : retorna o número de arduinos livres, ou seja, o número de taças que estão disponíveis para o utilizador utilizar
- postAddBowl : adiciona uma taça à base de dados
- postDailyGoal : atualiza o valor de dose diária desejada
- postLastFeedingTime : atualiza a hora da última alimentação do animal enquanto o botão de alimentar está a ser pressionado
- changeMotorState : muda o estado do motor para "on" ou "off" dependendo do movimento do clique no botão de alimentar o animal (quando o utilizador começa a pressionar o botão e quando o utilizador remove o dedo)
- resetBowl : tara o peso da taça
Para correr a aplicação basta ter o IDE Android Studio instalado e certificar que todos os servidores dos restantes componentes do sistema estão ativos e a correr sem problemas. É necessário também certificar que existe algum emulador Android instalado no IDE capaz de demonstrar a aplicação ou estar ligado um telemóvel físico Android através de USB Debugging ou Wireless Debugging. A ação de correr a aplicação através do IDE, é apenas carregar no botão Run. Para além desta forma de correr a aplicação, foi também desenvolvida uma GitHub Action que constroi uma apk que pode ser transferida para o telemóvel Android e correr sem estar dependente do IDE.