1
0
Fork 0
mirror of https://github.com/RobotechLille/cdf2018-principal synced 2024-06-16 01:03:13 +02:00
cdf2018-principal/chef/src/parcours.c

108 lines
2.4 KiB
C
Raw Normal View History

2018-04-30 16:15:47 +02:00
#include <pthread.h>
#include <stdio.h>
2018-04-30 22:40:20 +02:00
#include <unistd.h>
2018-05-01 08:45:02 +02:00
#include <wiringPi.h>
2018-04-30 16:15:47 +02:00
2018-04-30 22:40:20 +02:00
#include "lcd.h"
2018-04-30 16:15:47 +02:00
#include "movement.h"
2018-04-30 22:40:20 +02:00
#include "parcours.h"
2018-04-30 16:15:47 +02:00
#include "points.h"
2018-04-30 22:40:20 +02:00
#include "position.h"
2018-04-30 16:15:47 +02:00
pthread_t tParcours;
bool isOrange;
struct timespec tempsStart;
struct timespec tempsNow;
struct timespec tempsEcoule;
void prepareParcours(bool orange)
{
isOrange = orange;
clearLCD();
2018-04-30 22:40:20 +02:00
printfToLCD(LCD_LINE_1, "--:--/%2d:%02d", TEMPS_PARCOURS / 60, TEMPS_PARCOURS % 60);
printRightLCD(LCD_LINE_1, "ATT");
2018-04-30 16:15:47 +02:00
resetPoints();
showPoints();
2018-04-30 22:40:20 +02:00
printRightLCD(LCD_LINE_2, isOrange ? "Org" : "Vrt");
2018-04-30 16:15:47 +02:00
}
void startParcours()
{
clock_gettime(CLOCK_REALTIME, &tempsStart);
pthread_create(&tParcours, NULL, TaskParcours, NULL); // TODO Start on mutex unlock
2018-04-30 22:40:20 +02:00
printRightLCD(LCD_LINE_1, " ");
2018-04-30 16:15:47 +02:00
}
void updateTimeDisplay()
{
2018-04-30 22:40:20 +02:00
printfToLCD(LCD_LINE_1, "%2ld:%02ld", tempsEcoule.tv_sec / 60, tempsEcoule.tv_sec % 60);
2018-04-30 16:15:47 +02:00
}
int updateParcours()
{
clock_gettime(CLOCK_REALTIME, &tempsNow);
if ((tempsNow.tv_nsec - tempsStart.tv_nsec) < 0) {
tempsEcoule.tv_sec = tempsNow.tv_sec - tempsStart.tv_sec - 1;
tempsEcoule.tv_nsec = tempsNow.tv_nsec - tempsStart.tv_nsec + 1000000000UL;
} else {
tempsEcoule.tv_sec = tempsNow.tv_sec - tempsStart.tv_sec;
tempsEcoule.tv_nsec = tempsNow.tv_nsec - tempsStart.tv_nsec;
}
if (tempsEcoule.tv_sec >= TEMPS_PARCOURS) {
return -1;
}
updateTimeDisplay();
return (1000000000UL - tempsEcoule.tv_nsec) / 1000000UL;
}
void stopParcours()
{
pthread_cancel(tParcours);
stop();
updateTimeDisplay();
2018-04-30 22:40:20 +02:00
printRightLCD(LCD_LINE_1, "FIN");
2018-04-30 16:15:47 +02:00
showPoints();
}
2018-04-30 22:40:20 +02:00
#define UP_TIME 1000
2018-05-01 08:45:02 +02:00
#define HIGH_TIME 3000
2018-04-30 22:40:20 +02:00
#define DOWN_TIME 1000
#define LOW_TIME 2000
#define MAX_VIT MOT_MAX_V
2018-04-30 16:15:47 +02:00
void* TaskParcours(void* pdata)
{
(void)pdata;
for (;;) {
addPoints(1);
2018-04-30 22:40:20 +02:00
for (int i = 0; i < UP_TIME; i++) {
float p = (float)i / (float)UP_TIME;
changerMoteurs(p * MOT_MAX_V, p * MOT_MAX_V);
delay(1);
}
addPoints(1);
changerMoteurs(MOT_MAX_V, MOT_MAX_V);
delay(HIGH_TIME);
2018-04-30 16:15:47 +02:00
2018-04-30 22:40:20 +02:00
addPoints(1);
for (int i = 0; i < DOWN_TIME; i++) {
float p = (float)i / (float)DOWN_TIME;
p = 1 - p;
changerMoteurs(p * MOT_MAX_V, p * MOT_MAX_V);
delay(1);
}
addPoints(1);
changerMoteurs(0, 0);
delay(LOW_TIME);
2018-04-30 16:15:47 +02:00
}
return NULL;
}
2018-04-30 22:40:20 +02:00