From d928db45b3769f18e0b97141b886518111ffad05 Mon Sep 17 00:00:00 2001
From: "remi.greub" <remi.greub@hes-so.ch>
Date: Wed, 19 Mar 2025 20:00:00 +0100
Subject: [PATCH] ajout d'une balle random

---
 G3_TP1_labyrinth_etu/src/labyrinth.c | 81 ++++++++++++++++++++++++++++
 1 file changed, 81 insertions(+)

diff --git a/G3_TP1_labyrinth_etu/src/labyrinth.c b/G3_TP1_labyrinth_etu/src/labyrinth.c
index 7ae9a94..1d811b7 100644
--- a/G3_TP1_labyrinth_etu/src/labyrinth.c
+++ b/G3_TP1_labyrinth_etu/src/labyrinth.c
@@ -45,6 +45,8 @@
 #define GOAL_H_WALL (LCD_MAX_WIDTH-(2*BALL_RADIUS+1+WALL_WIDTH))
 #define GOAL_V_WALL (LCD_MAX_HEIGHT-(2*BALL_RADIUS+1+WALL_WIDTH)-1)
 
+#define NUM_THREADS 5
+
 // Ball identifiers
 enum {
 	NONE = -1,			// NONE is used if ball has reached the goal (winner field)
@@ -86,6 +88,8 @@ void slave_info_rx(void *data, int len)
 }
 
 void Algo_main_ball(void *params);
+void Algo_bots(void *params);
+void RandAccel(accel_t *accel);
 
 int main(void)
 {
@@ -113,9 +117,15 @@ int main(void)
 	accel_read(&ball_accel);	 // example: reading of the accelerometer
 
 	// creating tasks...
+	/*for(int i = 0; i<NUM_THREADS; i++){
+
+	}*/
 	xTaskCreate(Algo_main_ball, (signed portCHAR *)"Masterball",
 					configMINIMAL_STACK_SIZE, &ball_param_th[0], tskIDLE_PRIORITY+1,
 					NULL);
+	xTaskCreate(Algo_bots, (signed portCHAR *)"libreball1",
+						configMINIMAL_STACK_SIZE, &ball_param_th[2], tskIDLE_PRIORITY+1,
+						NULL);
 	vTaskStartScheduler();		// launch scheduler
 	LPC_TIM0->TCR = 1;
 
@@ -181,3 +191,74 @@ void Algo_main_ball(void *params){
 
 	}
 }
+
+void Algo_bots(void *params){
+	ball_param_th_t *ball = (ball_param_th_t *)params;
+	accel_t ball_acc;
+	int un_ou_moins_un_x = 1, un_ou_moins_un_y = 1;
+	while(1){
+		lcd_filled_circle(ball->ball.pos.x, ball->ball.pos.y, ball->ball.radius, LCD_BLACK);
+		int CollisionState = test_collision(&ball->ball);
+		if(CollisionState != NO_COLLISION){
+			//ralentissement de 10% de la vitesse de la balle
+			ball->ball.speed.x = ball->ball.speed.x - (ball->ball.speed.x/10);
+			ball->ball.speed.y = ball->ball.speed.y - (ball->ball.speed.y/10);
+
+			if(CollisionState & TOUCH_LEFT){
+				un_ou_moins_un_x = -1;
+				ball->ball.pos.x += ball->ball.radius/2;
+			}
+			if(CollisionState & TOUCH_UP){
+				un_ou_moins_un_y = -1;
+				ball->ball.pos.y += ball->ball.radius/2;
+			}
+			if(CollisionState & TOUCH_RIGHT){
+				un_ou_moins_un_x = -1;
+				ball->ball.pos.x -= ball->ball.radius/2;
+			}
+			if(CollisionState & TOUCH_DOWN){
+				un_ou_moins_un_y = -1;
+				ball->ball.pos.y -= ball->ball.radius/2;
+			}
+		}else{
+			//lcd_filled_circle(ball->ball.pos.x, ball->ball.pos.y, ball->ball.radius, LCD_BLACK);
+			RandAccel(&ball_acc);
+			ball->ball.speed.x = ((ball_acc.accel_x*0.08)+ball->ball.speed.x)*(un_ou_moins_un_x);
+			ball->ball.speed.y = ((ball_acc.accel_y*0.08)+ball->ball.speed.y)*(un_ou_moins_un_y);
+
+			ball->ball.pos.x = ball->ball.pos.x + ball->ball.speed.x*(un_ou_moins_un_x);
+			ball->ball.pos.y = ball->ball.pos.y + ball->ball.speed.y*(un_ou_moins_un_y);
+			un_ou_moins_un_y = 1;
+			un_ou_moins_un_x = 1;
+		}
+		//}
+		if(ball->ball.pos.x <= ball->ball.radius){
+			ball->ball.pos.x = ball->ball.radius+1;
+		}
+		if(ball->ball.pos.y <= ball->ball.radius){
+			ball->ball.pos.y = ball->ball.radius+1;
+		}
+		if(ball->ball.pos.x == LCD_MAX_WIDTH-ball->ball.radius){
+			ball->ball.pos.x -= ball->ball.radius;
+		}
+		if(ball->ball.pos.y == LCD_MAX_HEIGHT-ball->ball.radius){
+			ball->ball.pos.y -= ball->ball.radius;
+		}
+		lcd_filled_circle(ball->ball.pos.x, ball->ball.pos.y, ball->ball.radius, ball->ball.color);
+		vTaskDelay((portTickType)20/portTICK_RATE_MS);
+
+	}
+}
+
+void RandAccel(accel_t *accel){
+	float x = rnd32()%500;
+	float y = rnd32()%500;
+	accel->accel_x = x/100;
+	accel->accel_y = y/100;
+	accel->accel_z = (float)(rnd32()%500)/100;
+
+	accel->magneto_x = 0;
+	accel->magneto_y = 0;
+	accel->magneto_z = 0;
+	accel->temperature = 0;
+}
-- 
GitLab