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
|
|
|
|