#include "Elmu.h"

/* ========================================== **
**                                            **
** Elmu.c                                     **
**                                            **
** Auteur : Stephane Caron                    **
** Date :   Decembre 2005                     **
** Projet : PPE - ELMU                        **
**                                            **
**   Fichier principal du code source, il de- **
** crit le squelette  de  l'application ainsi **
** que les fonctions de gestion  generales et **
** la boucle principale.                      **
**                                            **
** ========================================== */

// Variables globales
char _sig_update;
char _screen;
char volume;
char unit;

// Inclusions internes
#include "ElmuKbd.c"
#include "ElmuLcd.c"
#include "ElmuUsr.c"

// ElmuPICStart
// 
// Initialiser le PIC16F877.
// 
void ElmuPICStart()
{
    // On règle ici les différentes paramètres
    // de fonctionnement du PIC. Cf. documentation
    // constructeur pour plus de précisions
    
    adcon1 = 0x07;
    option_reg = 0xC0;    	
    set_bit(STATUS, RP0);
    trisa = trisa | 0xff;
    trisb = trisb & 0xC0;
    clear_bit(STATUS, RP0);
    delay_ms(2);
    
    // Enfin, on initialise les données globales
    // avec les données par défaut (écran principal,
    // pas de volume entré par l'utilisateur...)
    
    _sig_update = 1;
    _screen = SCREEN_MAIN;
    volume = 0;
    unit = 3;
}

// ElmuParseState
//
// Mettre a jour les grandeurs internes.
//
void ElmuParseState()
{
    // Mieux vaut maintenir un volume positif.
    // Dans cette fonction, on s'assure que :
    //  0 <= volume < 100
    
    if (volume < 0)
        volume = 0;

    switch (_screen) {
        case SCREEN_VOLUME:
            volume = (volume % 100);
            break;

        // C'est ici que sont mises à jour les données internes
        // concernant le volume mesuré suivant une formule déter-
        // minée par une étude de mécanique des fluides.
        
        case SCREEN_TIMER:
            volume = (volume - 12524 / 36000 * PHYS_DIAM * PHYS_DIAM * / CLOCK_FREQ);
            _sig_update = 1;
            if (volume <= 0)
                ElmuShiftScreen(SCREEN_MAIN);
            break;
        
        default:
            break;
    }
}

// main
// 
// Point d'entrée du flux d'execution.
// 
void main()
{
    // On commence par initialiser les différents
    // composants utiles au PIC.
    
    ElmuPICStart();
    ElmuLCDStart();

    // Après quoi on considère la boucle de fonctionnement
    // principale avec mise à jour des boutons, de l'état
    // du système et de l'affichage utilisateur.
    
    while (1) {
        ElmuParsePush();
        ElmuParseState();
        ElmuDrawLCD();
    }
}
