A ideia do projeto é construir um reprodutor de vídeos, que ao final de cada execução, exiba um questionário para reforçar o aprendizado.
Esse projeto têm como objetivo auxiliar as crianças que possuem diabete, para que entendam e aprendam sobre a condição e como podem cuidar de sua saúde.
De uma forma mais técnica, o projeto envolve não só código, mas também desafios de hardware, já que a máquina que será utilizada terá poucos recursos de execução. Mais precisamente: um processador Celeron D331 que possui um núcleo físico de 2.66GHz dos anos 2000 com barramento de 533MHz, 3GB de memória DDR2, com a possibilidade de no máximo 1GB de expansão. Carinhosamente, a chamarei de "Dino" para ficar mais fácil.
Pessoalmente, será um grande desafio, já que estou no início da programação, e conciliar o projeto com a grade da faculdade não será nada fácil.
Para esta difícil tarefa, irei utilizar a linguagem C++ e a biblioteca Qt5 (versão 5.15) (no momento existe a 6, mas utiliza-lá ocasionaria outros problemas). A IDE utilizada será o QtCreator, que é responsável por compilar o código, além disso, nele é muito mais fácil criar as interfaces gráficas, já que possui o sistema Drag and Drop.
Para consultas futuras, aqui estão as documentações de cada classe utilizada:
(Em geral)
(Em main.cpp)
(Em arquivos.h/cpp)
- QFileDialog
- QFileInfo
- QFile
- QTextStream
- QDateTime
- QJsonDocument
- QJsonParseError
- QJsonArray
- QByteArray
- QJsonObject
(Em mainwindow.h/cpp)
- QListWidget
- QListWidgetItem
- QList
- QRadioButton
- QPushButton
- QTextEdit
- QEvent
- QTimer
- QObject
- QVBoxLayout
(Em reprodutor.h/cpp)
(Em senha.h/cpp)
(Em sequencia.h/cpp)
(Em somambiente.h/cpp)
(Em video.h/cpp)
Existem várias bibliotecas para a reprodução de vídeo em Qt. Abaixo, algumas testadas e seus resultados:
- QVideo: Não foi possível alterar a dimensão do reprodutor;
- QVideoWidget: Altera a dimensão do vídeo, porém, abrindo outra janela.
- QGraphicsVideoItem: É possível alterar a dimensão do vídeo, e colocá-lo em um widget, sem a necessidade de abrir outra janela para reproduzir o vídeo. Apesar desses benefícios, o vídeo reproduz travando um pouco (quase imperceptível).
Outras classes possíveis (mas que não foram testadas):
- Qtav;
- QVideoFrame;
- QVideoSink (Qt6);
- VLC Qt;
Como utilizo Windows no dia-a-dia, preciso de uma ferramenta para virtualizar o sistema Linux para compilar o código e testá-lo. Para isso, utilizarei o VM Virtual Box e nele virtualizo o Linux Mint XFCE versão 21.2 (Victoria) (64bits). Utilizando 2 GB de RAM da máquina hospedeira e 1 núcleo de 1.80GHz do AMD Ryzen 7 5700U with Radeon Graphics.
Cogitei utilizar Docker, mas creio que seria muito para a máquina Dino, além de não ser muito viável para o usuário replicar o programa em outra máquina (creio eu).
Assim como uma casa, um software também precisa de uma planta que foi planejada para poder ser estruturado de forma segura. E para fazer algumas partes do processo, utilizei:
- Prototipagem de telas: Figma;
- Diagrama de caso de uso: Lucidchart;
Estrutura do armazenamento do software na máquina:
projeto{
assets{
somAmbiente.wav
...
}
backups{
paciente{
videos.mp4
...
}
profissional{
videos.mp4
...
}
responsavel{
videos.mp4
...
}
}
configuracoes{
sequenciaPaciente.json
sequenciaProfissional.json
sequenciaResponsavel.json
respostasPaciente.json
respostasProfissional.json
respostasResponsavel.json
}
.executavel
config.json
}
Onde projeto é a pasta da aplicação do Gamellito, e dentro dela contém todos os arquivos necessários para o funcionamento da aplicação.
A pasta assets contém sons, ícones e fotos da aplicação.
backups trata-se da pasta que armazena os vídeos que foram salvos para as sequências. Dentro desta pasta, possui uma pasta separada para cada perfil.
configuracoes é a pasta que armazena os arquivos .json de cada perfil, incluindo a sequência de cada perfil e as respostas coletadas em perguntas.
.executavel é o arquivo executável do programa.
config.json é o arquivo de configurações gerais, que armazena algumas informações do programa, como: Número de reproduções das sequências, número de vezes que o programa foi aberto, a última vez que o programa foi aberto, a senha do administrador e a última vez que um relatório foi gerado.
-
Sons públicos:
-
Ícones/imagens públicas:
Menu:
Geral:
Configurar:
Reprodutor:
Perfil:
-
Fontes:
-
Estrutura:
/assets
/botoes
/configuracoes
/menu
/fontes
/aplicacao
/configuracoes
/informacoes
/iniciar-menu
/lapis
/lixeira
/opcao
/pagina-inicial
/perfil
/pergunta
/proximo
/reprodutor
/sair
/salvar
/seta
/som
/video
/voltar
/icones
/imagens
/logos
/sons
/videos
As sequências dos perfis são representadas por arquivos .json, e dentro deles, estão estruturados objetos Json para representar um item. Os itens são representados da seguinte maneira:
- Para o
vídeo:
{
"id": numero;
"tipo":"video";
"caminho":"caminho/do/video"
}
- Para a
pergunta:
{
"id": numero;
"tipo":"pergunta";
"pergunta":"texto";
"opcao1":"texto";
"opcao2":"texto";
"opcao3":"texto";
"opcao4":"texto";
"correta":0-4;
}
Para compilar o código para outra máquina, é necessário ter instalado algumas bibliotecas:
qtbase5-dev
cmake
build-essential
No Linux, é possível instalar via apt.
Após instala-las, copie os arquivos de um projeto (.h .cpp ui e cmake) para a sua máquina (não esqueça da pasta de assets). Depois, na pasta do projeto, abra o terminal e utilize o Cmake para criar o Makefile:
cmake .
Depois disso, um arquivo Makefile será criado, então, é só executá-lo para gerar o executável do programa:
make
Assim, seu executável está pronto!
Por enquanto, a máquina foi desbloqueada para utilizar sistemas operacionais. Procuro por sistemas Linux que são leves o suficientes para a máquina Dino.
Sistemas testados até o momento (na máquina Dino):
- Linux Mint XFCE versão Vera (64 bits) => O sistema é pesado para a máquina. Vídeos em HD rodam até bem, mas em fullHD não tem um bom desempenho.
- Lubuntu 22.04 (64bits) => Sistema leve, rodou tranquilamente os testes e vídeos. A inicialização é um pouco lenta, mas geralmente utiliza menos CPU que o Q4OS.
- Q4OS (64bits) => Sistema leve, rodou tranquilamente os testes e vídeos. Utiliza menos memória RAM que o Lubuntu.
Testar outros Linux mais leves. OBS: Pode ser que haja incompatiblidade de bibliotecas
- Bodhi Linux
- Xubuntu
- Puppy Linux
- AntiX
- Debian
- Zorin OS Lite
- MX Linux
- Peppermint
Irei guardar cada teste para caso precise testar em um novo sistema operacional, e assim eu posso comparar cada resultado. Por enquanto, temos:
- Roadmap -> Um exemplo simples de tela inicial, com redimensionamento e botões que levam a novas janelas. Tamanho mínimo da tela: 960x540.
- PaginasDinamicas -> Apesar do nome, é um exemplo simples de aplicação que possui elementos estáticos, sem responsividade, mas que navega entre widgets dentro de uma StackedWidgets, sem a necessidade de criar uma nova janela para alterar o conteúdo.
- Menus -> Um esboço de como imagino a aplicação (com exceção do reprodutor de vídeo), ainda sem as telas dinâmicamente alocadas. Este exemplo possui a navegação entre as telas (em StackedWidgets) e som ambiente no menu. A aplicação é ajustada conforme o tamanho do monitor e sem a barra de título da janela. Tamanho mínimo da tela: 800x600 (SVGA).
- ReprodutorMenu -> Essa versão é um leve aprimoramento do "Menus". Armazena uma sequência de vídeos escolhidos em um arquivo JSON e reproduz um vídeo (fixo) após clicado o botão "iniciar". Foram testados vídeos em FullHD e HD.
- Modulados -> Versão (quase) final do projeto, com sequências de vídeos e perguntas armazenadas e manipuladas. Troca de perfis já pré definidos.
- Gamellito -> Versão final do projeto com assets corretos e correção de bugs.
- Compile o arquivo na máquina desejada
- Guarde o executável gerado
- Para replicar em uma máquina semelhante à máquina alvo da compilação, copie o executável e a pasta de Assets dentro de uma pasta chamada "Gamellito" e no mesmo diretório, copie os arquivos executáveis de instalação. Transfira tudo isso para a nova máquina
- Mude o arquivo install_gamellito.sh para executável e rode no terminal, ele é responsável pela instalação do projeto na máquina, as bibliotecas do Qt e os arquivos de inicialização
- Adicionar vídeo no menu
- Trocar imagens png por svg
- Adicionar uma confirmação para sair do programa
- Adicionar o ícone da aplicação corretamente. No momento o ícone aparece apenas na notificação
- Adicionar corretamente a fonte do programa
- Separar as telas em classes diferentes e tentar adicionar as páginas na Stack Widgets de forma dinâmica, atribuindo um nome a cada uma delas. Dessa forma, caso uma página seja trocada de lugar na edição, não afete outras partes do código
- Adicionar recurso para recuperação de senha