Library used during 1 day workshops presented by Skool and ARM Hungary in 2015.

Fork of Skool_wkshp_lib2015 by Laszlo Vagasi

Committer:
lvagasi
Date:
Thu Oct 01 19:17:25 2015 +0000
Revision:
1:68d1a8c4970b
Parent:
0:3ad0af8abf43
Almost complete version. Functionally working. Sometimes some keys are repeated. There is no value check.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lvagasi 0:3ad0af8abf43 1 #include "rtc.h"
lvagasi 0:3ad0af8abf43 2 #include "menu.h"
lvagasi 0:3ad0af8abf43 3 #include "serial_lcd.h"
lvagasi 0:3ad0af8abf43 4 #include "keypad.h"
lvagasi 0:3ad0af8abf43 5
lvagasi 0:3ad0af8abf43 6 HAL_StatusTypeDef HAL_status;
lvagasi 0:3ad0af8abf43 7 HAL_LockTypeDef HAL_lock;
lvagasi 0:3ad0af8abf43 8 RTC_HandleTypeDef rtch;
lvagasi 0:3ad0af8abf43 9 HAL_RTCStateTypeDef rtc_state;
lvagasi 0:3ad0af8abf43 10 RTC_InitTypeDef rtc_init;
lvagasi 0:3ad0af8abf43 11 RTC_TimeTypeDef rtc_time;
lvagasi 0:3ad0af8abf43 12 RTC_DateTypeDef rtc_date;
lvagasi 0:3ad0af8abf43 13 RTC_AlarmTypeDef rtc_alarm;
lvagasi 0:3ad0af8abf43 14 volatile int tmp_date, tmp_sec;
lvagasi 0:3ad0af8abf43 15 volatile int AlarmA_Enabled = 0;
lvagasi 0:3ad0af8abf43 16 volatile int AlarmA_triggered = 0;
lvagasi 0:3ad0af8abf43 17 extern FSM_State Main_FSM_States;
lvagasi 0:3ad0af8abf43 18
lvagasi 0:3ad0af8abf43 19 const char BCD2HEX[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
lvagasi 1:68d1a8c4970b 20 const char DOW[8][3] = { {' ',' ',' '}, {'H',' ',' '}, {'K',' ',' '}, {'S','z','e'}, {'C','s',' '}, {'P',' ',' '}, {'S','z','o'}, {'V',' ',' '} };
lvagasi 0:3ad0af8abf43 21 const char Yes_No[16] = {'*',':','O','K',' ',' ',' ',' ',' ','#',':','M',0x82,'g','s','e'};//"*:OK #:Mégse"};
lvagasi 0:3ad0af8abf43 22
lvagasi 0:3ad0af8abf43 23 void RTC_AlarmAEventCallback(void) {
lvagasi 0:3ad0af8abf43 24 AlarmA_triggered = 1;
lvagasi 0:3ad0af8abf43 25 }
lvagasi 0:3ad0af8abf43 26
lvagasi 0:3ad0af8abf43 27 void RTC_AlarmIRQHandler(void) {
lvagasi 0:3ad0af8abf43 28 if(RTC->ISR & RTC_ISR_ALRAF) {
lvagasi 0:3ad0af8abf43 29 /* Get the status of the Interrupt */
lvagasi 0:3ad0af8abf43 30 if ((RTC->CR & RTC_IT_ALRA) != 0) {
lvagasi 0:3ad0af8abf43 31 /* AlarmA callback */
lvagasi 0:3ad0af8abf43 32 RTC_AlarmAEventCallback();
lvagasi 0:3ad0af8abf43 33
lvagasi 0:3ad0af8abf43 34 /* Clear the Alarm interrupt pending bit */
lvagasi 0:3ad0af8abf43 35 RTC->ISR &= ~(RTC_FLAG_ALRAF);
lvagasi 0:3ad0af8abf43 36 }
lvagasi 0:3ad0af8abf43 37 }
lvagasi 0:3ad0af8abf43 38
lvagasi 0:3ad0af8abf43 39 /* Clear the EXTI's line Flag for RTC Alarm */
lvagasi 0:3ad0af8abf43 40 EXTI->PR = RTC_EXTI_LINE_ALARM_EVENT;
lvagasi 0:3ad0af8abf43 41 __HAL_RTC_CLEAR_FLAG(RTC_EXTI_LINE_ALARM_EVENT);
lvagasi 0:3ad0af8abf43 42
lvagasi 0:3ad0af8abf43 43 /* Change RTC state */
lvagasi 0:3ad0af8abf43 44 rtch.State = HAL_RTC_STATE_READY;
lvagasi 0:3ad0af8abf43 45 }
lvagasi 0:3ad0af8abf43 46
lvagasi 0:3ad0af8abf43 47 void ShowAlarm(void) {
lvagasi 0:3ad0af8abf43 48 char tt[16];
lvagasi 0:3ad0af8abf43 49
lvagasi 0:3ad0af8abf43 50 write_ser_lcd(0x01, false); // Clear display
lvagasi 0:3ad0af8abf43 51 wait_us(1100);
lvagasi 0:3ad0af8abf43 52 write_ser_lcd(0x06, false); // Entry mode set
lvagasi 0:3ad0af8abf43 53 wait_us(30);
lvagasi 0:3ad0af8abf43 54 write_ser_lcd(0x80, false); // set DDRAM addr to 0x00, beginning of 1st line
lvagasi 0:3ad0af8abf43 55 tt[0] = BCD2HEX[((rtc_alarm.AlarmTime.Hours & 0xF0) >> 4)];
lvagasi 0:3ad0af8abf43 56 tt[1] = BCD2HEX[(rtc_alarm.AlarmTime.Hours & 0x0F)];
lvagasi 0:3ad0af8abf43 57 tt[2] = ':';
lvagasi 0:3ad0af8abf43 58 tt[3] = BCD2HEX[((rtc_alarm.AlarmTime.Minutes & 0xF0) >> 4)];
lvagasi 0:3ad0af8abf43 59 tt[4] = BCD2HEX[(rtc_alarm.AlarmTime.Minutes & 0x0F)];
lvagasi 0:3ad0af8abf43 60 tt[5] = ':';
lvagasi 0:3ad0af8abf43 61 tt[6] = BCD2HEX[((rtc_alarm.AlarmTime.Seconds & 0xF0) >> 4)];
lvagasi 0:3ad0af8abf43 62 tt[7] = BCD2HEX[(rtc_alarm.AlarmTime.Seconds & 0x0F)];
lvagasi 0:3ad0af8abf43 63 tt[8] = ' ';
lvagasi 1:68d1a8c4970b 64 tt[9] = DOW[rtc_alarm.AlarmDateWeekDay][0];
lvagasi 1:68d1a8c4970b 65 tt[10] = DOW[rtc_alarm.AlarmDateWeekDay][1];
lvagasi 1:68d1a8c4970b 66 tt[11] = DOW[rtc_alarm.AlarmDateWeekDay][2];
lvagasi 0:3ad0af8abf43 67 write_ser_text(tt, 12);
lvagasi 0:3ad0af8abf43 68 write_ser_lcd(0xC0, false);
lvagasi 0:3ad0af8abf43 69 wait_us(30);
lvagasi 0:3ad0af8abf43 70 write_ser_text(Yes_No, 16);
lvagasi 0:3ad0af8abf43 71 }
lvagasi 0:3ad0af8abf43 72
lvagasi 0:3ad0af8abf43 73 void ShowTime(void) {
lvagasi 0:3ad0af8abf43 74 char tt[16];
lvagasi 0:3ad0af8abf43 75
lvagasi 0:3ad0af8abf43 76 write_ser_lcd(0x80, false); // set DDRAM addr to 0x00, beginning of 1st line
lvagasi 0:3ad0af8abf43 77 tt[0] = BCD2HEX[((rtc_time.Hours & 0xF0) >> 4)];
lvagasi 0:3ad0af8abf43 78 tt[1] = BCD2HEX[(rtc_time.Hours & 0x0F)];
lvagasi 0:3ad0af8abf43 79 tt[2] = ':';
lvagasi 0:3ad0af8abf43 80 tt[3] = BCD2HEX[((rtc_time.Minutes & 0xF0) >> 4)];
lvagasi 0:3ad0af8abf43 81 tt[4] = BCD2HEX[(rtc_time.Minutes & 0x0F)];
lvagasi 0:3ad0af8abf43 82 tt[5] = ':';
lvagasi 0:3ad0af8abf43 83 tt[6] = BCD2HEX[((rtc_time.Seconds & 0xF0) >> 4)];
lvagasi 0:3ad0af8abf43 84 tt[7] = BCD2HEX[(rtc_time.Seconds & 0x0F)];
lvagasi 0:3ad0af8abf43 85 tmp_sec = rtc_time.Seconds;
lvagasi 0:3ad0af8abf43 86 tt[8] = ' ';
lvagasi 0:3ad0af8abf43 87 if (AlarmA_Enabled) {
lvagasi 0:3ad0af8abf43 88 tt[9] = 0x01;
lvagasi 0:3ad0af8abf43 89 } else {
lvagasi 0:3ad0af8abf43 90 tt[9] = ' ';
lvagasi 0:3ad0af8abf43 91 }
lvagasi 0:3ad0af8abf43 92 write_ser_text(tt, 10);
lvagasi 0:3ad0af8abf43 93 }
lvagasi 0:3ad0af8abf43 94
lvagasi 0:3ad0af8abf43 95 void ShowDate(void) {
lvagasi 0:3ad0af8abf43 96 char tt[16];
lvagasi 0:3ad0af8abf43 97
lvagasi 0:3ad0af8abf43 98 write_ser_lcd(0xC0, false); // set DDRAM addr to 0x00, beginning of 1st line
lvagasi 0:3ad0af8abf43 99 tt[0] = BCD2HEX[2];
lvagasi 0:3ad0af8abf43 100 tt[1] = BCD2HEX[0];
lvagasi 0:3ad0af8abf43 101 tt[2] = BCD2HEX[((rtc_date.Year & 0xF0) >> 4)];
lvagasi 0:3ad0af8abf43 102 tt[3] = BCD2HEX[(rtc_date.Year & 0x0F)];
lvagasi 0:3ad0af8abf43 103 tt[4] = '.';
lvagasi 0:3ad0af8abf43 104 tt[5] = BCD2HEX[((rtc_date.Month & 0xF0) >> 4)];
lvagasi 0:3ad0af8abf43 105 tt[6] = BCD2HEX[(rtc_date.Month & 0x0F)];
lvagasi 0:3ad0af8abf43 106 tt[7] = '.';
lvagasi 0:3ad0af8abf43 107 tt[8] = BCD2HEX[((rtc_date.Date & 0xF0) >> 4)];
lvagasi 0:3ad0af8abf43 108 tt[9] = BCD2HEX[(rtc_date.Date & 0x0F)];
lvagasi 0:3ad0af8abf43 109 tt[10] = '.';
lvagasi 0:3ad0af8abf43 110 tmp_date = rtc_date.Date;
lvagasi 0:3ad0af8abf43 111 tt[11] = ' ';
lvagasi 1:68d1a8c4970b 112 tt[12] = DOW[rtc_date.WeekDay][0];
lvagasi 1:68d1a8c4970b 113 tt[13] = DOW[rtc_date.WeekDay][1];
lvagasi 1:68d1a8c4970b 114 tt[14] = DOW[rtc_date.WeekDay][2];
lvagasi 0:3ad0af8abf43 115 write_ser_text(tt,15);
lvagasi 0:3ad0af8abf43 116 }
lvagasi 0:3ad0af8abf43 117
lvagasi 0:3ad0af8abf43 118 void ShowTimeforSet(char * tt) {
lvagasi 0:3ad0af8abf43 119 write_ser_lcd(0x01, false); // Clear display
lvagasi 0:3ad0af8abf43 120 wait_us(1100);
lvagasi 0:3ad0af8abf43 121 write_ser_lcd(0x06, false); // Entry mode set
lvagasi 0:3ad0af8abf43 122 wait_us(30);
lvagasi 0:3ad0af8abf43 123 write_ser_lcd(0x0E, false); // Display ON, Cursor ON, Blink OFF
lvagasi 0:3ad0af8abf43 124 wait_us(30);
lvagasi 0:3ad0af8abf43 125 write_ser_lcd(0x80, false); // set DDRAM addr to 0x00, beginning of 1st line
lvagasi 0:3ad0af8abf43 126 tt[0] = BCD2HEX[((rtc_time.Hours & 0xF0) >> 4)];
lvagasi 0:3ad0af8abf43 127 tt[1] = BCD2HEX[(rtc_time.Hours & 0x0F)];
lvagasi 0:3ad0af8abf43 128 tt[2] = ':';
lvagasi 0:3ad0af8abf43 129 tt[3] = BCD2HEX[((rtc_time.Minutes & 0xF0) >> 4)];
lvagasi 0:3ad0af8abf43 130 tt[4] = BCD2HEX[(rtc_time.Minutes & 0x0F)];
lvagasi 0:3ad0af8abf43 131 tt[5] = ':';
lvagasi 0:3ad0af8abf43 132 tt[6] = BCD2HEX[((rtc_time.Seconds & 0xF0) >> 4)];
lvagasi 0:3ad0af8abf43 133 tt[7] = BCD2HEX[(rtc_time.Seconds & 0x0F)];
lvagasi 0:3ad0af8abf43 134 write_ser_text(tt, 8);
lvagasi 0:3ad0af8abf43 135 write_ser_lcd(0x80, false); // set DDRAM addr to 0x00, beginning of 1st line
lvagasi 0:3ad0af8abf43 136 }
lvagasi 0:3ad0af8abf43 137
lvagasi 0:3ad0af8abf43 138 void ShowAlarmforSet(char * tt) {
lvagasi 0:3ad0af8abf43 139 write_ser_lcd(0x01, false); // Clear display
lvagasi 0:3ad0af8abf43 140 wait_us(1100);
lvagasi 0:3ad0af8abf43 141 write_ser_lcd(0x06, false); // Entry mode set
lvagasi 0:3ad0af8abf43 142 wait_us(30);
lvagasi 0:3ad0af8abf43 143 write_ser_lcd(0x0E, false); // Display ON, Cursor ON, Blink OFF
lvagasi 0:3ad0af8abf43 144 wait_us(30);
lvagasi 0:3ad0af8abf43 145 write_ser_lcd(0x80, false); // set DDRAM addr to 0x00, beginning of 1st line
lvagasi 0:3ad0af8abf43 146 tt[0] = BCD2HEX[((rtc_alarm.AlarmTime.Hours & 0xF0) >> 4)];
lvagasi 0:3ad0af8abf43 147 tt[1] = BCD2HEX[(rtc_alarm.AlarmTime.Hours & 0x0F)];
lvagasi 0:3ad0af8abf43 148 tt[2] = ':';
lvagasi 0:3ad0af8abf43 149 tt[3] = BCD2HEX[((rtc_alarm.AlarmTime.Minutes & 0xF0) >> 4)];
lvagasi 0:3ad0af8abf43 150 tt[4] = BCD2HEX[(rtc_alarm.AlarmTime.Minutes & 0x0F)];
lvagasi 0:3ad0af8abf43 151 tt[5] = ':';
lvagasi 0:3ad0af8abf43 152 tt[6] = BCD2HEX[((rtc_alarm.AlarmTime.Seconds & 0xF0) >> 4)];
lvagasi 0:3ad0af8abf43 153 tt[7] = BCD2HEX[(rtc_alarm.AlarmTime.Seconds & 0x0F)];
lvagasi 0:3ad0af8abf43 154 tt[8] = ' ';
lvagasi 1:68d1a8c4970b 155 tt[9] = DOW[rtc_date.WeekDay][0];
lvagasi 1:68d1a8c4970b 156 tt[10] = DOW[rtc_date.WeekDay][1];
lvagasi 1:68d1a8c4970b 157 tt[11] = DOW[rtc_date.WeekDay][2];
lvagasi 0:3ad0af8abf43 158 write_ser_text(tt, 8);
lvagasi 0:3ad0af8abf43 159 write_ser_lcd(0x80, false); // set DDRAM addr to 0x00, beginning of 1st line
lvagasi 0:3ad0af8abf43 160 }
lvagasi 0:3ad0af8abf43 161
lvagasi 0:3ad0af8abf43 162 void ShowDateforSet(char * tt) {
lvagasi 0:3ad0af8abf43 163 write_ser_lcd(0x01, false); // Clear display
lvagasi 0:3ad0af8abf43 164 wait_us(1100);
lvagasi 0:3ad0af8abf43 165 write_ser_lcd(0x06, false); // Entry mode set
lvagasi 0:3ad0af8abf43 166 wait_us(30);
lvagasi 0:3ad0af8abf43 167 write_ser_lcd(0x0E, false); // Display ON, Cursor ON, Blink OFF
lvagasi 0:3ad0af8abf43 168 wait_us(30);
lvagasi 0:3ad0af8abf43 169 write_ser_lcd(0x80, false); // set DDRAM addr to 0x00, beginning of 1st line
lvagasi 0:3ad0af8abf43 170 tt[0] = BCD2HEX[2];
lvagasi 0:3ad0af8abf43 171 tt[1] = BCD2HEX[0];
lvagasi 0:3ad0af8abf43 172 tt[2] = BCD2HEX[((rtc_date.Year & 0xF0) >> 4)];
lvagasi 0:3ad0af8abf43 173 tt[3] = BCD2HEX[(rtc_date.Year & 0x0F)];
lvagasi 0:3ad0af8abf43 174 tt[4] = '.';
lvagasi 0:3ad0af8abf43 175 tt[5] = BCD2HEX[((rtc_date.Month & 0xF0) >> 4)];
lvagasi 0:3ad0af8abf43 176 tt[6] = BCD2HEX[(rtc_date.Month & 0x0F)];
lvagasi 0:3ad0af8abf43 177 tt[7] = '.';
lvagasi 0:3ad0af8abf43 178 tt[8] = BCD2HEX[((rtc_date.Date & 0xF0) >> 4)];
lvagasi 0:3ad0af8abf43 179 tt[9] = BCD2HEX[(rtc_date.Date & 0x0F)];
lvagasi 0:3ad0af8abf43 180 tt[10] = '.';
lvagasi 0:3ad0af8abf43 181 tt[11] = ' ';
lvagasi 1:68d1a8c4970b 182 tt[12] = DOW[rtc_date.WeekDay][0];
lvagasi 1:68d1a8c4970b 183 tt[13] = DOW[rtc_date.WeekDay][1];
lvagasi 1:68d1a8c4970b 184 tt[14] = DOW[rtc_date.WeekDay][2];
lvagasi 0:3ad0af8abf43 185 write_ser_text(tt,15);
lvagasi 0:3ad0af8abf43 186 write_ser_lcd(0x82, false); // set DDRAM addr to 0x00, beginning of 1st line
lvagasi 0:3ad0af8abf43 187 }
lvagasi 0:3ad0af8abf43 188
lvagasi 0:3ad0af8abf43 189 void InitRTC(void) {
lvagasi 0:3ad0af8abf43 190 uint32_t dummy;
lvagasi 0:3ad0af8abf43 191
lvagasi 0:3ad0af8abf43 192 rtc_init.AsynchPrediv = 0x7F;
lvagasi 0:3ad0af8abf43 193 rtc_init.SynchPrediv = 0xFF;
lvagasi 0:3ad0af8abf43 194 rtc_init.HourFormat = RTC_HOURFORMAT_24;
lvagasi 0:3ad0af8abf43 195 rtc_init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
lvagasi 0:3ad0af8abf43 196 rtc_init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
lvagasi 0:3ad0af8abf43 197 rtc_init.OutPut = RTC_OUTPUT_DISABLE;
lvagasi 0:3ad0af8abf43 198
lvagasi 0:3ad0af8abf43 199 rtc_date.Date = 27;
lvagasi 0:3ad0af8abf43 200 rtc_date.Month = 05;
lvagasi 0:3ad0af8abf43 201 rtc_date.WeekDay = 2;
lvagasi 0:3ad0af8abf43 202 rtc_date.Year = 14;
lvagasi 0:3ad0af8abf43 203 tmp_date = 27;
lvagasi 0:3ad0af8abf43 204
lvagasi 0:3ad0af8abf43 205 rtc_time.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
lvagasi 0:3ad0af8abf43 206 rtc_time.Hours = 00;
lvagasi 0:3ad0af8abf43 207 rtc_time.Minutes = 25;
lvagasi 0:3ad0af8abf43 208 rtc_time.Seconds = 00;
lvagasi 0:3ad0af8abf43 209 rtc_time.StoreOperation =RTC_STOREOPERATION_SET;
lvagasi 0:3ad0af8abf43 210 tmp_sec = 0;
lvagasi 0:3ad0af8abf43 211
lvagasi 0:3ad0af8abf43 212 rtch.Instance = RTC;
lvagasi 0:3ad0af8abf43 213 rtch.Init = rtc_init;
lvagasi 0:3ad0af8abf43 214 rtch.Lock = HAL_lock;
lvagasi 0:3ad0af8abf43 215 rtch.State = rtc_state;
lvagasi 0:3ad0af8abf43 216
lvagasi 0:3ad0af8abf43 217 __PWR_CLK_ENABLE();
lvagasi 0:3ad0af8abf43 218 HAL_PWR_EnableBkUpAccess();
lvagasi 0:3ad0af8abf43 219 __HAL_RCC_LSE_CONFIG(RCC_LSE_ON);
lvagasi 0:3ad0af8abf43 220 __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE);
lvagasi 0:3ad0af8abf43 221 dummy = RCC->BDCR;
lvagasi 0:3ad0af8abf43 222 dummy |= RCC_BDCR_RTCEN;
lvagasi 0:3ad0af8abf43 223 RCC->BDCR = dummy;
lvagasi 0:3ad0af8abf43 224 // __HAL_RCC_RTC_ENABLE();
lvagasi 0:3ad0af8abf43 225 EXTI->PR = RTC_EXTI_LINE_ALARM_EVENT;
lvagasi 0:3ad0af8abf43 226 RTC->ISR &= ~(RTC_FLAG_ALRAF);
lvagasi 0:3ad0af8abf43 227 HAL_RTC_Init(&rtch);
lvagasi 0:3ad0af8abf43 228 dummy = (RTC->BKP15R & 0x00000007);
lvagasi 0:3ad0af8abf43 229 AlarmA_Enabled = ((dummy & 0x00000004) == 1);
lvagasi 0:3ad0af8abf43 230 if (dummy == 0x0) {
lvagasi 0:3ad0af8abf43 231 HAL_RTC_SetDate(&rtch, &rtc_date, FORMAT_BIN);
lvagasi 0:3ad0af8abf43 232 HAL_RTC_SetTime(&rtch, &rtc_time, FORMAT_BIN);
lvagasi 0:3ad0af8abf43 233 }
lvagasi 0:3ad0af8abf43 234 }
lvagasi 0:3ad0af8abf43 235
lvagasi 0:3ad0af8abf43 236 void AlarmA_Enable(void) {
lvagasi 0:3ad0af8abf43 237 int keypress;
lvagasi 0:3ad0af8abf43 238
lvagasi 0:3ad0af8abf43 239 HAL_RTC_GetAlarm(&rtch, &rtc_alarm, RTC_ALARM_A, FORMAT_BCD);
lvagasi 1:68d1a8c4970b 240 //if (rtc_alarm.AlarmDateWeekDay == 0) { rtc_alarm.AlarmDateWeekDay = 1;} // There was no alarm set yet
lvagasi 0:3ad0af8abf43 241 ShowAlarm();
lvagasi 0:3ad0af8abf43 242 keypress = Poll_keypad_yesno();
lvagasi 0:3ad0af8abf43 243 if (keypress == 0x0C) {
lvagasi 0:3ad0af8abf43 244 HAL_RTC_DeactivateAlarm(&rtch, RTC_ALARM_A);
lvagasi 0:3ad0af8abf43 245 HAL_RTC_SetAlarm_IT(&rtch, &rtc_alarm, FORMAT_BCD);
lvagasi 0:3ad0af8abf43 246 NVIC_SetVector(RTC_Alarm_IRQn, (uint32_t)RTC_AlarmIRQHandler);
lvagasi 0:3ad0af8abf43 247 HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
lvagasi 0:3ad0af8abf43 248 AlarmA_Enabled = 1;
lvagasi 0:3ad0af8abf43 249 RTC->BKP15R |= 0x00000004;
lvagasi 0:3ad0af8abf43 250 }
lvagasi 0:3ad0af8abf43 251 Main_FSM_States = FINISH;
lvagasi 0:3ad0af8abf43 252 }
lvagasi 0:3ad0af8abf43 253
lvagasi 0:3ad0af8abf43 254 void AlarmA_Disable(void) {
lvagasi 0:3ad0af8abf43 255 HAL_RTC_DeactivateAlarm(&rtch, RTC_ALARM_A);
lvagasi 0:3ad0af8abf43 256 AlarmA_Enabled = 0;
lvagasi 0:3ad0af8abf43 257 RTC->BKP15R &= ~(0x00000004);
lvagasi 0:3ad0af8abf43 258 Main_FSM_States = FINISH;
lvagasi 0:3ad0af8abf43 259 }
lvagasi 0:3ad0af8abf43 260
lvagasi 0:3ad0af8abf43 261 void SetRTCTime(void) {
lvagasi 0:3ad0af8abf43 262 int keypress;
lvagasi 0:3ad0af8abf43 263 char TT[8];
lvagasi 0:3ad0af8abf43 264 int index = 0;
lvagasi 0:3ad0af8abf43 265 int exit = 0;
lvagasi 0:3ad0af8abf43 266
lvagasi 0:3ad0af8abf43 267 HAL_RTC_GetTime(&rtch, &rtc_time, FORMAT_BCD);
lvagasi 0:3ad0af8abf43 268 ShowTimeforSet(TT);
lvagasi 0:3ad0af8abf43 269
lvagasi 0:3ad0af8abf43 270 while (exit == 0) {
lvagasi 0:3ad0af8abf43 271 keypress = Poll_keypad_full();
lvagasi 0:3ad0af8abf43 272 switch (keypress) {
lvagasi 0:3ad0af8abf43 273 case '*':
lvagasi 0:3ad0af8abf43 274 if (index > 0) {index--;}
lvagasi 0:3ad0af8abf43 275 if ((index == 2) | (index == 5)) {index--;}
lvagasi 0:3ad0af8abf43 276 break;
lvagasi 0:3ad0af8abf43 277 case '#':
lvagasi 0:3ad0af8abf43 278 if (index < 8) {index++;}
lvagasi 0:3ad0af8abf43 279 if ((index == 2) | (index == 5)) {index++;}
lvagasi 0:3ad0af8abf43 280 if (index == 8) {exit = 1;}
lvagasi 0:3ad0af8abf43 281 break;
lvagasi 0:3ad0af8abf43 282 default:
lvagasi 0:3ad0af8abf43 283 TT[index] = keypress;
lvagasi 0:3ad0af8abf43 284 if (index < 8) {index++;}
lvagasi 0:3ad0af8abf43 285 if ((index == 2) | (index == 5)) {index++;}
lvagasi 0:3ad0af8abf43 286 if (index == 8) {exit = 1;}
lvagasi 0:3ad0af8abf43 287 break;
lvagasi 0:3ad0af8abf43 288 }
lvagasi 0:3ad0af8abf43 289 write_ser_lcd(0x80, false);
lvagasi 0:3ad0af8abf43 290 wait_us(30);
lvagasi 0:3ad0af8abf43 291 write_ser_text(TT,8);
lvagasi 0:3ad0af8abf43 292 write_ser_lcd(0x80 + index, false);
lvagasi 0:3ad0af8abf43 293 }
lvagasi 0:3ad0af8abf43 294 rtc_time.Hours = ((TT[0] - 0x30) << 4) + (TT[1] - 0x30);
lvagasi 0:3ad0af8abf43 295 rtc_time.Minutes = ((TT[3] - 0x30) << 4) + (TT[4] - 0x30);
lvagasi 0:3ad0af8abf43 296 rtc_time.Seconds = ((TT[6] - 0x30) << 4) + (TT[7] - 0x30);
lvagasi 0:3ad0af8abf43 297 HAL_RTC_SetTime(&rtch, &rtc_time, FORMAT_BCD);
lvagasi 0:3ad0af8abf43 298 RTC->BKP15R |= 0x00000001;
lvagasi 0:3ad0af8abf43 299 Main_FSM_States = FINISH;
lvagasi 0:3ad0af8abf43 300 }
lvagasi 0:3ad0af8abf43 301
lvagasi 0:3ad0af8abf43 302 void SetRTCAlarm(void) {
lvagasi 0:3ad0af8abf43 303 int keypress;
lvagasi 0:3ad0af8abf43 304 char TT[12];
lvagasi 0:3ad0af8abf43 305 int index = 0;
lvagasi 0:3ad0af8abf43 306 int exit = 0;
lvagasi 0:3ad0af8abf43 307 int DoW;
lvagasi 0:3ad0af8abf43 308
lvagasi 0:3ad0af8abf43 309 HAL_RTC_GetAlarm(&rtch, &rtc_alarm, RTC_ALARM_A, FORMAT_BCD);
lvagasi 0:3ad0af8abf43 310 DoW = rtc_alarm.AlarmDateWeekDay;
lvagasi 0:3ad0af8abf43 311 rtc_alarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_WEEKDAY; // We only used weekday alarm
lvagasi 0:3ad0af8abf43 312 ShowAlarmforSet(TT);
lvagasi 0:3ad0af8abf43 313
lvagasi 0:3ad0af8abf43 314 while (exit == 0) {
lvagasi 0:3ad0af8abf43 315 keypress = Poll_keypad_full();
lvagasi 0:3ad0af8abf43 316 switch (keypress) {
lvagasi 0:3ad0af8abf43 317 case '*':
lvagasi 0:3ad0af8abf43 318 if (index > 0) {index--;}
lvagasi 0:3ad0af8abf43 319 if ((index == 2) | (index == 5)) {index--;}
lvagasi 0:3ad0af8abf43 320 if (index == 8) {index--;}
lvagasi 0:3ad0af8abf43 321 break;
lvagasi 0:3ad0af8abf43 322 case '#':
lvagasi 0:3ad0af8abf43 323 if (index < 10) {index++;}
lvagasi 0:3ad0af8abf43 324 if ((index == 2) | (index == 5)) {index++;}
lvagasi 0:3ad0af8abf43 325 if (index == 8) {index++;}
lvagasi 0:3ad0af8abf43 326 if (index == 10) {exit = 1;}
lvagasi 0:3ad0af8abf43 327 break;
lvagasi 0:3ad0af8abf43 328 default:
lvagasi 0:3ad0af8abf43 329 if (index < 8) {TT[index] = keypress;} else {
lvagasi 0:3ad0af8abf43 330 DoW = (keypress - 0x30);
lvagasi 0:3ad0af8abf43 331 TT[9] = DOW[DoW][0];
lvagasi 0:3ad0af8abf43 332 TT[10] = DOW[DoW][1];
lvagasi 0:3ad0af8abf43 333 TT[11] = DOW[DoW][2];
lvagasi 0:3ad0af8abf43 334 }
lvagasi 0:3ad0af8abf43 335 if (index < 10) {index++;}
lvagasi 0:3ad0af8abf43 336 if ((index == 2) | (index == 5)) {index++;}
lvagasi 0:3ad0af8abf43 337 if (index == 8) {index++;}
lvagasi 0:3ad0af8abf43 338 if (index == 10) {exit = 1;}
lvagasi 0:3ad0af8abf43 339 break;
lvagasi 0:3ad0af8abf43 340 }
lvagasi 0:3ad0af8abf43 341 write_ser_lcd(0x80, false);
lvagasi 0:3ad0af8abf43 342 wait_us(30);
lvagasi 0:3ad0af8abf43 343 write_ser_text(TT,12);
lvagasi 0:3ad0af8abf43 344 write_ser_lcd(0x80 + index, false);
lvagasi 0:3ad0af8abf43 345 }
lvagasi 0:3ad0af8abf43 346 rtc_alarm.AlarmTime.Hours = ((TT[0] - 0x30) << 4) + (TT[1] - 0x30);
lvagasi 0:3ad0af8abf43 347 rtc_alarm.AlarmTime.Minutes = ((TT[3] - 0x30) << 4) + (TT[4] - 0x30);
lvagasi 0:3ad0af8abf43 348 rtc_alarm.AlarmTime.Seconds = ((TT[6] - 0x30) << 4) + (TT[7] - 0x30);
lvagasi 0:3ad0af8abf43 349 rtc_alarm.AlarmDateWeekDay = DoW;
lvagasi 1:68d1a8c4970b 350 if (DoW == 0x00) {
lvagasi 1:68d1a8c4970b 351 rtc_alarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY; // Alarm is triggered every day, no date or weekday match
lvagasi 1:68d1a8c4970b 352 } else {
lvagasi 1:68d1a8c4970b 353 rtc_alarm.AlarmMask = RTC_ALARMMASK_NONE; // Alarm is triggered when everything match
lvagasi 1:68d1a8c4970b 354 }
lvagasi 0:3ad0af8abf43 355 HAL_RTC_DeactivateAlarm(&rtch, RTC_ALARM_A);
lvagasi 0:3ad0af8abf43 356 HAL_RTC_SetAlarm_IT(&rtch, &rtc_alarm, FORMAT_BCD);
lvagasi 0:3ad0af8abf43 357 NVIC_SetVector(RTC_Alarm_IRQn, (uint32_t)RTC_AlarmIRQHandler);
lvagasi 0:3ad0af8abf43 358 HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
lvagasi 0:3ad0af8abf43 359 RTC->BKP15R |= 0x00000006;
lvagasi 0:3ad0af8abf43 360 AlarmA_Enabled = 1;
lvagasi 0:3ad0af8abf43 361 Main_FSM_States = FINISH;
lvagasi 0:3ad0af8abf43 362 }
lvagasi 0:3ad0af8abf43 363
lvagasi 0:3ad0af8abf43 364 void SetRTCDate(void) {
lvagasi 0:3ad0af8abf43 365 int keypress;
lvagasi 0:3ad0af8abf43 366 char TT[15];
lvagasi 0:3ad0af8abf43 367 int index = 2;
lvagasi 0:3ad0af8abf43 368 int exit = 0;
lvagasi 0:3ad0af8abf43 369 int DoW;
lvagasi 0:3ad0af8abf43 370
lvagasi 0:3ad0af8abf43 371 HAL_RTC_GetDate(&rtch, &rtc_date, FORMAT_BCD);
lvagasi 0:3ad0af8abf43 372 DoW = rtc_date.WeekDay;
lvagasi 0:3ad0af8abf43 373 ShowDateforSet(TT);
lvagasi 0:3ad0af8abf43 374
lvagasi 0:3ad0af8abf43 375 while (exit == 0) {
lvagasi 0:3ad0af8abf43 376 keypress = Poll_keypad_full();
lvagasi 0:3ad0af8abf43 377 switch (keypress) {
lvagasi 0:3ad0af8abf43 378 case '*':
lvagasi 0:3ad0af8abf43 379 if (index > 2) {index--;}
lvagasi 0:3ad0af8abf43 380 if ((index == 4) | (index == 7)) {index--;}
lvagasi 0:3ad0af8abf43 381 if (index == 11) {index -= 2;}
lvagasi 0:3ad0af8abf43 382 break;
lvagasi 0:3ad0af8abf43 383 case '#':
lvagasi 0:3ad0af8abf43 384 if (index < 13) {index++;}
lvagasi 0:3ad0af8abf43 385 if ((index == 4) | (index == 7)) {index++;}
lvagasi 0:3ad0af8abf43 386 if (index == 10) {index += 2;}
lvagasi 0:3ad0af8abf43 387 if (index == 13) {exit = 1;}
lvagasi 0:3ad0af8abf43 388 break;
lvagasi 0:3ad0af8abf43 389 default:
lvagasi 0:3ad0af8abf43 390 if (index < 10) {TT[index] = keypress;} else {
lvagasi 0:3ad0af8abf43 391 DoW = (keypress - 0x30);
lvagasi 0:3ad0af8abf43 392 TT[12] = DOW[DoW][0];
lvagasi 0:3ad0af8abf43 393 TT[13] = DOW[DoW][1];
lvagasi 0:3ad0af8abf43 394 TT[14] = DOW[DoW][2];
lvagasi 0:3ad0af8abf43 395 }
lvagasi 0:3ad0af8abf43 396 if (index < 13) {index++;}
lvagasi 0:3ad0af8abf43 397 if ((index == 4) | (index == 7)) {index++;}
lvagasi 0:3ad0af8abf43 398 if (index == 10) {index += 2;}
lvagasi 0:3ad0af8abf43 399 if (index == 13) {exit = 1;}
lvagasi 0:3ad0af8abf43 400 break;
lvagasi 0:3ad0af8abf43 401 }
lvagasi 0:3ad0af8abf43 402 write_ser_lcd(0x80, false);
lvagasi 0:3ad0af8abf43 403 wait_us(30);
lvagasi 1:68d1a8c4970b 404 write_ser_text(TT,15);
lvagasi 0:3ad0af8abf43 405 write_ser_lcd(0x80 + index, false);
lvagasi 0:3ad0af8abf43 406 }
lvagasi 0:3ad0af8abf43 407 rtc_date.Year = ((TT[2] - 0x30) << 4) + (TT[3] - 0x30);
lvagasi 0:3ad0af8abf43 408 rtc_date.Month = ((TT[5] - 0x30) << 4) + (TT[6] - 0x30);
lvagasi 0:3ad0af8abf43 409 rtc_date.Date = ((TT[8] - 0x30) << 4) + (TT[9] - 0x30);
lvagasi 0:3ad0af8abf43 410 rtc_date.WeekDay = DoW;
lvagasi 0:3ad0af8abf43 411 HAL_RTC_SetDate(&rtch, &rtc_date, FORMAT_BCD);
lvagasi 0:3ad0af8abf43 412 RTC->BKP15R |= 0x00000001;
lvagasi 0:3ad0af8abf43 413 Main_FSM_States = FINISH;
lvagasi 0:3ad0af8abf43 414 }