-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathposition_tracker.c
86 lines (70 loc) · 2.09 KB
/
position_tracker.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/**
* Program skeleton for the course "Programming embedded systems"
*
* Lab 1: the elevator control system
*/
/**
* Class for keeping track of the car position.
*/
#include "FreeRTOS.h"
#include "task.h"
#include "stdio.h"
#include "position_tracker.h"
#include "assert.h"
int prevsate = 0;
int presentstate = 0;
portTickType xLastWakeTime;
static void positionTrackerTask(void *params) {
PositionTracker *newPT=(PositionTracker *)params; //typecasting back from (void *) to (PositionTracker *)
//setCarTargetPosition(400);
//prevstate=GPIO_ReadInputDataBit(newPT->gpio,newPT->pin);
for (;;) {
xLastWakeTime = xTaskGetTickCount();
presentstate = GPIO_ReadInputDataBit(newPT->gpio, newPT->pin); // reads pin 9
if (presentstate > prevsate) {
if(xSemaphoreTake(newPT->lock, portMAX_DELAY)){
if (newPT->direction == Up) {
newPT->position++;
}
else if (newPT->direction == Down) {
newPT->position--;
}
else if (newPT->position == Unknown) {
newPT->position = newPT->position;
// printf("Nothing\n");
}
printf("%ld\n",newPT->position);
xSemaphoreGive(newPT->lock);
}
else printf("Semaphore take failed\n");
}
prevsate = presentstate;
vTaskDelayUntil(&xLastWakeTime, newPT->pollingPeriod);
}
}
void setupPositionTracker(PositionTracker *tracker,
GPIO_TypeDef * gpio, u16 pin,
portTickType pollingPeriod,
unsigned portBASE_TYPE uxPriority) {
portBASE_TYPE res;
tracker->position = 0;
tracker->lock = xSemaphoreCreateMutex();
assert(tracker->lock != NULL);
tracker->direction = Unknown;
tracker->gpio = gpio;
tracker->pin = pin;
tracker->pollingPeriod = pollingPeriod;
res = xTaskCreate(positionTrackerTask, "position tracker",
80, (void*)tracker, uxPriority, NULL);
assert(res == pdTRUE);
}
void setDirection(PositionTracker *tracker, Direction dir) {
if(xSemaphoreTake( tracker->lock,
portMAX_DELAY )){
tracker->direction=dir;
xSemaphoreGive(tracker->lock);
}
}
s32 getPosition(PositionTracker *tracker) {
return tracker->position;
}