Client Virtuel : Implémentation de la carte programmable (Board) + des puces (Chip) + des interfaces (LedInterface, RelayInterface)

This commit is contained in:
xdrm-brackets 2016-07-19 10:30:19 +02:00
parent f1678ccdf6
commit d9e9374cb7
2 changed files with 185 additions and 43 deletions

View File

@ -1,6 +1,8 @@
var Chip; var Pin;(function(){Pin=function(a){parseInt(a)==a&&0<=a&&255>=a?this.value=parseInt(a):this.value=0};Pin.prototype={value:this.value};Pin.prototype.set=function(a){parseInt(a)==a&&0<=a&&255>=a&&(this.value=parseInt(a))};Pin.prototype.get=function(){return this.value}})();var Board;
(function(){Chip=function(){this.pins=[];this.pin={};for(var a=0;a<arguments.length;a++)parseInt(arguments[a])==arguments[a]&&(this.pins.push(parseInt(arguments[a])),this.pin[parseInt(arguments[a])]=0)};Chip.prototype={pin:this.pin,pins:this.pins};Chip.prototype.setPin=function(a,b){if(parseInt(a)==a&&this.pin.hasOwnProperty(a)){if("boolean"==typeof b)b=b?255:0;else if(b!=parseInt(b)||0>b||255<b)return;b=parseInt(b);this.pin[a]=b}};Chip.prototype.setPins=function(a){for(var b=0;b<this.pins.length;b++)this.setPin(this.pin[this.pins[b]],a[b])}; (function(){Board=function(a){if(!(parseInt(a)!=a||1>a)){this.maxPin=a;this.pins=[];this.listener=[];for(a=0;a<this.maxPin;a++)this.pins[a]=!1;this.listener[a]=null}};Board.prototype={maxPin:this.maxPin,pins:this.pins,listener:this.listener};Board.prototype.plug=function(a,b){if(!(b instanceof Chip))return!1;for(var c=0;c<b.pins.length;c++)if(this.pins[c]instanceof Pin)return!1;for(c=0;c<b.pins.length;c++)this.pins[c]=b.values[c],this.listener[c]=a};Board.prototype.set=function(a,b){if(!(parseInt(a)!=
Chip.prototype.getPin=function(a){if(parseInt(a)==a&&this.pin.hasOwnProperty(a))return this.pin[a]};Chip.prototype.getPins=function(){for(var a=[],b=0;b<this.pins.length;b++)a.push(this.getPin(this.pins[b]));return a}})();var LedInterface; a||a>this.maxPin)&&this.pins[a]instanceof Pin){if("boolean"==typeof b)b=b?255:0;else if(b!=parseInt(b)||0>b||255<b)return;b=parseInt(b);this.pins[a].set(b);this.listener[a].update()}}})();var Chip;
(function(){LedInterface=function(a,b){a instanceof Chip&&b instanceof Element&&(this.chip=a,this.container=b)};LedInterface.prototype={chip:this.chip,container:this.container};LedInterface.prototype.apply=function(){this.container.style.background="rgb("+this.chip.pin[0]+","+this.chip.pin[1]+","+this.chip.pin[2]+")"}})();var RelayInterface; (function(){Chip=function(a,b){if("string"==typeof a&&(a=a.toLowerCase(),-1!=["spi","i2c","serial"].indexOf(a)&&b instanceof Array)){for(var c=0;c<b.length;c++)if(parseInt(b[c])!=b[c])return;this.type=a;this.pins=b;this.values=[];for(c=0;c<this.pins.length;c++)this.values[c]=new Pin(0)}};Chip.prototype={type:this.type,pins:this.pins,values:this.values};Chip.prototype.setPin=function(a,b){if(!(parseInt(a)!=a||this.pins.length>=a)){if("boolean"==typeof b)b=b?255:0;else if(b!=parseInt(b)||0>b||255<b)return;
(function(){RelayInterface=function(a,b){a instanceof Chip&&b instanceof Element&&(this.chip=a,this.container=b)};RelayInterface.prototype={chip:this.chip,container:this.container};RelayInterface.prototype.apply=function(){this.chip.pin[0]?this.container.addClass("active"):this.container.remClass("active")}})();var previous,action; b=parseInt(b);this.values[a].set(b)}};Chip.prototype.setPins=function(a){for(var b=0;b<this.pins.length;b++)this.setPin(b,a[b])};Chip.prototype.getPin=function(a){return parseInt(a)!=a||this.pins.length<=a?!1:this.values[a].get()};Chip.prototype.getPins=function(){for(var a=[],b=0;b<this.pins.length;b++)a[b]=this.getPin(b);return a}})();var LedInterface;
(function(){LedInterface=function(a,b){a instanceof Chip&&b instanceof Element&&(this.chip=a,this.container=b)};LedInterface.prototype={chip:this.chip,container:this.container};LedInterface.prototype.update=function(){this.container.style.backgroundColor="rgb("+this.chip.getPin(0)+","+this.chip.getPin(1)+","+this.chip.getPin(2)+")"}})();var RelayInterface;
(function(){RelayInterface=function(a,b){a instanceof Chip&&b instanceof Element&&(this.chip=a,this.container=b)};RelayInterface.prototype={chip:this.chip,container:this.container};RelayInterface.prototype.update=function(){this.chip.pin[0]?this.container.addClass("active"):this.container.remClass("active")}})();var previous,action;
(function(){previous=function(a,b){a=a.toLowerCase();for(var c=0;c<a.length;c++)if("x"!=a[c]&&a[c]!=b[c])return!1;return!0};action=function(a,b){a=a.toLowerCase();for(var c=0;c<a.length;c++)"x"!=a[c]&&(b[c]=parseInt(a[c]))}})(); (function(){previous=function(a,b){a=a.toLowerCase();for(var c=0;c<a.length;c++)if("x"!=a[c]&&a[c]!=b[c])return!1;return!0};action=function(a,b){a=a.toLowerCase();for(var c=0;c<a.length;c++)"x"!=a[c]&&(b[c]=parseInt(a[c]))}})();

