var Pin; (function(){ // Constructeur de Pin Pin = function(value){ if( parseInt(value) == value && value >= 0 && value <= 255 ) this.value = parseInt(value); else this.value = 0; }; Pin.prototype = { value: this.value }; Pin.prototype.set = function(value){ if( parseInt(value) == value && value >= 0 && value <= 255 ) this.value = parseInt(value); }; Pin.prototype.get = function(){ return this.value; }; })(); var Board; (function(){ /* CONSTRUCTEUR DE CARTE * * @maxPin Nombre de pin de la board * */ Board = function(maxPin){ if( parseInt(maxPin) != maxPin || maxPin < 1 ) return; this.maxPin = maxPin; this.pins = []; this.listener = []; for( var i = 0 ; i < this.maxPin ; i++ ) this.pins[i] = false; this.listener[i] = null; }; Board.prototype = { maxPin: this.maxPin, // Nombre de Pins de la Board pins: this.pins, // Liste des valeurs des pins (FALSE->libre, Pin()->prise) listener: this.listener // Contient la classe d'amorcage pour chaque pin }; /* BRANCHE UNE PUCE SUR LA Board * * @chipInterface Interface contenant la carte et la mise à jour * */ Board.prototype.plug = function(chipInterface){ /* [0] Vérification des paramètres =========================================================*/ if( !(chipInterface.chip instanceof Chip) ) return false; /* [1] Vérification des Pins =========================================================*/ for( var i = 0 ; i < chipInterface.chip.pins.length ; i++ ) if( this.pins[i] instanceof Pin ) // si pin déja prise return false; /* [2] Branchement + on lie l'interface =========================================================*/ for( var i = 0 ; i < chipInterface.chip.pins.length ; i++ ){ this.pins[i] = chipInterface.chip.values[i]; this.listener[i] = chipInterface; } }; /* MODIFICATION D'UNE VALEUR DE PIN * * @pinOrder Indice de la pin * @value Valeur à attribuer * * @return nomRetour Description du retour * */ Board.prototype.set = function(pinOrder, value){ /* [0] Vérification des paramètres =========================================================*/ /* (1) On vérifie que @pinOrder est un entier et qu'il est branché */ if( parseInt(pinOrder) != pinOrder || pinOrder > this.maxPin ) return; /* (2) On vérifie que la pin de @pinOrder est branchée */ if( !(this.pins[pinOrder] instanceof Pin) ) return; /* (3) On vérifie que @value est un booléen, si oui : true=>255, false=>0 */ if( typeof value == 'boolean' ) value = value ? 255 : 0; /* (4) On vérifie que @value est dans 0-255 */ else if( value != parseInt(value) || value < 0 || value > 255 ) return; // On met @value en entier value = parseInt(value); /* [1] On attribue la valeur =========================================================*/ this.pins[pinOrder].set(value); /* [2] On lance le listener =========================================================*/ this.listener[pinOrder].update(); }; })(); var Chip; (function(){ /* CLASSE 'Chip' Correspond à un périphérique processeur * * @chip Type de communication * @pins Numéros des pins de la carte * * @return Chip Retourne une instance de 'Chip' * */ Chip = function(type, pins){ /* [0] Vérification des paramètres =========================================================*/ /* (1) @type de carte */ if( typeof type != 'string' ) return; type = type.toLowerCase(); if( ['spi', 'i2c', 'serial'].indexOf(type) == -1 ) return; /* (2) @pins un tableau d'entiers */ if( !(pins instanceof Array) ) return; for( var i = 0 ; i < pins.length ; i++ ) if( parseInt(pins[i]) != pins[i] ) return; /* [1] On récupère les valeurs =========================================================*/ /* (1) On enregistre le type */ this.type = type; /* (2) On enregistre la liste des pins et leurs valeurs */ this.pins = pins; this.values = []; for( var i = 0 ; i < this.pins.length ; i++ ) this.values[i] = new Pin(0); }; Chip.prototype = { type: this.type, // Type de communication ('spi', 'i2c', ou 'serial') pins: this.pins, // Liste des numéros des Pin's (ordonnée) values: this.values // Liste des valeurs des pins (ordonnée) (objets Pin() ) }; /* ATTRIBUE UNE VALEUR A UNE PIN DONNEE * * @pinOrder Indice de la pin (0, 1, 2, ...) * @value Valeur dans 0-255 (ou booléen) à attribuer * */ Chip.prototype.setPin = function(pinOrder, value){ /* [0] Vérification des paramètres =========================================================*/ /* (1) On vérifie que @pinOrder est un entier et qu'il est un indice de @this.pins */ if( parseInt(pinOrder) != pinOrder || this.pins.length >= pinOrder ) return; /* (2) On vérifie que @value est un booléen, si oui : true=>255, false=>0 */ if( typeof value == 'boolean' ) value = value ? 255 : 0; /* (3) On vérifie que @value est dans 0-255 */ else if( value != parseInt(value) || value < 0 || value > 255 ) return; // On met @value en entier value = parseInt(value); /* [1] On attribue la valeur =========================================================*/ this.values[pinOrder].set(value); }; /* ATTRIBUE LES VALEUR DES PIN * * @values Valeurs * */ Chip.prototype.setPins = function(values){ for( var i = 0 ; i < this.pins.length ; i++ ) this.setPin( i, values[i] ); }; /* RECUPERE LA VALEUR D'UNE PIN DONNEE * * @pinOrder Indice de la pin à lire * * @return value Valeur entière dans 0-255 * */ Chip.prototype.getPin = function(pinOrder){ /* [0] Vérification des paramètres =========================================================*/ /* (1) On vérifie que @pin est un entier et qu'elle existe */ if( parseInt(pinOrder) != pinOrder || this.pins.length <= pinOrder ) return false; /* [1] On retourne la valeur =========================================================*/ return this.values[pinOrder].get(); }; /* RECUPERE LES VALEUR DES PIN * * @return values Valeurs * */ Chip.prototype.getPins = function(){ var values = []; for( var i = 0 ; i < this.pins.length ; i++ ) values[i] = this.getPin( i ); return values; }; })(); var LedInterface; (function(){ /* CONSTRUCTEUR D'INTERFACE DE LED * * @chip Puce associée à la LED * @container Conteneur de couleur * */ LedInterface = function(chip, container){ /* [0] Vérification des paramètres =========================================================*/ if( !(chip instanceof Chip) || !(container instanceof Element) ) return; /* [1] On enregistre les valeurs =========================================================*/ this.chip = chip; this.container = container; }; LedInterface.prototype = { chip: this.chip, // Puce associée à la LED container: this.container // Conteneur de couleur }; /* APPLIQUE LA COULEUR EN FONCTION DES VALEURS DE LA 'CHIP' * */ LedInterface.prototype.update = function(){ this.container.style.backgroundColor = 'rgb('+this.chip.getPin(0)+','+this.chip.getPin(1)+','+this.chip.getPin(2)+')'; }; })(); var RelayInterface; (function(){ /* CONSTRUCTEUR D'INTERFACE DU RELAI * * @chip Puce associée au relai * @container Conteneur du relai * */ RelayInterface = function(chip, container){ /* [0] Vérification des paramètres =========================================================*/ if( !(chip instanceof Chip) || !(container instanceof Element) ) return; /* [1] On enregistre les valeurs =========================================================*/ this.chip = chip; this.container = container; }; RelayInterface.prototype = { chip: this.chip, // Puce associée au relai container: this.container // Conteneur du relai }; /* APPLIQUE L'ACTIVATION EN FONCTION DES VALEURS DE LA 'CHIP' * */ RelayInterface.prototype.update = function(){ if( this.chip.pin[0] ) this.container.addClass('active'); else this.container.remClass('active'); }; })(); var previous; var action; (function(){ /* RETOURNE SI UN ETAT EST CORRECT * * @previous Condition d'état * @state Liste des états du système * * @return state Retourne si OUI ou NON l'état répond à la condition * */ previous = function(previous, state){ previous = previous.toLowerCase(); for( var i = 0 ; i < previous.length ; i++ ) if( previous[i] == 'x' ) continue; else if( previous[i] != state[i] ) return false; return true; }; /* MODIFIE LES ETATS EN FONCTION D'UNE ACTION * * @action Action sur les états * @state Liste des états du système * */ action = function(action, state){ action = action.toLowerCase(); for( var i = 0 ; i < action.length ; i++ ) if( action[i] == 'x' ) continue; else state[i] = parseInt(action[i]); }; })();