-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpin_listener.c
90 lines (73 loc) · 1.92 KB
/
pin_listener.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
86
87
88
89
90
/**
* Program skeleton for the course "Programming embedded systems"
*
* Lab 1: the elevator control system
*/
/**
* Functions listening for changes of specified pins
*/
#include "FreeRTOS.h"
#include "task.h"
#include "pin_listener.h"
#include "assert.h"
#include <stdbool.h>
int status[9] = {0};
static void pollPin(PinListener *listener, xQueueHandle pinEventQueue)
{
int pin;
if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0) != status[0])
{
pin = 0;
status[pin] = !status[pin];
xQueueSend(pinEventQueue, &pin, portMAX_DELAY);
}
if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1)!= status[1])
{
pin = 1;
status[pin] = !status[pin];
xQueueSend(pinEventQueue, &pin, portMAX_DELAY);
}
if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2)!= status[2])
{
pin = 2;
status[pin] = !status[pin];
xQueueSend(pinEventQueue, &pin, portMAX_DELAY);
}
if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3)!= status[3])
{
pin = 3;
status[pin] = !status[pin];
xQueueSend(pinEventQueue, &pin, portMAX_DELAY);
}
if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7)!= status[7])
{
pin = 7;
status[pin] = !status[pin];
if(status[pin])
xQueueSend(pinEventQueue, &pin, portMAX_DELAY);
}
if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8)!= status[8])
{
pin = 8;
status[pin] = !status[pin];
xQueueSend(pinEventQueue, &pin, portMAX_DELAY);
}
}
static void pollPinsTask(void *params) {
PinListenerSet listeners = *((PinListenerSet*)params);
portTickType xLastWakeTime;
int i;
xLastWakeTime = xTaskGetTickCount();
for (;;) {
for (i = 0; i < listeners.num; ++i)
pollPin(listeners.listeners + i, listeners.pinEventQueue);
vTaskDelayUntil(&xLastWakeTime, listeners.pollingPeriod);
}
}
void setupPinListeners(PinListenerSet *listenerSet) {
portBASE_TYPE res;
res = xTaskCreate(pollPinsTask, "pin polling",
100, (void*)listenerSet,
listenerSet->uxPriority, NULL);
assert(res == pdTRUE);
}