View File

@ -1,11 +1,132 @@
////////////////////////////////////////////////////////////////////////// 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<int> 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
*
* @listener<Object> Interface contenant la carte
* @chip<Chip> Carte à brancher
*
*/
Board.prototype.plug = function(listener, chip){
/* [0] Vérification des paramètres
=========================================================*/
if( !(chip instanceof Chip) )
return false;
/* [1] Vérification des Pins
=========================================================*/
for( var i = 0 ; i < 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 < chip.pins.length ; i++ ){
this.pins[i] = chip.values[i];
this.listener[i] = listener;
}
};
/* MODIFICATION D'UNE VALEUR DE PIN
*
* @pinOrder<int> Indice de la pin
* @value<int> Valeur à attribuer
*
* @return nomRetour<typeRetour> 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; var Chip;
@ -14,42 +135,59 @@ var Chip;
/* CLASSE 'Chip' Correspond à un périphérique processeur /* CLASSE 'Chip' Correspond à un périphérique processeur
* *
* @Pin1<int> Numéro de la première PIN * @chip<String> Type de communication
* @Pin2<int> Numéro de la seconde PIN * @pins<Array> Numéros des pins de la carte
* @Pin...<int> Numéro de la ... PIN
* *
* @return Chip<Chip> Retourne une instance de 'Chip' * @return Chip<Chip> Retourne une instance de 'Chip'
* *
*/ */
Chip = function(){ Chip = function(type, pins){
/* On initialise les attributs */ /* [0] Vérification des paramètres
this.pins = []; =========================================================*/
this.pin = {}; /* (1) @type de carte */
if( typeof type != 'string' ) return;
/* On vérifie qu'on a que des nombres entiers */ type = type.toLowerCase();
for( var i = 0 ; i < arguments.length ; i++ ) if( ['spi', 'i2c', 'serial'].indexOf(type) == -1 ) return;
if( parseInt(arguments[i]) == arguments[i] ){
this.pins.push( parseInt(arguments[i]) ); /* (2) @pins un tableau d'entiers */
this.pin[ parseInt(arguments[i]) ] = 0; 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 = { Chip.prototype = {
pin: this.pin, // Liste des numéros des Pin's et leurs valeur type: this.type, // Type de communication ('spi', 'i2c', ou 'serial')
pins: this.pins // Liste des numéros des Pin's (ordonnée) 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 /* ATTRIBUE UNE VALEUR A UNE PIN DONNEE
* *
* @pin<int> Numéro de la pin * @pinOrder<int> Indice de la pin (0, 1, 2, ...)
* @value<int/Boolean> Valeur dans 0-255 (ou booléen) à attribuer * @value<int/Boolean> Valeur dans 0-255 (ou booléen) à attribuer
* *
*/ */
Chip.prototype.setPin = function(pin, value){ Chip.prototype.setPin = function(pinOrder, value){
/* [0] Vérification des paramètres /* [0] Vérification des paramètres
=========================================================*/ =========================================================*/
/* (1) On vérifie que @pin est un entier et qu'elle existe */ /* (1) On vérifie que @pinOrder est un entier et qu'il est un indice de @this.pins */
if( parseInt(pin) != pin || !this.pin.hasOwnProperty(pin) ) return; 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 */ /* (2) On vérifie que @value est un booléen, si oui : true=>255, false=>0 */
if( typeof value == 'boolean' ) if( typeof value == 'boolean' )
@ -64,7 +202,7 @@ var Chip;
/* [1] On attribue la valeur /* [1] On attribue la valeur
=========================================================*/ =========================================================*/
this.pin[pin] = value; this.values[pinOrder].set(value);
}; };
@ -75,27 +213,27 @@ var Chip;
*/ */
Chip.prototype.setPins = function(values){ Chip.prototype.setPins = function(values){
for( var i = 0 ; i < this.pins.length ; i++ ) for( var i = 0 ; i < this.pins.length ; i++ )
this.setPin( this.pin[this.pins[i]], values[i] ); this.setPin( i, values[i] );
}; };
/* RECUPERE LA VALEUR D'UNE PIN DONNEE /* RECUPERE LA VALEUR D'UNE PIN DONNEE
* *
* @pin<int> Numéro de la pin à lire * @pinOrder<int> Indice de la pin à lire
* *
* @return value<int> Valeur entière dans 0-255 * @return value<int> Valeur entière dans 0-255
* *
*/ */
Chip.prototype.getPin = function(pin){ Chip.prototype.getPin = function(pinOrder){
/* [0] Vérification des paramètres /* [0] Vérification des paramètres
=========================================================*/ =========================================================*/
/* (1) On vérifie que @pin est un entier et qu'elle existe */ /* (1) On vérifie que @pin est un entier et qu'elle existe */
if( parseInt(pin) != pin || !this.pin.hasOwnProperty(pin) ) return; if( parseInt(pinOrder) != pinOrder || this.pins.length <= pinOrder ) return false;
/* [1] On retourne la valeur /* [1] On retourne la valeur
=========================================================*/ =========================================================*/
return this.pin[pin]; return this.values[pinOrder].get();
}; };
@ -108,7 +246,7 @@ var Chip;
var values = []; var values = [];
for( var i = 0 ; i < this.pins.length ; i++ ) for( var i = 0 ; i < this.pins.length ; i++ )
values.push( this.getPin( this.pins[i] ) ); values[i] = this.getPin( i );
return values; return values;
}; };
@ -118,6 +256,8 @@ var Chip;
var LedInterface; var LedInterface;
(function(){ (function(){
@ -151,8 +291,8 @@ var LedInterface;
/* APPLIQUE LA COULEUR EN FONCTION DES VALEURS DE LA 'CHIP' /* APPLIQUE LA COULEUR EN FONCTION DES VALEURS DE LA 'CHIP'
* *
*/ */
LedInterface.prototype.apply = function(){ LedInterface.prototype.update = function(){
this.container.style.background = 'rgb('+this.chip.pin[0]+','+this.chip.pin[1]+','+this.chip.pin[2]+')'; this.container.style.backgroundColor = 'rgb('+this.chip.getPin(0)+','+this.chip.getPin(1)+','+this.chip.getPin(2)+')';
}; };
@ -196,7 +336,7 @@ var RelayInterface;
/* APPLIQUE L'ACTIVATION EN FONCTION DES VALEURS DE LA 'CHIP' /* APPLIQUE L'ACTIVATION EN FONCTION DES VALEURS DE LA 'CHIP'
* *
*/ */
RelayInterface.prototype.apply = function(){ RelayInterface.prototype.update = function(){
if( this.chip.pin[0] ) if( this.chip.pin[0] )
this.container.addClass('active'); this.container.addClass('active');
else else