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 9bc638df39
commit cc9aadccc0
3 changed files with 213 additions and 72 deletions

View File

@ -3,7 +3,7 @@
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Jul 19, 2016 at 12:30 AM
-- Generation Time: Jul 19, 2016 at 12:39 AM
-- Server version: 5.7.12-0ubuntu1.1
-- PHP Version: 7.0.4-7ubuntu2.1
@ -58,13 +58,6 @@ CREATE TABLE `action_merge` (
`id_action` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Dumping data for table `action_merge`
--
INSERT INTO `action_merge` (`id_action_merge`, `id_target`, `id_source`, `id_action`) VALUES
(1, 205, 1, 1);
-- --------------------------------------------------------
--
@ -140,9 +133,9 @@ INSERT INTO `global_state` (`id_global_state`, `state`, `chips`) VALUES
CREATE TABLE `history` (
`id_history` int(11) NOT NULL,
`action` int(11) NOT NULL,
`id_acteur` int(11) NOT NULL,
`id_machine` int(11) NOT NULL
`id_user` int(11) NOT NULL,
`id_machine` int(11) NOT NULL,
`id_action` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
@ -291,14 +284,6 @@ CREATE TABLE `machine_cluster` (
`name` varchar(30) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Dumping data for table `machine_cluster`
--
INSERT INTO `machine_cluster` (`id_machine_cluster`, `id_warehouse`, `name`) VALUES
(2, 7, 'FirstMachineCluster'),
(3, 7, 'test');
-- --------------------------------------------------------
--
@ -311,14 +296,6 @@ CREATE TABLE `machine_cluster_merge` (
`id_machine` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Dumping data for table `machine_cluster_merge`
--
INSERT INTO `machine_cluster_merge` (`id_machine_cluster_merge`, `id_machine_cluster`, `id_machine`) VALUES
(3, 2, 1),
(4, 2, 3);
-- --------------------------------------------------------
--
@ -583,7 +560,10 @@ ALTER TABLE `action`
-- Indexes for table `action_merge`
--
ALTER TABLE `action_merge`
ADD PRIMARY KEY (`id_action_merge`);
ADD PRIMARY KEY (`id_action_merge`),
ADD KEY `id_action` (`id_action`),
ADD KEY `id_target` (`id_target`),
ADD KEY `id_source` (`id_source`);
--
-- Indexes for table `admin`
@ -608,7 +588,10 @@ ALTER TABLE `global_state`
-- Indexes for table `history`
--
ALTER TABLE `history`
ADD PRIMARY KEY (`id_history`);
ADD PRIMARY KEY (`id_history`),
ADD KEY `id_user` (`id_user`,`id_machine`,`id_action`),
ADD KEY `history_id_machine` (`id_machine`),
ADD KEY `history_id_action` (`id_action`);
--
-- Indexes for table `machine`
@ -775,12 +758,28 @@ ALTER TABLE `warehouse`
-- Constraints for dumped tables
--
--
-- Constraints for table `action_merge`
--
ALTER TABLE `action_merge`
ADD CONSTRAINT `action_merge_id_action` FOREIGN KEY (`id_action`) REFERENCES `action` (`id_action`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `action_merge_id_source` FOREIGN KEY (`id_source`) REFERENCES `user_cluster` (`id_user_cluster`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `action_merge_id_target` FOREIGN KEY (`id_target`) REFERENCES `machine_cluster` (`id_machine_cluster`) ON DELETE CASCADE ON UPDATE CASCADE;
--
-- Constraints for table `admin`
--
ALTER TABLE `admin`
ADD CONSTRAINT `admin_id_warehouse` FOREIGN KEY (`id_warehouse`) REFERENCES `warehouse` (`id_warehouse`);
--
-- Constraints for table `history`
--
ALTER TABLE `history`
ADD CONSTRAINT `history_id_action` FOREIGN KEY (`id_action`) REFERENCES `action` (`id_action`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `history_id_machine` FOREIGN KEY (`id_machine`) REFERENCES `machine` (`id_machine`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `history_id_user` FOREIGN KEY (`id_user`) REFERENCES `user` (`id_user`) ON DELETE CASCADE ON UPDATE CASCADE;
--
-- Constraints for table `machine`
--

View File

@ -1,6 +1,8 @@
var Chip;
(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])};
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;
(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(){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;
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(){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)!=
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(){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;
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]))}})();

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;
@ -14,42 +135,59 @@ var Chip;
/* CLASSE 'Chip' Correspond à un périphérique processeur
*
* @Pin1<int> Numéro de la première PIN
* @Pin2<int> Numéro de la seconde PIN
* @Pin...<int> Numéro de la ... PIN
* @chip<String> Type de communication
* @pins<Array> Numéros des pins de la carte
*
* @return Chip<Chip> Retourne une instance de 'Chip'
*
*/
Chip = function(){
/* On initialise les attributs */
this.pins = [];
this.pin = {};
Chip = function(type, pins){
/* [0] Vérification des paramètres
=========================================================*/
/* (1) @type de carte */
if( typeof type != 'string' ) return;
/* On vérifie qu'on a que des nombres entiers */
for( var i = 0 ; i < arguments.length ; i++ )
if( parseInt(arguments[i]) == arguments[i] ){
this.pins.push( parseInt(arguments[i]) );
this.pin[ parseInt(arguments[i]) ] = 0;
}
}
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 = {
pin: this.pin, // Liste des numéros des Pin's et leurs valeur
pins: this.pins // Liste des numéros des Pin's (ordonnée)
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
*
* @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
*
*/
Chip.prototype.setPin = function(pin, value){
Chip.prototype.setPin = function(pinOrder, value){
/* [0] Vérification des paramètres
=========================================================*/
/* (1) On vérifie que @pin est un entier et qu'elle existe */
if( parseInt(pin) != pin || !this.pin.hasOwnProperty(pin) ) return;
/* (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' )
@ -64,7 +202,7 @@ var Chip;
/* [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){
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
*
* @pin<int> Numéro de la pin à lire
* @pinOrder<int> Indice de la pin à lire
*
* @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
=========================================================*/
/* (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
=========================================================*/
return this.pin[pin];
return this.values[pinOrder].get();
};
@ -108,7 +246,7 @@ var Chip;
var values = [];
for( var i = 0 ; i < this.pins.length ; i++ )
values.push( this.getPin( this.pins[i] ) );
values[i] = this.getPin( i );
return values;
};
@ -118,6 +256,8 @@ var Chip;
var LedInterface;
(function(){
@ -151,8 +291,8 @@ var LedInterface;
/* APPLIQUE LA COULEUR EN FONCTION DES VALEURS DE LA 'CHIP'
*
*/
LedInterface.prototype.apply = function(){
this.container.style.background = 'rgb('+this.chip.pin[0]+','+this.chip.pin[1]+','+this.chip.pin[2]+')';
LedInterface.prototype.update = function(){
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'
*
*/
RelayInterface.prototype.apply = function(){
RelayInterface.prototype.update = function(){
if( this.chip.pin[0] )
this.container.addClass('active');
else