Skip to content

Commit 7787812

Browse files
author
BOURRET, Sébastien
committed
Code initial du client
1 parent 6640706 commit 7787812

15 files changed

Lines changed: 1070 additions & 1 deletion

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ web_modules/
5050

5151
# Optional npm cache directory
5252
.npm
53-
53+
package-lock.json
5454
# Optional eslint cache
5555
.eslintcache
5656

@@ -121,6 +121,7 @@ dist
121121

122122
# Stores VSCode versions used for testing VSCode extensions
123123
.vscode-test
124+
.vscode/
124125

125126
# yarn v2
126127
.yarn/cache

bot.js

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import { BotActions } from "./communication/bot-actions.js";
2+
import { CommunicationManager } from "./communication/communication-manager.js";
3+
import { BotConfiguration } from "./config/bot-configuration.js";
4+
5+
export class Bot{
6+
/**
7+
* Identifiant du bot
8+
* @type {string}
9+
* @memberof Bot
10+
*/
11+
id;
12+
13+
/**
14+
* configuration du bot
15+
* @type {BotConfiguration}
16+
* @memberof Bot
17+
*/
18+
config;
19+
20+
/**
21+
* communication manager
22+
* @type {CommunicationManager}
23+
* @memberof Bot
24+
*/
25+
manager;
26+
27+
/**
28+
* liste des actions pour le bot
29+
* @type {BotActions}
30+
* @memberof Bot
31+
*/
32+
action;
33+
34+
/**
35+
* Initialisation du bot
36+
* @param {CommunicationManager} manager gestionnaire de communication avec le serveur
37+
*/
38+
init(manager){
39+
if(!this.id){
40+
throw "Bot id must be defined";
41+
}
42+
this.manager = manager;
43+
this.action = new BotActions(manager, this.id);
44+
}
45+
46+
/**
47+
*
48+
* @param {Function} statusListener ecoute du status, la fonction est du type (messageType : string, messageValue : any) : void
49+
* @param {Function} scannerListener ecoute du status, la fonction est du type (items : array)
50+
* @param {Function} onClose méthode appelée à la fin du jeux
51+
*/
52+
startWatchers(statusListener, scannerListener, onClose){
53+
new Promise((resolve,reject) => {
54+
let stompClient = this.manager.stompConnectAndListen(this.id, (message) => {
55+
console.debug("status message : " + JSON.stringify(message));
56+
console.info(message.msg_type);
57+
if(message.msg_type === "game_status" && !message.data.value){
58+
onClose();
59+
console.info("######### Fin de partie #############");
60+
//on arrete l'écoute
61+
this.manager.closeStompConnexion(stompClient);
62+
this.manager.closeMqttConnexion(mqttClient);
63+
resolve();
64+
}else{
65+
//on déclenche l'appel
66+
statusListener(message.msg_type, message.data.value);
67+
}
68+
});
69+
70+
let mqttClient = this.manager.mqttConnectAndListen(this.id, message => {
71+
if(message.msg_type === "object_detection"){
72+
console.debug("scanner message : " + JSON.stringify(message));
73+
scannerListener(message.data);
74+
}else{
75+
console.warn("unknown type scanner message : " + JSON.stringify(message));
76+
}
77+
});
78+
});
79+
}
80+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
export class CheckConnectionRequest{
2+
/**
3+
* Indentifiant de connexion REST
4+
* @type {string}
5+
* @memberof CheckConnectionRequest
6+
*/
7+
rest_id;
8+
9+
/**
10+
* Indentifiant de connexion MQTT
11+
* @type {string}
12+
* @memberof CheckConnectionRequest
13+
*/
14+
mqtt_id;
15+
16+
/**
17+
* Indentifiant de connexion STOMP
18+
* @type {string}
19+
* @memberof CheckConnectionRequest
20+
*/
21+
stomp_id;
22+
23+
/**
24+
*
25+
* @param {string} restId Identifiant REST
26+
* @param {string} stompId Identifiant STOMP
27+
* @param {string} mqttId Identidiant MQTT
28+
*/
29+
constructor(restId, stompId, mqttId){
30+
this.rest_id = restId;
31+
this.stomp_id = stompId;
32+
this.mqtt_id = mqttId;
33+
}
34+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
export class EnrollRequest{
2+
/**
3+
* Identifiant de l'équipe
4+
* @type {string}
5+
* @memberof EnrollRequest
6+
*/
7+
team_id;
8+
9+
/**
10+
* Nom du bot
11+
* @type {string}
12+
* @memberof EnrollRequest
13+
*/
14+
bot_name;
15+
16+
/**
17+
*
18+
* @param {string} teamId Identifiant de l'équipe
19+
* @param {string} botName Nom du bot
20+
*/
21+
constructor(teamId, botName){
22+
this.team_id = teamId;
23+
this.bot_name = botName;
24+
}
25+
}

client/message/fire-request.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
export class FireRequest{
2+
/**
3+
* Angle de tir
4+
* @type {number}
5+
* @memberof FireRequest
6+
*/
7+
angle;
8+
9+
/**
10+
*
11+
* @param {number} angle Identifiant de l'équipe
12+
*/
13+
constructor(angle){
14+
this.angle = angle;
15+
}
16+
}

client/message/move-request.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
export class MoveRequest{
2+
3+
/**
4+
* Rotation à gauche
5+
*
6+
* @static
7+
* @memberof TurnRequest
8+
*/
9+
static START = "start";
10+
11+
/**
12+
* Rotation à droite
13+
*
14+
* @static
15+
* @memberof TurnRequest
16+
*/
17+
static STOP = "stop";
18+
19+
/**
20+
* Demarrage ou arret de l'avancé du bot
21+
* @type {string}
22+
* @memberof MoveRequest
23+
*/
24+
action;
25+
26+
/**
27+
*
28+
* @param {string} action Demarrage ou arret de l'avancé du bot
29+
*/
30+
constructor(action){
31+
this.action = action;
32+
}
33+
}

client/message/turn-request.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
export class TurnRequest{
2+
/**
3+
* Rotation à gauche
4+
*
5+
* @static
6+
* @memberof TurnRequest
7+
*/
8+
static LEFT = "left";
9+
10+
/**
11+
* Rotation à droite
12+
*
13+
* @static
14+
* @memberof TurnRequest
15+
*/
16+
static RIGHT = "right";
17+
18+
/**
19+
* Arret de la rotation
20+
*
21+
* @static
22+
* @memberof TurnRequest
23+
*/
24+
static STOP = "stop";
25+
26+
/**
27+
* Direction
28+
* @type {string}
29+
* @memberof TurnRequest
30+
*/
31+
direction;
32+
33+
/**
34+
*
35+
* @param {string} direction direction (left/right)
36+
*/
37+
constructor(direction){
38+
this.direction = direction;
39+
}
40+
}

communication/bot-actions.js

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
import { FireRequest } from "../client/message/fire-request.js";
2+
import { MoveRequest } from "../client/message/move-request.js";
3+
import { TurnRequest } from "../client/message/turn-request.js";
4+
import { CommunicationManager } from "./communication-manager.js";
5+
6+
/**
7+
* Gestion des actions du bot
8+
*/
9+
export class BotActions{
10+
/**
11+
* Gestion technique des appels aux serveurs
12+
* @type {CommunicationManager}
13+
* @memberof BotActions
14+
*/
15+
manager;
16+
17+
/**
18+
* Gestion technique des appels aux serveurs
19+
* @type {string}
20+
* @memberof BotActions
21+
*/
22+
botId;
23+
24+
/**
25+
*
26+
* @param {CommunicationManager} manager Gestion thecnique des appels aux serveurs
27+
* @param {string} botId identifiant du bot
28+
*/
29+
constructor(manager,botId){
30+
this.manager = manager;
31+
this.botId = botId;
32+
}
33+
34+
/**
35+
* Rotation à gauche
36+
* @returns
37+
*/
38+
turnLeft(){
39+
return this.turn(TurnRequest.LEFT);
40+
}
41+
42+
/**
43+
* Rotation à droite
44+
* @returns {Promise<void>}
45+
*/
46+
turnRight(){
47+
return this.turn(TurnRequest.RIGHT);
48+
}
49+
50+
/**
51+
* Arret rotation
52+
* @returns {Promise<void>}
53+
*/
54+
turnStop(){
55+
return this.turn(TurnRequest.STOP);
56+
}
57+
58+
/**
59+
* Rotation
60+
* @param {string} direction right/left/stop
61+
* @returns {Promise<void>}
62+
*/
63+
turn(direction){
64+
return new Promise( (resolve,reject) => {
65+
let request = new TurnRequest(direction);
66+
this.manager.httpPatch("/bots/" + this.botId + "/action/turn",request, (data, response) => {
67+
if(data.status === 'ok'){
68+
resolve();
69+
}else{
70+
console.error(`Rotation ${direction} : ${data.message}`);
71+
reject();
72+
}
73+
}).on('error', function(err){
74+
console.error(`Rotation ${direction}`, err);
75+
reject();
76+
});
77+
});
78+
}
79+
80+
/**
81+
* On avance
82+
* @returns {Promise<void>}
83+
*/
84+
moveForward(){
85+
return this.move(MoveRequest.START);
86+
}
87+
88+
/**
89+
* On arrete d'avancer
90+
* @returns {Promise<void>}
91+
*/
92+
moveStop(){
93+
return this.move(MoveRequest.STOP);
94+
}
95+
96+
/**
97+
* Déplacement
98+
* @param {string} action start/stop
99+
* @returns {Promise<void>}
100+
*/
101+
move(action){
102+
return new Promise( (resolve,reject) => {
103+
let request = new MoveRequest(action);
104+
this.manager.httpPatch("/bots/" + this.botId + "/action/move",request, (data, response) => {
105+
if(data.status === 'ok'){
106+
resolve();
107+
}else{
108+
console.error(`Déplacement ${action} : ${data.message}`);
109+
reject();
110+
}
111+
}).on('error', function(err){
112+
console.error(`Déplacement ${action}`, err);
113+
reject();
114+
});
115+
});
116+
}
117+
118+
/**
119+
* Tir du bot
120+
* @param {number} angle angle de tir (degres)
121+
* @returns {Promise<void>}
122+
*/
123+
fire(angle){
124+
return new Promise( (resolve,reject) => {
125+
let request = new FireRequest(angle);
126+
this.manager.httpPatch("/bots/" + this.botId + "/action/shoot",request, (data, response) => {
127+
if(data.status === 'ok'){
128+
resolve();
129+
}else{
130+
let message = data.internal_code ? data.internal_code + " : " + data.label
131+
: data.message ? data.message : JSON.stringify(data);
132+
console.error(`Tir angle ${angle}, message: ${message}`);
133+
reject(message);
134+
}
135+
}).on('error', function(err){
136+
console.error(`Tir angle ${angle}`, err);
137+
reject(err);
138+
});
139+
});
140+
}
141+
}

0 commit comments

Comments
 (0)