FRDM-KL46Z board sLCD demo code
Fork of FRDM-KL46Z LCD rtc Demo by
main.cpp@6:10b73ebdba3d, 2014-09-29 (annotated)
- Committer:
- salemtang
- Date:
- Mon Sep 29 15:24:17 2014 +0000
- Revision:
- 6:10b73ebdba3d
- Parent:
- 5:15c484c41006
- Child:
- 7:33a8bfcbe3be
20140930_0024 modified
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
salemtang | 4:15da67d64f85 | 1 | #ifndef RTC_CLOCK_TEST |
salemtang | 4:15da67d64f85 | 2 | //#define RTC_CLOCK_TEST |
salemtang | 6:10b73ebdba3d | 3 | #endif // RTC_CLOCK_TEST |
salemtang | 4:15da67d64f85 | 4 | #ifndef LED_BLINK_TEST |
salemtang | 4:15da67d64f85 | 5 | //#define LED_BLINK_TEST |
salemtang | 6:10b73ebdba3d | 6 | #endif // LED_BLINK_TEST |
salemtang | 6:10b73ebdba3d | 7 | /** |
salemtang | 6:10b73ebdba3d | 8 | * @file main.cpp |
salemtang | 6:10b73ebdba3d | 9 | * @brief Abstract |
salemtang | 6:10b73ebdba3d | 10 | * @copyright (c) |
salemtang | 6:10b73ebdba3d | 11 | */ |
salemtang | 6:10b73ebdba3d | 12 | // ----------------------------------------------------------------------------- |
salemtang | 6:10b73ebdba3d | 13 | // note |
salemtang | 6:10b73ebdba3d | 14 | // ----------------------------------------------------------------------------- |
salemtang | 4:15da67d64f85 | 15 | |
salemtang | 6:10b73ebdba3d | 16 | // ----------------------------------------------------------------------------- |
salemtang | 6:10b73ebdba3d | 17 | // include files |
salemtang | 6:10b73ebdba3d | 18 | // ----------------------------------------------------------------------------- |
salemtang | 4:15da67d64f85 | 19 | #if (defined RTC_CLOCK_TEST) || (defined LED_BLINK_TEST) |
star297 | 0:4f67859595b2 | 20 | #include "mbed.h" |
salemtang | 6:10b73ebdba3d | 21 | #endif // RTC_CLOCK_TEST || LED_BLINK_TEST |
salemtang | 4:15da67d64f85 | 22 | #ifdef RTC_CLOCK_TEST |
star297 | 0:4f67859595b2 | 23 | #include "SLCD.h" |
salemtang | 6:10b73ebdba3d | 24 | #endif // RTC_CLOCK_TEST |
salemtang | 6:10b73ebdba3d | 25 | |
salemtang | 6:10b73ebdba3d | 26 | // ----------------------------------------------------------------------------- |
salemtang | 6:10b73ebdba3d | 27 | // general define |
salemtang | 6:10b73ebdba3d | 28 | // ----------------------------------------------------------------------------- |
star297 | 0:4f67859595b2 | 29 | |
salemtang | 6:10b73ebdba3d | 30 | // ----------------------------------------------------------------------------- |
salemtang | 6:10b73ebdba3d | 31 | // struct define |
salemtang | 6:10b73ebdba3d | 32 | // ----------------------------------------------------------------------------- |
salemtang | 3:fb38dbc95b12 | 33 | |
salemtang | 6:10b73ebdba3d | 34 | // ----------------------------------------------------------------------------- |
salemtang | 6:10b73ebdba3d | 35 | // external function |
salemtang | 6:10b73ebdba3d | 36 | // ----------------------------------------------------------------------------- |
star297 | 0:4f67859595b2 | 37 | |
salemtang | 6:10b73ebdba3d | 38 | // ----------------------------------------------------------------------------- |
salemtang | 6:10b73ebdba3d | 39 | // function prototype |
salemtang | 6:10b73ebdba3d | 40 | // ----------------------------------------------------------------------------- |
salemtang | 4:15da67d64f85 | 41 | #if (defined RTC_CLOCK_TEST) || (defined LED_BLINK_TEST) |
salemtang | 3:fb38dbc95b12 | 42 | void initializeSetting (void); |
salemtang | 6:10b73ebdba3d | 43 | #endif // RTC_CLOCK_TEST || LED_BLINK_TEST |
salemtang | 4:15da67d64f85 | 44 | #ifdef LED_BLINK_TEST |
salemtang | 3:fb38dbc95b12 | 45 | void ledBlink (float dutyfactor); |
salemtang | 6:10b73ebdba3d | 46 | #endif // LED_BLINK_TEST |
salemtang | 4:15da67d64f85 | 47 | #ifdef RTC_CLOCK_TEST |
salemtang | 3:fb38dbc95b12 | 48 | void rtcClock (void); |
salemtang | 3:fb38dbc95b12 | 49 | void scrollMessage (void); |
salemtang | 3:fb38dbc95b12 | 50 | void switchinput1_INTIRQ (void); |
salemtang | 3:fb38dbc95b12 | 51 | void switchinput3_INTIRQ (void); |
salemtang | 6:10b73ebdba3d | 52 | #endif // LED_BLINK_TEST |
salemtang | 3:fb38dbc95b12 | 53 | |
salemtang | 6:10b73ebdba3d | 54 | // ----------------------------------------------------------------------------- |
salemtang | 6:10b73ebdba3d | 55 | // external variable |
salemtang | 6:10b73ebdba3d | 56 | // ----------------------------------------------------------------------------- |
salemtang | 2:678c0be8c23d | 57 | |
salemtang | 6:10b73ebdba3d | 58 | // ----------------------------------------------------------------------------- |
salemtang | 6:10b73ebdba3d | 59 | // global variable |
salemtang | 6:10b73ebdba3d | 60 | // ----------------------------------------------------------------------------- |
salemtang | 4:15da67d64f85 | 61 | #ifdef LED_BLINK_TEST |
salemtang | 3:fb38dbc95b12 | 62 | PwmOut greenled_PO(LED1); |
salemtang | 3:fb38dbc95b12 | 63 | PwmOut redled_PO(LED2); |
salemtang | 3:fb38dbc95b12 | 64 | DigitalIn switchinput1_DI(SW1); |
salemtang | 3:fb38dbc95b12 | 65 | DigitalIn switchinput3_DI(SW3); |
salemtang | 4:15da67d64f85 | 66 | float defaultdutyfactor = 0.0; |
salemtang | 6:10b73ebdba3d | 67 | #endif // LED_BLINK_TEST |
salemtang | 4:15da67d64f85 | 68 | #ifdef RTC_CLOCK_TEST |
salemtang | 4:15da67d64f85 | 69 | DigitalOut greenled_DO(LED1); |
salemtang | 4:15da67d64f85 | 70 | DigitalOut redled_DO(LED2); |
salemtang | 3:fb38dbc95b12 | 71 | InterruptIn switchinput1_INT(SW1); |
salemtang | 3:fb38dbc95b12 | 72 | InterruptIn switchinput3_INT(SW3); |
star297 | 0:4f67859595b2 | 73 | SLCD slcd; |
star297 | 0:4f67859595b2 | 74 | Timer scroll; |
star297 | 0:4f67859595b2 | 75 | struct tm t; |
salemtang | 2:678c0be8c23d | 76 | int i, j, k, lastscroll, display_timer, minute, hour, colon, dp; |
star297 | 1:34f0bfc62803 | 77 | char message[60]; |
star297 | 0:4f67859595b2 | 78 | char buffer[32]; |
salemtang | 6:10b73ebdba3d | 79 | #endif // RTC_CLOCK_TEST |
star297 | 0:4f67859595b2 | 80 | |
salemtang | 6:10b73ebdba3d | 81 | // ----------------------------------------------------------------------------- |
salemtang | 6:10b73ebdba3d | 82 | // function |
salemtang | 6:10b73ebdba3d | 83 | // ----------------------------------------------------------------------------- |
salemtang | 6:10b73ebdba3d | 84 | // ----------------------------------------------------------------------------- |
salemtang | 6:10b73ebdba3d | 85 | //! @brief Main Function |
salemtang | 6:10b73ebdba3d | 86 | //! @param [in] nil |
salemtang | 6:10b73ebdba3d | 87 | //! @retval int |
salemtang | 6:10b73ebdba3d | 88 | // ----------------------------------------------------------------------------- |
salemtang | 6:10b73ebdba3d | 89 | int main (void) |
star297 | 1:34f0bfc62803 | 90 | { |
salemtang | 4:15da67d64f85 | 91 | #if (defined RTC_CLOCK_TEST) || (defined LED_BLINK_TEST) |
salemtang | 3:fb38dbc95b12 | 92 | initializeSetting(); |
salemtang | 6:10b73ebdba3d | 93 | #endif // RTC_CLOCK_TEST || LED_BLINK_TEST |
salemtang | 2:678c0be8c23d | 94 | |
salemtang | 3:fb38dbc95b12 | 95 | while (true) { |
salemtang | 4:15da67d64f85 | 96 | #ifdef RTC_CLOCK_TEST |
salemtang | 3:fb38dbc95b12 | 97 | rtcClock(); |
salemtang | 6:10b73ebdba3d | 98 | #endif // RTC_CLOCK_TEST |
salemtang | 4:15da67d64f85 | 99 | |
salemtang | 4:15da67d64f85 | 100 | #ifdef LED_BLINK_TEST |
salemtang | 3:fb38dbc95b12 | 101 | if (!switchinput1_DI) { |
salemtang | 4:15da67d64f85 | 102 | ledBlink(0.5); |
salemtang | 4:15da67d64f85 | 103 | } else if (!switchinput3_DI) { |
salemtang | 3:fb38dbc95b12 | 104 | ledBlink(1.0); |
star297 | 1:34f0bfc62803 | 105 | } else { |
salemtang | 4:15da67d64f85 | 106 | ledBlink(2.0); |
star297 | 0:4f67859595b2 | 107 | } |
salemtang | 6:10b73ebdba3d | 108 | #endif // LED_BLINK_TEST |
star297 | 0:4f67859595b2 | 109 | } |
star297 | 1:34f0bfc62803 | 110 | } |
star297 | 0:4f67859595b2 | 111 | |
salemtang | 6:10b73ebdba3d | 112 | // ----------------------------------------------------------------------------- |
salemtang | 3:fb38dbc95b12 | 113 | //! @brief Initialize Setting |
salemtang | 6:10b73ebdba3d | 114 | //! @param [in] nil |
salemtang | 3:fb38dbc95b12 | 115 | //! @retval nil |
salemtang | 6:10b73ebdba3d | 116 | // ----------------------------------------------------------------------------- |
salemtang | 4:15da67d64f85 | 117 | #if (defined RTC_CLOCK_TEST) || (defined LED_BLINK_TEST) |
salemtang | 3:fb38dbc95b12 | 118 | void initializeSetting (void) |
salemtang | 3:fb38dbc95b12 | 119 | { |
salemtang | 4:15da67d64f85 | 120 | #ifdef LED_BLINK_TEST |
salemtang | 3:fb38dbc95b12 | 121 | switchinput1_DI.mode(PullUp); |
salemtang | 3:fb38dbc95b12 | 122 | switchinput3_DI.mode(PullUp); |
salemtang | 6:10b73ebdba3d | 123 | #endif // LED_BLINK_TEST |
salemtang | 4:15da67d64f85 | 124 | |
salemtang | 4:15da67d64f85 | 125 | #ifdef RTC_CLOCK_TEST |
salemtang | 4:15da67d64f85 | 126 | time_t seconds = time(NULL); |
salemtang | 3:fb38dbc95b12 | 127 | |
salemtang | 3:fb38dbc95b12 | 128 | slcd.All_Segments(1); |
salemtang | 3:fb38dbc95b12 | 129 | wait(2); |
salemtang | 3:fb38dbc95b12 | 130 | slcd.All_Segments(0); |
salemtang | 3:fb38dbc95b12 | 131 | wait(1); |
salemtang | 3:fb38dbc95b12 | 132 | |
salemtang | 3:fb38dbc95b12 | 133 | greenled_DO = 1; |
salemtang | 3:fb38dbc95b12 | 134 | redled_DO = 1; |
salemtang | 3:fb38dbc95b12 | 135 | |
salemtang | 4:15da67d64f85 | 136 | sprintf(message, " rtc clock sw3 sets the hours sw1 sets the minutes"); |
salemtang | 3:fb38dbc95b12 | 137 | |
salemtang | 3:fb38dbc95b12 | 138 | // scrolling message |
salemtang | 3:fb38dbc95b12 | 139 | scroll.start(); |
salemtang | 3:fb38dbc95b12 | 140 | while (i < 58) { |
salemtang | 3:fb38dbc95b12 | 141 | while (i < 58) { |
salemtang | 3:fb38dbc95b12 | 142 | scrollMessage(); |
salemtang | 3:fb38dbc95b12 | 143 | } |
salemtang | 3:fb38dbc95b12 | 144 | } |
salemtang | 3:fb38dbc95b12 | 145 | wait(1); |
salemtang | 3:fb38dbc95b12 | 146 | |
salemtang | 5:15c484c41006 | 147 | switchinput1_INT.rise(switchinput1_INTIRQ); |
salemtang | 5:15c484c41006 | 148 | switchinput3_INT.rise(switchinput3_INTIRQ); |
salemtang | 6:10b73ebdba3d | 149 | #endif // RTC_CLOCK_TEST |
salemtang | 3:fb38dbc95b12 | 150 | } |
salemtang | 6:10b73ebdba3d | 151 | #endif // RTC_CLOCK_TEST || LED_BLINK_TEST |
salemtang | 3:fb38dbc95b12 | 152 | |
salemtang | 6:10b73ebdba3d | 153 | // ----------------------------------------------------------------------------- |
salemtang | 3:fb38dbc95b12 | 154 | //! @brief LED Blink |
salemtang | 6:10b73ebdba3d | 155 | //! @param [in] dutyfactor Duty Factor Integer |
salemtang | 3:fb38dbc95b12 | 156 | //! @retval nil |
salemtang | 6:10b73ebdba3d | 157 | // ----------------------------------------------------------------------------- |
salemtang | 4:15da67d64f85 | 158 | #ifdef LED_BLINK_TEST |
salemtang | 3:fb38dbc95b12 | 159 | void ledBlink (float dutyfactor) |
salemtang | 3:fb38dbc95b12 | 160 | { |
salemtang | 3:fb38dbc95b12 | 161 | redled_PO.write(defaultdutyfactor); |
salemtang | 3:fb38dbc95b12 | 162 | greenled_PO.write(dutyfactor - defaultdutyfactor); |
salemtang | 6:10b73ebdba3d | 163 | defaultdutyfactor += 0.01; |
salemtang | 3:fb38dbc95b12 | 164 | if (defaultdutyfactor >= dutyfactor) defaultdutyfactor = 0.0; |
salemtang | 6:10b73ebdba3d | 165 | wait(0.5); |
salemtang | 3:fb38dbc95b12 | 166 | } |
salemtang | 4:15da67d64f85 | 167 | #endif |
salemtang | 3:fb38dbc95b12 | 168 | |
salemtang | 6:10b73ebdba3d | 169 | // ----------------------------------------------------------------------------- |
salemtang | 3:fb38dbc95b12 | 170 | //! @brief RTC Clock |
salemtang | 6:10b73ebdba3d | 171 | //! @param [in] nil |
salemtang | 3:fb38dbc95b12 | 172 | //! @retval nil |
salemtang | 6:10b73ebdba3d | 173 | // ----------------------------------------------------------------------------- |
salemtang | 4:15da67d64f85 | 174 | #ifdef RTC_CLOCK_TEST |
salemtang | 3:fb38dbc95b12 | 175 | void rtcClock (void) |
salemtang | 3:fb38dbc95b12 | 176 | { |
salemtang | 3:fb38dbc95b12 | 177 | time_t seconds = time(NULL); |
salemtang | 3:fb38dbc95b12 | 178 | |
salemtang | 3:fb38dbc95b12 | 179 | if (display_timer > 6) { |
salemtang | 5:15c484c41006 | 180 | // display Hours,Minutes for 2 seconds |
salemtang | 5:15c484c41006 | 181 | strftime(buffer, 4, "%H%M", localtime(&seconds)); |
salemtang | 3:fb38dbc95b12 | 182 | slcd.Colon(1); |
salemtang | 3:fb38dbc95b12 | 183 | redled_DO = 0; |
salemtang | 3:fb38dbc95b12 | 184 | slcd.DP2(0); |
salemtang | 3:fb38dbc95b12 | 185 | greenled_DO = 1; |
salemtang | 3:fb38dbc95b12 | 186 | } else { |
salemtang | 5:15c484c41006 | 187 | // display Minutes,Seconds for 8 seconds |
salemtang | 5:15c484c41006 | 188 | strftime(buffer, 4, "%M%S", localtime(&seconds)); |
salemtang | 3:fb38dbc95b12 | 189 | slcd.Colon(0); |
salemtang | 3:fb38dbc95b12 | 190 | redled_DO = 1; |
salemtang | 3:fb38dbc95b12 | 191 | slcd.DP2(1); |
salemtang | 3:fb38dbc95b12 | 192 | greenled_DO = 0; |
salemtang | 3:fb38dbc95b12 | 193 | } |
salemtang | 3:fb38dbc95b12 | 194 | |
salemtang | 3:fb38dbc95b12 | 195 | slcd.printf(buffer); |
salemtang | 3:fb38dbc95b12 | 196 | wait(0.5); |
salemtang | 3:fb38dbc95b12 | 197 | slcd.DP2(0); |
salemtang | 3:fb38dbc95b12 | 198 | greenled_DO = 1; |
salemtang | 3:fb38dbc95b12 | 199 | display_timer++; |
salemtang | 3:fb38dbc95b12 | 200 | if (display_timer > 9) display_timer = 0; |
salemtang | 3:fb38dbc95b12 | 201 | wait(0.5); |
salemtang | 3:fb38dbc95b12 | 202 | } |
salemtang | 6:10b73ebdba3d | 203 | #endif // RTC_CLOCK_TEST |
salemtang | 3:fb38dbc95b12 | 204 | |
salemtang | 6:10b73ebdba3d | 205 | // ----------------------------------------------------------------------------- |
salemtang | 3:fb38dbc95b12 | 206 | //! @brief Scroll Message |
salemtang | 6:10b73ebdba3d | 207 | //! @param [in] nil |
salemtang | 3:fb38dbc95b12 | 208 | //! @retval nil |
salemtang | 6:10b73ebdba3d | 209 | // ----------------------------------------------------------------------------- |
salemtang | 4:15da67d64f85 | 210 | #ifdef RTC_CLOCK_TEST |
salemtang | 3:fb38dbc95b12 | 211 | void scrollMessage (void) |
star297 | 0:4f67859595b2 | 212 | { |
star297 | 1:34f0bfc62803 | 213 | if (scroll.read_ms() > lastscroll + 350) { |
star297 | 0:4f67859595b2 | 214 | scroll.reset(); |
star297 | 1:34f0bfc62803 | 215 | if (i > 58) { |
salemtang | 4:15da67d64f85 | 216 | i = 0; |
star297 | 0:4f67859595b2 | 217 | } |
star297 | 0:4f67859595b2 | 218 | int j, k = i; |
star297 | 0:4f67859595b2 | 219 | for (j = 0; j < 4; j++) { |
star297 | 0:4f67859595b2 | 220 | if (message[k+j]) { |
star297 | 0:4f67859595b2 | 221 | slcd.putc(message[k+j]); |
star297 | 0:4f67859595b2 | 222 | } else { |
star297 | 0:4f67859595b2 | 223 | slcd.putc(' '); |
star297 | 0:4f67859595b2 | 224 | k--; |
star297 | 0:4f67859595b2 | 225 | } |
star297 | 0:4f67859595b2 | 226 | } |
star297 | 0:4f67859595b2 | 227 | i++; |
salemtang | 2:678c0be8c23d | 228 | lastscroll = scroll.read_ms(); |
star297 | 0:4f67859595b2 | 229 | } |
star297 | 0:4f67859595b2 | 230 | } |
salemtang | 6:10b73ebdba3d | 231 | #endif // RTC_CLOCK_TEST |
salemtang | 4:15da67d64f85 | 232 | |
salemtang | 6:10b73ebdba3d | 233 | // ----------------------------------------------------------------------------- |
salemtang | 3:fb38dbc95b12 | 234 | //! @brief Set Minutes ISR |
salemtang | 6:10b73ebdba3d | 235 | //! @param [in] nil |
salemtang | 3:fb38dbc95b12 | 236 | //! @retval nil |
salemtang | 6:10b73ebdba3d | 237 | // ----------------------------------------------------------------------------- |
salemtang | 4:15da67d64f85 | 238 | #ifdef RTC_CLOCK_TEST |
salemtang | 3:fb38dbc95b12 | 239 | void switchinput1_INTIRQ (void) |
star297 | 0:4f67859595b2 | 240 | { |
salemtang | 2:678c0be8c23d | 241 | display_timer = 7; |
star297 | 0:4f67859595b2 | 242 | time_t seconds = time(NULL); |
star297 | 1:34f0bfc62803 | 243 | char buffer[2]; |
star297 | 0:4f67859595b2 | 244 | strftime(buffer, 2,"%H", localtime(&seconds)); |
salemtang | 6:10b73ebdba3d | 245 | hour = atoi(buffer); // get Hour integer |
star297 | 0:4f67859595b2 | 246 | strftime(buffer, 2,"%M", localtime(&seconds)); |
salemtang | 6:10b73ebdba3d | 247 | minute = atoi(buffer); // get Minutes integer |
star297 | 0:4f67859595b2 | 248 | minute++; |
salemtang | 2:678c0be8c23d | 249 | if (minute > 59) minute = 0; |
salemtang | 6:10b73ebdba3d | 250 | t.tm_sec = 0; // Seconds reset to zero |
star297 | 1:34f0bfc62803 | 251 | t.tm_min = minute; |
star297 | 1:34f0bfc62803 | 252 | t.tm_hour = hour; |
star297 | 1:34f0bfc62803 | 253 | t.tm_mday = 1; |
star297 | 1:34f0bfc62803 | 254 | t.tm_mon = 2; |
star297 | 1:34f0bfc62803 | 255 | t.tm_year = 114; |
salemtang | 2:678c0be8c23d | 256 | set_time(mktime(&t)); |
star297 | 0:4f67859595b2 | 257 | } |
salemtang | 6:10b73ebdba3d | 258 | #endif // RTC_CLOCK_TEST |
star297 | 0:4f67859595b2 | 259 | |
salemtang | 6:10b73ebdba3d | 260 | // ----------------------------------------------------------------------------- |
salemtang | 3:fb38dbc95b12 | 261 | //! @brief Set Hours ISR |
salemtang | 6:10b73ebdba3d | 262 | //! @param [in] nil |
salemtang | 3:fb38dbc95b12 | 263 | //! @retval nil |
salemtang | 6:10b73ebdba3d | 264 | // ----------------------------------------------------------------------------- |
salemtang | 4:15da67d64f85 | 265 | #ifdef RTC_CLOCK_TEST |
salemtang | 3:fb38dbc95b12 | 266 | void switchinput3_INTIRQ (void) |
star297 | 0:4f67859595b2 | 267 | { |
salemtang | 2:678c0be8c23d | 268 | display_timer = 7; |
star297 | 0:4f67859595b2 | 269 | time_t seconds = time(NULL); |
star297 | 0:4f67859595b2 | 270 | char buffer[2]; |
star297 | 1:34f0bfc62803 | 271 | strftime(buffer, 2,"%H", localtime(&seconds)); |
salemtang | 6:10b73ebdba3d | 272 | hour = atoi(buffer); // get Hour integer |
star297 | 0:4f67859595b2 | 273 | strftime(buffer, 2,"%M", localtime(&seconds)); |
salemtang | 6:10b73ebdba3d | 274 | minute = atoi(buffer); // get Minutes integer |
star297 | 0:4f67859595b2 | 275 | hour++; |
salemtang | 2:678c0be8c23d | 276 | if (hour > 23) hour = 0; |
salemtang | 6:10b73ebdba3d | 277 | t.tm_sec = 0; // Seconds reset to zero |
star297 | 1:34f0bfc62803 | 278 | t.tm_min = minute; |
star297 | 1:34f0bfc62803 | 279 | t.tm_hour = hour; |
star297 | 1:34f0bfc62803 | 280 | t.tm_mday = 1; |
star297 | 1:34f0bfc62803 | 281 | t.tm_mon = 2; |
star297 | 1:34f0bfc62803 | 282 | t.tm_year = 114; |
salemtang | 2:678c0be8c23d | 283 | set_time(mktime(&t)); |
star297 | 0:4f67859595b2 | 284 | } |
salemtang | 6:10b73ebdba3d | 285 | #endif //RTC_CLOCK_TEST |
salemtang | 6:10b73ebdba3d | 286 |