forked from sapozhnikov/eclock
/
buttons.c
110 lines (96 loc) · 2.29 KB
/
buttons.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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include "cmsis_os.h"
#include "GPIO_LPC17xx.h"
#include <stdbool.h>
#include "buttons.h"
#include "bits.h"
#include "iap.h"
#include "leds_control.h"
#define TASK_LED ledGreen
#define IMG_START_SECTOR 0x00010000 //Sector 16
uint8_t flashImage[IAP_FLASH_PAGE_SIZE_BYTES];
ButtonsState_t buttonsState;
extern int8_t utcOffset;
extern osThreadId displayThreadId;
void button1PressEvent(void);
void button2PressEvent(void);
void saveUtcOffsetToFlash(void);
void loadUtcOffsetFromFlash(void);
void buttonsInit()
{
GPIO_SetDir(0, 0, GPIO_DIR_INPUT);
GPIO_SetDir(0, 1, GPIO_DIR_INPUT);
buttonsState.button1pressed = false;
buttonsState.button2pressed = false;
loadUtcOffsetFromFlash();
}
void checkButtonsState()
{
if (!GPIO_PinRead(0, 0))
{
if (buttonsState.button1pressed == false)
{
//button pressed
buttonsState.button1pressed = true;
button1PressEvent();
}
}
else
buttonsState.button1pressed = false;
if (!GPIO_PinRead(0, 1))
{
if (buttonsState.button2pressed == false)
{
//button pressed
buttonsState.button2pressed = true;
button2PressEvent();
}
}
else
buttonsState.button2pressed = false;
}
void button1PressEvent()
{
utcOffset--;
if (utcOffset < -12)
utcOffset = 12;
osSignalSet (displayThreadId, FLAG_UPDATE_DISPLAY);
saveUtcOffsetToFlash();
}
void button2PressEvent()
{
utcOffset++;
if (utcOffset > 12)
utcOffset = -12;
osSignalSet (displayThreadId, FLAG_UPDATE_DISPLAY);
saveUtcOffsetToFlash();
}
void saveUtcOffsetToFlash()
{
flashImage[0] = utcOffset;
__disable_irq();
if(u32IAP_PrepareSectors(16, 16) == IAP_STA_CMD_SUCCESS)
{
u32IAP_EraseSectors(16, 16);
u32IAP_PrepareSectors(16, 16);
if(u32IAP_CopyRAMToFlash(IMG_START_SECTOR, (uint32_t)flashImage, IAP_FLASH_PAGE_SIZE_BYTES) == IAP_STA_CMD_SUCCESS)
{
if(u32IAP_Compare(IMG_START_SECTOR, (uint32_t)flashImage, IAP_FLASH_PAGE_SIZE_BYTES, 0) == IAP_STA_CMD_SUCCESS)
{
__enable_irq();
ledSetState(TASK_LED, LedOn);
return;
}
}
}
__enable_irq();
ledSetState(TASK_LED, LedBlink);
}
void loadUtcOffsetFromFlash()
{
utcOffset = *(int8_t *)IMG_START_SECTOR;
if ((utcOffset < -12) || (utcOffset > 12))
{
utcOffset = 0;
ledSetState(TASK_LED, LedBlink);
}
}