// UTS 2000 - Fichier 'ir.cpp' Gestion d'une télécommande InfraRouge.
// V3.3 - Le 03/01/2010
// Permet de commander à distance les aiguillages et les trains.
/*****************************************************************************/
/* debut TRAIN                                                               */
/*****************************************************************************/
#include  <windows.h>
#include  <string.h>
#include  <stdlib.h>
#include  <stdio.h>
#include "Train_UTS.h"

#define _CRT_SECURE_NO_WARNINGS  // Limite les messages de warning dans Visual C++

// Déclaration des fonctions externes
extern int can_to_cons(int, int);
extern void EasyTextOut(int, int, char*);
extern void EasyLine(int, int, int, int);

// Déclaration des variables externes
extern HBRUSH  bmp_pinceau_blanc, bmp_pinceau_gris;
extern HDC hMemDC;
extern HFONT     bmp_fonte;
extern HPEN      bmp_stylo_noir, bmp_stylo_gris192, bmp_stylo_blanc;
extern int vio_garage_lock_cmd[NB_GARAGE]; // 0 ou 1, 1 => Demande d'isolation du garage (Sera réalisée si il a un train sur le canton).
extern int vio_garage_lock_status[NB_GARAGE]; // 0 ou 1, 1 => Le garage est isolé du canton (état réel).
extern int vio_garage_lock_res[NB_GARAGE]; // 0 ou 1, 1 => Garage réservé.
extern int vio_can[NB_CARTE][NB_CAN];
extern int vio_pot_virtual_step[NB_POT_VIR]; //UU_NEW
extern int vio_pot_virtual_conf[NB_POT_VIR][3];
extern int x_mouse,y_mouse,touche,touche_char,x_mouse_move,y_mouse_move;
extern int vio_det[NB_CARTE][NB_CANTON];
extern int vio_aig_cmd[NB_AIG];
extern int vio_aig_res[NB_AIG];

extern int moins_char_normal;   // 1: '-' est un caractère normal (comme 0)  0: '-' est un séparateur (comme +)
int infrarouge=-1;		// Utilisé par la télécommande IR



/*****************************************************************************/
/* IR (+clav)                                                                */
/*****************************************************************************/
/*
    Le module IR peut etre pilote par girder avec les codes suivants:
    aiguillages:
    20           aig inverse (si non specifie aig change)
    21           aig direct  (si non specifie aig change)
    0-15         selection aiguillage si cfg_aig_digit=1
    0-9 puis 0-9 selection aiguillage si cfg_aig_digit=2
    trains:
    50           Tous les pot virtuels a 0
    30-34        selection pot virtuel 0 a 4
    40           stop (step=0)
    41           step++ (max=3)
    42           step-- (min=-3)
*/

int cfg_aig_digit=1;


void ir_maj(void)
{
    int i;
    static int force_aig_cmd=-1;
    static int pot_sel=0;
    static int digit=0;
    static int num=0;
    static int idle=0;
    if(infrarouge==-1) {
        idle++;
        if(idle==20) { digit=0; num=0; }
        return;
    }
    idle=0;
    if(infrarouge>=0 && infrarouge<=11) { num=10*num+infrarouge; digit++; } else num=0;
    //sprintf_s(szTemp,"code=%d",infrarouge); MessageBox(NULL,szTemp,"infrarouge debug",MB_OK);
    //sprintf_s(szTemp,"num=%d dig=%d",num,digit); MessageBox(NULL,szTemp,"infrarouge debug",MB_OK);
    if(infrarouge==20) force_aig_cmd=1; // aig inv
    if(infrarouge==21) force_aig_cmd=0; // aig direct
    if(infrarouge>=0 && infrarouge<=11) if(digit==cfg_aig_digit) if(num<64) {
        if(vio_aig_res[num]==0) {
            if(force_aig_cmd==0)  vio_aig_cmd[num]=0;
            if(force_aig_cmd==1)  vio_aig_cmd[num]=1;
            if(force_aig_cmd==-1) vio_aig_cmd[num]^=1;
        }
        force_aig_cmd=-1;
        digit=0;num=0;
    }
    if(infrarouge==30) pot_sel=0;
    if(infrarouge==31) pot_sel=1;
    if(infrarouge==32) pot_sel=2;
    if(infrarouge==33) pot_sel=3;
    if(infrarouge==34) pot_sel=4;
    if(infrarouge==40) { vio_pot_virtual_step[pot_sel]=0; } // stop
    if(infrarouge==41) { if(vio_pot_virtual_step[pot_sel]>-3) vio_pot_virtual_step[pot_sel]--; } // dec
    if(infrarouge==42) { if(vio_pot_virtual_step[pot_sel]< 3) vio_pot_virtual_step[pot_sel]++; } // inc
    if(infrarouge==50) for(i=0;i<NB_POT_VIR;i++) vio_pot_virtual_step[i]=0;
    infrarouge=-1;
}


void pot_vir_debug(int action)
{
    int i,j;
    char t;
    t=touche_char;	// Conversion de 'int' en 'char'.
    if(touche_char>='A' && touche_char<='Z') t=t+'a'-'A'; // met en minuscule
    if(action==DEBUG_KEY) {
        for(j=0;j<NB_POT_VIR;j++) for(i=0;i<3;i++) if(t==vio_pot_virtual_conf[j][i]) {
            if(i==1) { vio_pot_virtual_step[j]=0; } // stop
            if(i==2) { if(vio_pot_virtual_step[j]>-3) vio_pot_virtual_step[j]--; } // dec
            if(i==0) { if(vio_pot_virtual_step[j]< 3) vio_pot_virtual_step[j]++; } // inc
        }
    }
}
