* Project Real-time Bus Arrival Alarm * Parts - WIZwiki-W7500 Platform - Seeed Grove OLED display - Seeed Grove 4-digit display - Seeed Grove Buzzer * Detailed description Real Time Bus Information will show you when your bus is due to arrive at your bus stop. * Target Bus Information System - GyeongGi Bus Information, Korea (www.gbis.go.kr)

Dependencies:   WIZnetInterface mbed DigitDisplay HTTPClient NTPClient SeeedGrayOLED

Committer:
hkjung
Date:
Wed Aug 26 05:12:36 2015 +0000
Revision:
0:879add9a219d
Real-time Bus Arrival Alarm based on ARM mbed WIZwiki-W7500 Platform

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hkjung 0:879add9a219d 1 #include "mbed.h"
hkjung 0:879add9a219d 2 #include "EthernetInterface.h"
hkjung 0:879add9a219d 3
hkjung 0:879add9a219d 4 #include "HTTPClient.h" // HTTP Client library
hkjung 0:879add9a219d 5 #include "NTPClient.h" // NTP Client library (Network Time Protocol)
hkjung 0:879add9a219d 6
hkjung 0:879add9a219d 7 #include "DigitDisplay.h" // Seeed Grove: 4-digit Display
hkjung 0:879add9a219d 8 #include "SeeedGrayOLED.h" // Seeed Grove: OLED Display 0.96" 96x96
hkjung 0:879add9a219d 9
hkjung 0:879add9a219d 10 Serial pc(USBTX, USBRX);
hkjung 0:879add9a219d 11
hkjung 0:879add9a219d 12 PwmOut Buzzer(D6);
hkjung 0:879add9a219d 13 DigitDisplay display(D0, D1); // 4-Digit Display connected to UART Grove connector
hkjung 0:879add9a219d 14 SeeedGrayOLED SeeedGrayOled(D14, D15);
hkjung 0:879add9a219d 15 DigitalOut myled(LED1);
hkjung 0:879add9a219d 16
hkjung 0:879add9a219d 17 Ticker tick;
hkjung 0:879add9a219d 18
hkjung 0:879add9a219d 19 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 20 // Defines
hkjung 0:879add9a219d 21 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 22
hkjung 0:879add9a219d 23 /* User adjustable defines */
hkjung 0:879add9a219d 24 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 25 /* Debug Message Enable */
hkjung 0:879add9a219d 26 #define _DEBUG_BUS_ARRIVAL_ALARM_ 0
hkjung 0:879add9a219d 27
hkjung 0:879add9a219d 28 /* Number of Displayed Bus Info */
hkjung 0:879add9a219d 29 #define MAX_BUS_INFO 3 // The maximum bus information request can be up to Three (3)
hkjung 0:879add9a219d 30
hkjung 0:879add9a219d 31 /* Display mode */
hkjung 0:879add9a219d 32 #define DISPLAY_MODE_CHANGE_CNT_SEC 10 // The OLED display holding time(sec) for each bus information displayed
hkjung 0:879add9a219d 33 #define BUS_NUM_BLINK_ENABLE 1 // blink the 4-digit display when displayed bus numbers
hkjung 0:879add9a219d 34
hkjung 0:879add9a219d 35 /* Alarm Sound Enabled and Time */
hkjung 0:879add9a219d 36 #define ALARM_SOUND_ENABLE 1
hkjung 0:879add9a219d 37 #define SOUND_START_HOUR 6
hkjung 0:879add9a219d 38 #define SOUND_START_MIN 15
hkjung 0:879add9a219d 39 #define SOUND_END_HOUR 07
hkjung 0:879add9a219d 40 #define SOUND_END_MIN 00
hkjung 0:879add9a219d 41
hkjung 0:879add9a219d 42 /* HTTP client */
hkjung 0:879add9a219d 43 //#define MAX_HTTPC_RETRY_CNT 2 // not used
hkjung 0:879add9a219d 44 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 45
hkjung 0:879add9a219d 46 /* Buzzer */
hkjung 0:879add9a219d 47 #define VOLUME 0.2 // 0.02
hkjung 0:879add9a219d 48 #define BPM 100.0
hkjung 0:879add9a219d 49
hkjung 0:879add9a219d 50 /* Display mode define */
hkjung 0:879add9a219d 51 #define DISPLAY_TIME_MODE 0 // do not change!
hkjung 0:879add9a219d 52
hkjung 0:879add9a219d 53 /* Bus and Station (Busstop) info for GBIS openAPI */
hkjung 0:879add9a219d 54 #define DEFAULT_STATION_NUM 38270 //(Gwangju -> Seoul)
hkjung 0:879add9a219d 55 #define DEFAULT_STATION_ID 234000302
hkjung 0:879add9a219d 56 // for test
hkjung 0:879add9a219d 57 //#define DEFAULT_STATION_NUM 38269 //(Seoul -> Gwangju)
hkjung 0:879add9a219d 58 //#define DEFAULT_STATION_ID 234000294
hkjung 0:879add9a219d 59
hkjung 0:879add9a219d 60 typedef struct
hkjung 0:879add9a219d 61 {
hkjung 0:879add9a219d 62 uint8_t * busNum; // Bus number, This value should be input at initialize stage
hkjung 0:879add9a219d 63 uint16_t stationNum; // Station number, notused, This value should be input at initialize stage
hkjung 0:879add9a219d 64 uint32_t routeId; // Bus route id for openAPI querying (openapi.gbis.go.kr) // This value should be input at initialize stage
hkjung 0:879add9a219d 65 uint32_t stationId; // Bus station id for openAPI querying (openapi.gbis.go.kr) // This value should be input at initialize stage
hkjung 0:879add9a219d 66 uint8_t resultCode; // 0; success, 4; bus info none
hkjung 0:879add9a219d 67 uint8_t predictTime1; // 1st bus arrival predict time ('1' means the bus gone)
hkjung 0:879add9a219d 68 uint8_t predictTime2; // 2st bus arrival predict time ('1' means the none of next bus info)
hkjung 0:879add9a219d 69 uint8_t remainSeatCnt1; // 1st bus remain seat count
hkjung 0:879add9a219d 70 uint8_t remainSeatCnt2; // 2st bus remain seat count
hkjung 0:879add9a219d 71 }BUSINFO;
hkjung 0:879add9a219d 72
hkjung 0:879add9a219d 73 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 74 // Function declaration
hkjung 0:879add9a219d 75 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 76 void BuzzerSound(void); // Buzzer
hkjung 0:879add9a219d 77 void Display_BusNumber(uint8_t * busnum); // 4-digit display
hkjung 0:879add9a219d 78 uint8_t get_businfo(BUSINFO * bus); // Get Bus information (HTTP client)
hkjung 0:879add9a219d 79
hkjung 0:879add9a219d 80 // OLED display
hkjung 0:879add9a219d 81 void Draw_OLED_init(void);
hkjung 0:879add9a219d 82 void Draw_OLED_default(void);
hkjung 0:879add9a219d 83 void Draw_OLED_busInfo(uint8_t * busnum, uint8_t seats);
hkjung 0:879add9a219d 84 void Draw_OLED_arrivalMin(uint8_t min);
hkjung 0:879add9a219d 85 void Draw_OLED_nextMin(uint8_t nextmin);
hkjung 0:879add9a219d 86 void Draw_OLED_busList(void);
hkjung 0:879add9a219d 87
hkjung 0:879add9a219d 88 // for ticker
hkjung 0:879add9a219d 89 void beat();
hkjung 0:879add9a219d 90
hkjung 0:879add9a219d 91 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 92 // Global variable declaration
hkjung 0:879add9a219d 93 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 94 BUSINFO businfo[MAX_BUS_INFO];
hkjung 0:879add9a219d 95 uint8_t flag_display_mode[MAX_BUS_INFO+1] = {0, };
hkjung 0:879add9a219d 96 uint8_t display_mode = 0;
hkjung 0:879add9a219d 97 uint8_t buzzer_sound_enable = 0;
hkjung 0:879add9a219d 98
hkjung 0:879add9a219d 99 time_t beat_cTime;
hkjung 0:879add9a219d 100 struct tm *beat_localtime;
hkjung 0:879add9a219d 101
hkjung 0:879add9a219d 102 uint8_t mac[6] = {0x00,0x08,0xDC,0x01,0x02,0x03}; // MAC address, It must be modified as users MAC address
hkjung 0:879add9a219d 103
hkjung 0:879add9a219d 104 int main()
hkjung 0:879add9a219d 105 {
hkjung 0:879add9a219d 106 pc.baud(115200);
hkjung 0:879add9a219d 107 EthernetInterface ethernet;
hkjung 0:879add9a219d 108
hkjung 0:879add9a219d 109 uint8_t i;
hkjung 0:879add9a219d 110
hkjung 0:879add9a219d 111 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 112 // Realtime Bus Information: Initialization
hkjung 0:879add9a219d 113 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 114
hkjung 0:879add9a219d 115 /* Bus number and route ID */
hkjung 0:879add9a219d 116 uint8_t busnum_1117[4] = {1, 1, 1, 7};
hkjung 0:879add9a219d 117 uint32_t busnum_1117_routeId = 234000069;
hkjung 0:879add9a219d 118
hkjung 0:879add9a219d 119 uint8_t busnum_1113[4] = {1, 1, 1, 3};
hkjung 0:879add9a219d 120 uint32_t busnum_1113_routeId = 234000042;
hkjung 0:879add9a219d 121
hkjung 0:879add9a219d 122 uint8_t busnum_1005[4] = {1, 0, 0, 5};
hkjung 0:879add9a219d 123 uint32_t busnum_1005_routeId = 234000065;
hkjung 0:879add9a219d 124
hkjung 0:879add9a219d 125 // Bus info structure initialize
hkjung 0:879add9a219d 126 businfo[0].busNum = busnum_1117;
hkjung 0:879add9a219d 127 businfo[0].stationNum = DEFAULT_STATION_NUM;
hkjung 0:879add9a219d 128 businfo[0].routeId = busnum_1117_routeId;
hkjung 0:879add9a219d 129 businfo[0].stationId = DEFAULT_STATION_ID;
hkjung 0:879add9a219d 130
hkjung 0:879add9a219d 131 businfo[1].busNum = busnum_1113;
hkjung 0:879add9a219d 132 businfo[1].stationNum = DEFAULT_STATION_NUM;
hkjung 0:879add9a219d 133 businfo[1].routeId = busnum_1113_routeId;
hkjung 0:879add9a219d 134 businfo[1].stationId = DEFAULT_STATION_ID;
hkjung 0:879add9a219d 135
hkjung 0:879add9a219d 136 businfo[2].busNum = busnum_1005;
hkjung 0:879add9a219d 137 businfo[2].stationNum = DEFAULT_STATION_NUM;
hkjung 0:879add9a219d 138 businfo[2].routeId = busnum_1005_routeId;
hkjung 0:879add9a219d 139 businfo[2].stationId = DEFAULT_STATION_ID;
hkjung 0:879add9a219d 140
hkjung 0:879add9a219d 141 // OLED display initialize
hkjung 0:879add9a219d 142 SeeedGrayOled.init(); // Initialize SEEED OLED display
hkjung 0:879add9a219d 143 SeeedGrayOled.clearDisplay(); // Clear Display
hkjung 0:879add9a219d 144 SeeedGrayOled.setNormalDisplay(); // Set Normal Display Mode
hkjung 0:879add9a219d 145
hkjung 0:879add9a219d 146 // OLED display initial draw
hkjung 0:879add9a219d 147 Draw_OLED_default(); //Draw_OLED_init();
hkjung 0:879add9a219d 148
hkjung 0:879add9a219d 149 printf("\r\n==========================================\r\n");
hkjung 0:879add9a219d 150 printf(" Real-time Bus Arrival Alarm\r\n");
hkjung 0:879add9a219d 151 printf("==========================================\r\n");
hkjung 0:879add9a219d 152 printf(" Buzzer Sound START Time: %d:%.2d\r\n", SOUND_START_HOUR, SOUND_START_MIN);
hkjung 0:879add9a219d 153 printf(" Buzzer Sound END Time : %d:%.2d\r\n", SOUND_END_HOUR, SOUND_END_MIN);
hkjung 0:879add9a219d 154 printf("==========================================\r\n");
hkjung 0:879add9a219d 155
hkjung 0:879add9a219d 156 // Ethernet initialize
hkjung 0:879add9a219d 157 int ret = ethernet.init(mac);
hkjung 0:879add9a219d 158 printf("\r\nWIZwiki-W7500 Networking Started\r\n");
hkjung 0:879add9a219d 159 wait(1); // 1 second for stable state
hkjung 0:879add9a219d 160
hkjung 0:879add9a219d 161 if (!ret) {
hkjung 0:879add9a219d 162 printf("Initialized, MAC: %s\r\n", ethernet.getMACAddress());
hkjung 0:879add9a219d 163 ret = ethernet.connect();
hkjung 0:879add9a219d 164 if (!ret) {
hkjung 0:879add9a219d 165 printf("IP: %s, MASK: %s, GW: %s\r\n",
hkjung 0:879add9a219d 166 ethernet.getIPAddress(), ethernet.getNetworkMask(), ethernet.getGateway());
hkjung 0:879add9a219d 167 } else {
hkjung 0:879add9a219d 168 printf("Error ethernet.connect() - ret = %d\r\n", ret);
hkjung 0:879add9a219d 169 exit(0);
hkjung 0:879add9a219d 170 }
hkjung 0:879add9a219d 171 } else {
hkjung 0:879add9a219d 172 printf("Error ethernet.init() - ret = %d\r\n", ret);
hkjung 0:879add9a219d 173 exit(0);
hkjung 0:879add9a219d 174 }
hkjung 0:879add9a219d 175
hkjung 0:879add9a219d 176 // NTP initialize
hkjung 0:879add9a219d 177 NTPClient ntp;
hkjung 0:879add9a219d 178 printf("\r\nTrying to update time...\r\n");
hkjung 0:879add9a219d 179 if (ntp.setTime("211.233.40.78") == 0)
hkjung 0:879add9a219d 180 {
hkjung 0:879add9a219d 181 printf("Set time successfully\r\n");
hkjung 0:879add9a219d 182 time_t ctTime;
hkjung 0:879add9a219d 183 ctTime = time(NULL);
hkjung 0:879add9a219d 184 ctTime += 32400; // GMT+9/Seoul
hkjung 0:879add9a219d 185 printf("Time is set to (GMT+9): %s\r\n", ctime(&ctTime));
hkjung 0:879add9a219d 186 }
hkjung 0:879add9a219d 187 else
hkjung 0:879add9a219d 188 {
hkjung 0:879add9a219d 189 printf("Error\r\n");
hkjung 0:879add9a219d 190 }
hkjung 0:879add9a219d 191
hkjung 0:879add9a219d 192 // 4-Digit display initialize
hkjung 0:879add9a219d 193 display.write(0, 0);
hkjung 0:879add9a219d 194 display.write(1, 0);
hkjung 0:879add9a219d 195 display.write(2, 0);
hkjung 0:879add9a219d 196 display.write(3, 0);
hkjung 0:879add9a219d 197 display.setColon(true);
hkjung 0:879add9a219d 198 tick.attach(&beat, 0.5);
hkjung 0:879add9a219d 199
hkjung 0:879add9a219d 200 // Initial flag setting for get the bus info
hkjung 0:879add9a219d 201 flag_display_mode[DISPLAY_TIME_MODE] = 1;
hkjung 0:879add9a219d 202
hkjung 0:879add9a219d 203 printf(">> Initialize Done\r\n");
hkjung 0:879add9a219d 204
hkjung 0:879add9a219d 205 // Main routine
hkjung 0:879add9a219d 206 while(1) {
hkjung 0:879add9a219d 207
hkjung 0:879add9a219d 208 if(display_mode == DISPLAY_TIME_MODE) // Display: Time mode
hkjung 0:879add9a219d 209 {
hkjung 0:879add9a219d 210 if(flag_display_mode[display_mode])
hkjung 0:879add9a219d 211 {
hkjung 0:879add9a219d 212 Draw_OLED_default();
hkjung 0:879add9a219d 213 flag_display_mode[display_mode] = 0;
hkjung 0:879add9a219d 214
hkjung 0:879add9a219d 215 // Get the buses info: Bus arrival time preparation (beforehand)
hkjung 0:879add9a219d 216 for(i = 0; i < MAX_BUS_INFO; i++)
hkjung 0:879add9a219d 217 {
hkjung 0:879add9a219d 218 get_businfo(&businfo[i]);
hkjung 0:879add9a219d 219
hkjung 0:879add9a219d 220 #if (_DEBUG_BUS_ARRIVAL_ALARM_) //Debug message
hkjung 0:879add9a219d 221 printf("Businfo #%d\r\n", i);
hkjung 0:879add9a219d 222 printf("bus.resultCode = %c\r\n", businfo[i].resultCode);
hkjung 0:879add9a219d 223 printf("1st Bus arrive after %d min\r\n", businfo[i].predictTime1);
hkjung 0:879add9a219d 224 printf("1st Bus remain seats %d\r\n", businfo[i].remainSeatCnt1);
hkjung 0:879add9a219d 225 printf("2nd Bus arrive after %d min\r\n", businfo[i].predictTime2);
hkjung 0:879add9a219d 226 printf("2nd Bus remain seats %d\r\n\r\n", businfo[i].remainSeatCnt2);
hkjung 0:879add9a219d 227 #endif
hkjung 0:879add9a219d 228 }
hkjung 0:879add9a219d 229 }
hkjung 0:879add9a219d 230 }
hkjung 0:879add9a219d 231 else // Display: Bus info mode
hkjung 0:879add9a219d 232 {
hkjung 0:879add9a219d 233 i = display_mode - 1;
hkjung 0:879add9a219d 234 if(flag_display_mode[display_mode])
hkjung 0:879add9a219d 235 {
hkjung 0:879add9a219d 236 Draw_OLED_busInfo(businfo[i].busNum, businfo[i].remainSeatCnt1);
hkjung 0:879add9a219d 237 Draw_OLED_arrivalMin(businfo[i].predictTime1);
hkjung 0:879add9a219d 238 if(businfo[i].predictTime2 == 1)
hkjung 0:879add9a219d 239 {
hkjung 0:879add9a219d 240 Draw_OLED_nextMin(0);
hkjung 0:879add9a219d 241 }
hkjung 0:879add9a219d 242 else
hkjung 0:879add9a219d 243 {
hkjung 0:879add9a219d 244 Draw_OLED_nextMin(businfo[i].predictTime2);
hkjung 0:879add9a219d 245 }
hkjung 0:879add9a219d 246
hkjung 0:879add9a219d 247 // Buzzer sound!
hkjung 0:879add9a219d 248 // Each case means the displayed time(Remaining time until the bus arrival, minute) to ringing the buzzer
hkjung 0:879add9a219d 249 switch(businfo[i].predictTime1)
hkjung 0:879add9a219d 250 {
hkjung 0:879add9a219d 251 case 5:
hkjung 0:879add9a219d 252 case 6:
hkjung 0:879add9a219d 253 case 7:
hkjung 0:879add9a219d 254 case 8:
hkjung 0:879add9a219d 255 case 9:
hkjung 0:879add9a219d 256 case 10:
hkjung 0:879add9a219d 257 BuzzerSound();
hkjung 0:879add9a219d 258 break;
hkjung 0:879add9a219d 259 default:
hkjung 0:879add9a219d 260 break;
hkjung 0:879add9a219d 261 }
hkjung 0:879add9a219d 262
hkjung 0:879add9a219d 263 flag_display_mode[display_mode] = 0;
hkjung 0:879add9a219d 264 }
hkjung 0:879add9a219d 265 }
hkjung 0:879add9a219d 266 }
hkjung 0:879add9a219d 267 }
hkjung 0:879add9a219d 268
hkjung 0:879add9a219d 269 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 270 // Member function of Ticker interface (attaching to a ticker)
hkjung 0:879add9a219d 271 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 272 void beat()
hkjung 0:879add9a219d 273 {
hkjung 0:879add9a219d 274 static uint8_t colon = 0;
hkjung 0:879add9a219d 275 static uint8_t myled_blink = 1;
hkjung 0:879add9a219d 276 static uint8_t display_mode_change_cnt = 0; // initial count value; 5 sec reduced
hkjung 0:879add9a219d 277
hkjung 0:879add9a219d 278 // Get current local time info
hkjung 0:879add9a219d 279 beat_cTime = time(NULL);
hkjung 0:879add9a219d 280 beat_cTime += 32400; // GMT+9/Seoul
hkjung 0:879add9a219d 281 beat_localtime = localtime(&beat_cTime);
hkjung 0:879add9a219d 282
hkjung 0:879add9a219d 283 // Display Mode change handler (Time / Bus mode)
hkjung 0:879add9a219d 284 display_mode_change_cnt++; // ++ every 0.5sec
hkjung 0:879add9a219d 285 if((display_mode_change_cnt/2) >= DISPLAY_MODE_CHANGE_CNT_SEC)
hkjung 0:879add9a219d 286 {
hkjung 0:879add9a219d 287 display_mode++;
hkjung 0:879add9a219d 288
hkjung 0:879add9a219d 289 if(display_mode > MAX_BUS_INFO)
hkjung 0:879add9a219d 290 {
hkjung 0:879add9a219d 291 display_mode = DISPLAY_TIME_MODE; // 0
hkjung 0:879add9a219d 292 }
hkjung 0:879add9a219d 293
hkjung 0:879add9a219d 294 // Skip: (resultCode == 4) means 'Bus arrival info does not appear'
hkjung 0:879add9a219d 295 while((display_mode != DISPLAY_TIME_MODE) && (businfo[display_mode-1].resultCode == 4))
hkjung 0:879add9a219d 296 {
hkjung 0:879add9a219d 297 display_mode++;
hkjung 0:879add9a219d 298
hkjung 0:879add9a219d 299 if(display_mode > MAX_BUS_INFO)
hkjung 0:879add9a219d 300 {
hkjung 0:879add9a219d 301 display_mode = DISPLAY_TIME_MODE; // 0
hkjung 0:879add9a219d 302 }
hkjung 0:879add9a219d 303 }
hkjung 0:879add9a219d 304
hkjung 0:879add9a219d 305 flag_display_mode[display_mode] = 1;
hkjung 0:879add9a219d 306 display_mode_change_cnt = 0;
hkjung 0:879add9a219d 307 }
hkjung 0:879add9a219d 308
hkjung 0:879add9a219d 309 // 4-Digit Display handler
hkjung 0:879add9a219d 310 if(display_mode == DISPLAY_TIME_MODE) // Time mode
hkjung 0:879add9a219d 311 {
hkjung 0:879add9a219d 312 display.on();
hkjung 0:879add9a219d 313 display.setColon(colon);
hkjung 0:879add9a219d 314 if (colon) {
hkjung 0:879add9a219d 315 display.write(0, beat_localtime->tm_hour / 10);
hkjung 0:879add9a219d 316 display.write(1, beat_localtime->tm_hour % 10);
hkjung 0:879add9a219d 317 display.write(2, beat_localtime->tm_min / 10);
hkjung 0:879add9a219d 318 display.write(3, beat_localtime->tm_min % 10);
hkjung 0:879add9a219d 319 }
hkjung 0:879add9a219d 320 //colon = 1 - colon; // moved below
hkjung 0:879add9a219d 321 }
hkjung 0:879add9a219d 322 else // Bus info mode
hkjung 0:879add9a219d 323 {
hkjung 0:879add9a219d 324 #if (BUS_NUM_BLINK_ENABLE)
hkjung 0:879add9a219d 325 if(colon)
hkjung 0:879add9a219d 326 {
hkjung 0:879add9a219d 327 Display_BusNumber(businfo[display_mode-1].busNum);
hkjung 0:879add9a219d 328 }
hkjung 0:879add9a219d 329 else
hkjung 0:879add9a219d 330 {
hkjung 0:879add9a219d 331 Display_BusNumber(NULL);
hkjung 0:879add9a219d 332 }
hkjung 0:879add9a219d 333 #else
hkjung 0:879add9a219d 334 Display_BusNumber(businfo[display_mode-1].busNum);
hkjung 0:879add9a219d 335 #endif
hkjung 0:879add9a219d 336
hkjung 0:879add9a219d 337 }
hkjung 0:879add9a219d 338
hkjung 0:879add9a219d 339 // Buzzer sound enable handler
hkjung 0:879add9a219d 340 buzzer_sound_enable = 0;
hkjung 0:879add9a219d 341 #if (ALARM_SOUND_ENABLE)
hkjung 0:879add9a219d 342 if(((beat_localtime->tm_hour == SOUND_START_HOUR) && (beat_localtime->tm_min >= SOUND_START_MIN)) || (beat_localtime->tm_hour > SOUND_START_HOUR))
hkjung 0:879add9a219d 343 {
hkjung 0:879add9a219d 344 if((beat_localtime->tm_hour < SOUND_END_HOUR) || ((beat_localtime->tm_hour == SOUND_END_HOUR) && (beat_localtime->tm_min < SOUND_END_MIN)))
hkjung 0:879add9a219d 345 {
hkjung 0:879add9a219d 346 buzzer_sound_enable = 1;
hkjung 0:879add9a219d 347 }
hkjung 0:879add9a219d 348 }
hkjung 0:879add9a219d 349 #endif
hkjung 0:879add9a219d 350
hkjung 0:879add9a219d 351 // LED blink; Device working indicator
hkjung 0:879add9a219d 352 myled_blink ^= 1;
hkjung 0:879add9a219d 353 myled = myled_blink ;
hkjung 0:879add9a219d 354
hkjung 0:879add9a219d 355 // Invert every 0.5sec
hkjung 0:879add9a219d 356 colon = 1 - colon;
hkjung 0:879add9a219d 357 }
hkjung 0:879add9a219d 358
hkjung 0:879add9a219d 359 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 360 // Get Bus Information (HTTP client) Functions
hkjung 0:879add9a219d 361 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 362 uint8_t get_businfo(BUSINFO * bus)
hkjung 0:879add9a219d 363 {
hkjung 0:879add9a219d 364 uint8_t ret = 0;
hkjung 0:879add9a219d 365 char str[2048] = {0, };
hkjung 0:879add9a219d 366 char get_req[512] = {0, };
hkjung 0:879add9a219d 367 char predictTime1[3], predictTime2[3];
hkjung 0:879add9a219d 368 char remainSeatCnt1[3], remainSeatCnt2[3];
hkjung 0:879add9a219d 369 char *CurrentAddr = 0;
hkjung 0:879add9a219d 370
hkjung 0:879add9a219d 371 //uint8_t retry_cnt = 0; // Unimplemented, MAX_HTTPC_RETRY_CNT
hkjung 0:879add9a219d 372
hkjung 0:879add9a219d 373 HTTPClient httpc;
hkjung 0:879add9a219d 374
hkjung 0:879add9a219d 375 sprintf(get_req, "http://openapi.gbis.go.kr/ws/rest/busarrivalservice?serviceKey=test&routeId=%ld&stationId=%ld", bus->routeId, bus->stationId);
hkjung 0:879add9a219d 376 httpc.get(get_req, str, sizeof(str), 1000);
hkjung 0:879add9a219d 377
hkjung 0:879add9a219d 378 CurrentAddr = strstr(str,"<resultCode>");
hkjung 0:879add9a219d 379 bus->resultCode = *(CurrentAddr+12);
hkjung 0:879add9a219d 380
hkjung 0:879add9a219d 381 if(bus->resultCode == '0')
hkjung 0:879add9a219d 382 {
hkjung 0:879add9a219d 383 CurrentAddr = strstr(str,"<predictTime1>");
hkjung 0:879add9a219d 384 if((*(CurrentAddr+15)) == '<')
hkjung 0:879add9a219d 385 {
hkjung 0:879add9a219d 386 predictTime1[0] = *(CurrentAddr+14);
hkjung 0:879add9a219d 387 predictTime1[1] = 0;
hkjung 0:879add9a219d 388 predictTime1[2] = 0;
hkjung 0:879add9a219d 389 }
hkjung 0:879add9a219d 390 else
hkjung 0:879add9a219d 391 {
hkjung 0:879add9a219d 392 predictTime1[0] = *(CurrentAddr+14);
hkjung 0:879add9a219d 393 predictTime1[1] = *(CurrentAddr+15);
hkjung 0:879add9a219d 394 predictTime1[2] = 0;
hkjung 0:879add9a219d 395 }
hkjung 0:879add9a219d 396 bus->predictTime1 = (uint8_t)atoi(predictTime1);
hkjung 0:879add9a219d 397
hkjung 0:879add9a219d 398 CurrentAddr = strstr(str,"<predictTime2>");
hkjung 0:879add9a219d 399 if((*(CurrentAddr+15)) == '<')
hkjung 0:879add9a219d 400 {
hkjung 0:879add9a219d 401 predictTime2[0] = *(CurrentAddr+14);
hkjung 0:879add9a219d 402 predictTime2[1] = 0;
hkjung 0:879add9a219d 403 predictTime2[2] = 0;
hkjung 0:879add9a219d 404 }
hkjung 0:879add9a219d 405 else
hkjung 0:879add9a219d 406 {
hkjung 0:879add9a219d 407 predictTime2[0] = *(CurrentAddr+14);
hkjung 0:879add9a219d 408 predictTime2[1] = *(CurrentAddr+15);
hkjung 0:879add9a219d 409 predictTime2[2] = 0;
hkjung 0:879add9a219d 410 }
hkjung 0:879add9a219d 411 bus->predictTime2 = (uint8_t)atoi(predictTime2);
hkjung 0:879add9a219d 412
hkjung 0:879add9a219d 413 CurrentAddr = strstr(str,"<remainSeatCnt1>");
hkjung 0:879add9a219d 414 if((*(CurrentAddr+17)) == '<')
hkjung 0:879add9a219d 415 {
hkjung 0:879add9a219d 416 remainSeatCnt1[0] = *(CurrentAddr+16);
hkjung 0:879add9a219d 417 remainSeatCnt1[1] = 0;
hkjung 0:879add9a219d 418 remainSeatCnt1[2] = 0;
hkjung 0:879add9a219d 419 }
hkjung 0:879add9a219d 420 else
hkjung 0:879add9a219d 421 {
hkjung 0:879add9a219d 422 remainSeatCnt1[0] = *(CurrentAddr+16);
hkjung 0:879add9a219d 423 remainSeatCnt1[1] = *(CurrentAddr+17);
hkjung 0:879add9a219d 424 remainSeatCnt1[2] = 0;
hkjung 0:879add9a219d 425 }
hkjung 0:879add9a219d 426 bus->remainSeatCnt1 = (uint8_t)atoi(remainSeatCnt1);
hkjung 0:879add9a219d 427
hkjung 0:879add9a219d 428 if(bus->predictTime2 > 1) // (predictTime2 == 1) => The next bus information is not confirmed.
hkjung 0:879add9a219d 429 {
hkjung 0:879add9a219d 430 CurrentAddr = strstr(str,"<remainSeatCnt2>");
hkjung 0:879add9a219d 431 if((*(CurrentAddr+17)) == '<')
hkjung 0:879add9a219d 432 {
hkjung 0:879add9a219d 433 remainSeatCnt2[0] = *(CurrentAddr+16);
hkjung 0:879add9a219d 434 remainSeatCnt2[1] = 0;
hkjung 0:879add9a219d 435 remainSeatCnt2[2] = 0;
hkjung 0:879add9a219d 436 }
hkjung 0:879add9a219d 437 else
hkjung 0:879add9a219d 438 {
hkjung 0:879add9a219d 439 remainSeatCnt2[0] = *(CurrentAddr+16);
hkjung 0:879add9a219d 440 remainSeatCnt2[1] = *(CurrentAddr+17);
hkjung 0:879add9a219d 441 remainSeatCnt2[2] = 0;
hkjung 0:879add9a219d 442 }
hkjung 0:879add9a219d 443 bus->remainSeatCnt2 = (uint8_t)atoi(remainSeatCnt2);
hkjung 0:879add9a219d 444 }
hkjung 0:879add9a219d 445
hkjung 0:879add9a219d 446 ret = 1;
hkjung 0:879add9a219d 447 }
hkjung 0:879add9a219d 448
hkjung 0:879add9a219d 449 return ret;
hkjung 0:879add9a219d 450 }
hkjung 0:879add9a219d 451
hkjung 0:879add9a219d 452 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 453 // Piezo Buzzer Functions
hkjung 0:879add9a219d 454 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 455
hkjung 0:879add9a219d 456 void playNote(float frequency, float duration, float volume)
hkjung 0:879add9a219d 457 {
hkjung 0:879add9a219d 458 Buzzer.period(1.0/(double)frequency);
hkjung 0:879add9a219d 459 Buzzer = ((double)volume/2.0);
hkjung 0:879add9a219d 460 wait(duration);
hkjung 0:879add9a219d 461 Buzzer = 0.0;
hkjung 0:879add9a219d 462 }
hkjung 0:879add9a219d 463
hkjung 0:879add9a219d 464 void BuzzerSound(void)
hkjung 0:879add9a219d 465 {
hkjung 0:879add9a219d 466 // Calculate duration of a quarter note from bpm
hkjung 0:879add9a219d 467 float beat_duration = 60.0 / BPM;
hkjung 0:879add9a219d 468
hkjung 0:879add9a219d 469 if(buzzer_sound_enable)
hkjung 0:879add9a219d 470 {
hkjung 0:879add9a219d 471 //playNote(329.628, (0.75 * (double)beat_duration), VOLUME);
hkjung 0:879add9a219d 472 //playNote(261.626, (0.75 * (double)beat_duration), VOLUME);
hkjung 0:879add9a219d 473 playNote(529.628, (0.50 * (double)beat_duration), VOLUME);
hkjung 0:879add9a219d 474 playNote(301.626, (0.50 * (double)beat_duration), VOLUME);
hkjung 0:879add9a219d 475 }
hkjung 0:879add9a219d 476 }
hkjung 0:879add9a219d 477
hkjung 0:879add9a219d 478 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 479 // 4-Digit Display Functions
hkjung 0:879add9a219d 480 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 481
hkjung 0:879add9a219d 482 void Display_BusNumber(uint8_t * busnum)
hkjung 0:879add9a219d 483 {
hkjung 0:879add9a219d 484 display.setColon(false);
hkjung 0:879add9a219d 485
hkjung 0:879add9a219d 486 if(busnum != NULL)
hkjung 0:879add9a219d 487 {
hkjung 0:879add9a219d 488 display.on();
hkjung 0:879add9a219d 489 display.write(0, busnum[0]);
hkjung 0:879add9a219d 490 display.write(1, busnum[1]);
hkjung 0:879add9a219d 491 display.write(2, busnum[2]);
hkjung 0:879add9a219d 492 display.write(3, busnum[3]);
hkjung 0:879add9a219d 493 }
hkjung 0:879add9a219d 494 else
hkjung 0:879add9a219d 495 {
hkjung 0:879add9a219d 496 display.off();
hkjung 0:879add9a219d 497 }
hkjung 0:879add9a219d 498 }
hkjung 0:879add9a219d 499
hkjung 0:879add9a219d 500 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 501 // OLED Display Functions
hkjung 0:879add9a219d 502 ////////////////////////////////////////////////////////////////
hkjung 0:879add9a219d 503
hkjung 0:879add9a219d 504 void Draw_OLED_init(void)
hkjung 0:879add9a219d 505 {
hkjung 0:879add9a219d 506 uint8_t empty_busnum[4] = {0, 0, 0, 0};
hkjung 0:879add9a219d 507
hkjung 0:879add9a219d 508 Draw_OLED_busInfo(empty_busnum, 0);
hkjung 0:879add9a219d 509 Draw_OLED_nextMin(0);
hkjung 0:879add9a219d 510 }
hkjung 0:879add9a219d 511
hkjung 0:879add9a219d 512 void Draw_OLED_default(void)
hkjung 0:879add9a219d 513 {
hkjung 0:879add9a219d 514 SeeedGrayOled.setTextXY(0, 1);
hkjung 0:879add9a219d 515 SeeedGrayOled.putString("Bus NearBy ");
hkjung 0:879add9a219d 516 SeeedGrayOled.setTextXY(1, 1);
hkjung 0:879add9a219d 517 SeeedGrayOled.putString("========== ");
hkjung 0:879add9a219d 518
hkjung 0:879add9a219d 519 Draw_OLED_arrivalMin('b');
hkjung 0:879add9a219d 520
hkjung 0:879add9a219d 521 SeeedGrayOled.setTextXY(11, 0);
hkjung 0:879add9a219d 522 SeeedGrayOled.putString("WIZnet::Eric");
hkjung 0:879add9a219d 523 }
hkjung 0:879add9a219d 524
hkjung 0:879add9a219d 525 void Draw_OLED_busList(void)
hkjung 0:879add9a219d 526 {
hkjung 0:879add9a219d 527 uint8_t i;
hkjung 0:879add9a219d 528 char buf[15] = {0, };
hkjung 0:879add9a219d 529
hkjung 0:879add9a219d 530 SeeedGrayOled.setTextXY(0, 1);
hkjung 0:879add9a219d 531 SeeedGrayOled.putString(" ");
hkjung 0:879add9a219d 532 SeeedGrayOled.setTextXY(1, 1);
hkjung 0:879add9a219d 533 SeeedGrayOled.putString("Bus List:");
hkjung 0:879add9a219d 534
hkjung 0:879add9a219d 535 Draw_OLED_arrivalMin('t');
hkjung 0:879add9a219d 536
hkjung 0:879add9a219d 537 for(i = 0; i < MAX_BUS_INFO; i++)
hkjung 0:879add9a219d 538 {
hkjung 0:879add9a219d 539 SeeedGrayOled.setTextXY(3+i, 2);
hkjung 0:879add9a219d 540 sprintf(buf, "- %.1d%.1d%.1d%.1d", businfo[i].busNum[0], businfo[i].busNum[1], businfo[i].busNum[2], businfo[i].busNum[3]);
hkjung 0:879add9a219d 541 SeeedGrayOled.putString(buf);
hkjung 0:879add9a219d 542 }
hkjung 0:879add9a219d 543
hkjung 0:879add9a219d 544 SeeedGrayOled.setTextXY(11, 1);
hkjung 0:879add9a219d 545 SeeedGrayOled.putString(" ");
hkjung 0:879add9a219d 546 }
hkjung 0:879add9a219d 547
hkjung 0:879add9a219d 548 void Draw_OLED_busInfo(uint8_t * busnum, uint8_t seats)
hkjung 0:879add9a219d 549 {
hkjung 0:879add9a219d 550 char buf[15] = {0, };
hkjung 0:879add9a219d 551 sprintf(buf, "Bus %.1d%.1d%.1d%.1d ", busnum[0], busnum[1], busnum[2], busnum[3]);
hkjung 0:879add9a219d 552 SeeedGrayOled.setTextXY(0, 1);
hkjung 0:879add9a219d 553 SeeedGrayOled.putString(buf);
hkjung 0:879add9a219d 554 sprintf(buf, "Seats %.2d ", seats);
hkjung 0:879add9a219d 555 SeeedGrayOled.setTextXY(1, 1);
hkjung 0:879add9a219d 556 SeeedGrayOled.putString(buf);
hkjung 0:879add9a219d 557 }
hkjung 0:879add9a219d 558
hkjung 0:879add9a219d 559 void Draw_OLED_nextMin(uint8_t nextmin)
hkjung 0:879add9a219d 560 {
hkjung 0:879add9a219d 561 char buf[15] = {0, };
hkjung 0:879add9a219d 562 if(nextmin == 0)
hkjung 0:879add9a219d 563 {
hkjung 0:879add9a219d 564 sprintf(buf, "Next: -- min");
hkjung 0:879add9a219d 565 }
hkjung 0:879add9a219d 566 else
hkjung 0:879add9a219d 567 {
hkjung 0:879add9a219d 568 sprintf(buf, "Next: %.2d min", nextmin);
hkjung 0:879add9a219d 569 }
hkjung 0:879add9a219d 570
hkjung 0:879add9a219d 571 SeeedGrayOled.setTextXY(11, 0);
hkjung 0:879add9a219d 572 SeeedGrayOled.putString(buf);
hkjung 0:879add9a219d 573 }
hkjung 0:879add9a219d 574
hkjung 0:879add9a219d 575 void Draw_OLED_arrivalMin(uint8_t min)
hkjung 0:879add9a219d 576 {
hkjung 0:879add9a219d 577 switch(min)
hkjung 0:879add9a219d 578 {
hkjung 0:879add9a219d 579 case 't':
hkjung 0:879add9a219d 580 SeeedGrayOled.setTextXY(3, 0);
hkjung 0:879add9a219d 581 SeeedGrayOled.putString(" ");
hkjung 0:879add9a219d 582 SeeedGrayOled.setTextXY(4, 0);
hkjung 0:879add9a219d 583 SeeedGrayOled.putString(" ");
hkjung 0:879add9a219d 584 SeeedGrayOled.setTextXY(5, 0);
hkjung 0:879add9a219d 585 SeeedGrayOled.putString(" ");
hkjung 0:879add9a219d 586 SeeedGrayOled.setTextXY(6, 0);
hkjung 0:879add9a219d 587 SeeedGrayOled.putString(" ");
hkjung 0:879add9a219d 588 SeeedGrayOled.setTextXY(7, 0);
hkjung 0:879add9a219d 589 SeeedGrayOled.putString(" ");
hkjung 0:879add9a219d 590 SeeedGrayOled.setTextXY(8, 0);
hkjung 0:879add9a219d 591 SeeedGrayOled.putString(" ");
hkjung 0:879add9a219d 592 SeeedGrayOled.setTextXY(9, 0);
hkjung 0:879add9a219d 593 SeeedGrayOled.putString(" ");
hkjung 0:879add9a219d 594 break;
hkjung 0:879add9a219d 595 case 'b':
hkjung 0:879add9a219d 596 SeeedGrayOled.setTextXY(3, 0);
hkjung 0:879add9a219d 597 SeeedGrayOled.putString(" ~~~~~ ");
hkjung 0:879add9a219d 598 SeeedGrayOled.setTextXY(4, 0);
hkjung 0:879add9a219d 599 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 600 SeeedGrayOled.setTextXY(5, 0);
hkjung 0:879add9a219d 601 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 602 SeeedGrayOled.setTextXY(6, 0);
hkjung 0:879add9a219d 603 SeeedGrayOled.putString(" ~~~~~~~ ");
hkjung 0:879add9a219d 604 SeeedGrayOled.setTextXY(7, 0);
hkjung 0:879add9a219d 605 SeeedGrayOled.putString(" ~ ~~~ ~ ");
hkjung 0:879add9a219d 606 SeeedGrayOled.setTextXY(8, 0);
hkjung 0:879add9a219d 607 SeeedGrayOled.putString(" ~~~~~~~ ");
hkjung 0:879add9a219d 608 SeeedGrayOled.setTextXY(9, 0);
hkjung 0:879add9a219d 609 SeeedGrayOled.putString(" ~~ ~~ ");
hkjung 0:879add9a219d 610 break;
hkjung 0:879add9a219d 611 case 0:
hkjung 0:879add9a219d 612 SeeedGrayOled.setTextXY(3, 0);
hkjung 0:879add9a219d 613 SeeedGrayOled.putString(" ~~~~ ~~~~ ");
hkjung 0:879add9a219d 614 SeeedGrayOled.setTextXY(4, 0);
hkjung 0:879add9a219d 615 SeeedGrayOled.putString(" ~ ~ ~ ~ ");
hkjung 0:879add9a219d 616 SeeedGrayOled.setTextXY(5, 0);
hkjung 0:879add9a219d 617 SeeedGrayOled.putString(" ~ ~ ~ ~ ");
hkjung 0:879add9a219d 618 SeeedGrayOled.setTextXY(6, 0);
hkjung 0:879add9a219d 619 SeeedGrayOled.putString(" ~ ~ ~ ~ ");
hkjung 0:879add9a219d 620 SeeedGrayOled.setTextXY(7, 0);
hkjung 0:879add9a219d 621 SeeedGrayOled.putString(" ~ ~ ~ ~ ");
hkjung 0:879add9a219d 622 SeeedGrayOled.setTextXY(8, 0);
hkjung 0:879add9a219d 623 SeeedGrayOled.putString(" ~ ~ ~ ~ ");
hkjung 0:879add9a219d 624 SeeedGrayOled.setTextXY(9, 0);
hkjung 0:879add9a219d 625 SeeedGrayOled.putString(" ~~~~ ~~~~ ");
hkjung 0:879add9a219d 626 break;
hkjung 0:879add9a219d 627 case 1:
hkjung 0:879add9a219d 628 SeeedGrayOled.setTextXY(3, 0);
hkjung 0:879add9a219d 629 SeeedGrayOled.putString(" ");
hkjung 0:879add9a219d 630 SeeedGrayOled.setTextXY(4, 0);
hkjung 0:879add9a219d 631 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 632 SeeedGrayOled.setTextXY(5, 0);
hkjung 0:879add9a219d 633 SeeedGrayOled.putString(" ~~ ");
hkjung 0:879add9a219d 634 SeeedGrayOled.setTextXY(6, 0);
hkjung 0:879add9a219d 635 SeeedGrayOled.putString(" ~~~~~~~ ");
hkjung 0:879add9a219d 636 SeeedGrayOled.setTextXY(7, 0);
hkjung 0:879add9a219d 637 SeeedGrayOled.putString(" ~~ ");
hkjung 0:879add9a219d 638 SeeedGrayOled.setTextXY(8, 0);
hkjung 0:879add9a219d 639 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 640 SeeedGrayOled.setTextXY(9, 0);
hkjung 0:879add9a219d 641 SeeedGrayOled.putString(" Gone! ");
hkjung 0:879add9a219d 642 break;
hkjung 0:879add9a219d 643 case 2:
hkjung 0:879add9a219d 644 SeeedGrayOled.setTextXY(3, 0);
hkjung 0:879add9a219d 645 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 646 SeeedGrayOled.setTextXY(4, 0);
hkjung 0:879add9a219d 647 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 648 SeeedGrayOled.setTextXY(5, 0);
hkjung 0:879add9a219d 649 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 650 SeeedGrayOled.setTextXY(6, 0);
hkjung 0:879add9a219d 651 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 652 SeeedGrayOled.setTextXY(7, 0);
hkjung 0:879add9a219d 653 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 654 SeeedGrayOled.setTextXY(8, 0);
hkjung 0:879add9a219d 655 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 656 SeeedGrayOled.setTextXY(9, 0);
hkjung 0:879add9a219d 657 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 658 break;
hkjung 0:879add9a219d 659 case 3:
hkjung 0:879add9a219d 660 SeeedGrayOled.setTextXY(3, 0);
hkjung 0:879add9a219d 661 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 662 SeeedGrayOled.setTextXY(4, 0);
hkjung 0:879add9a219d 663 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 664 SeeedGrayOled.setTextXY(5, 0);
hkjung 0:879add9a219d 665 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 666 SeeedGrayOled.setTextXY(6, 0);
hkjung 0:879add9a219d 667 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 668 SeeedGrayOled.setTextXY(7, 0);
hkjung 0:879add9a219d 669 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 670 SeeedGrayOled.setTextXY(8, 0);
hkjung 0:879add9a219d 671 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 672 SeeedGrayOled.setTextXY(9, 0);
hkjung 0:879add9a219d 673 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 674 break;
hkjung 0:879add9a219d 675 case 4:
hkjung 0:879add9a219d 676 SeeedGrayOled.setTextXY(3, 0);
hkjung 0:879add9a219d 677 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 678 SeeedGrayOled.setTextXY(4, 0);
hkjung 0:879add9a219d 679 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 680 SeeedGrayOled.setTextXY(5, 0);
hkjung 0:879add9a219d 681 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 682 SeeedGrayOled.setTextXY(6, 0);
hkjung 0:879add9a219d 683 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 684 SeeedGrayOled.setTextXY(7, 0);
hkjung 0:879add9a219d 685 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 686 SeeedGrayOled.setTextXY(8, 0);
hkjung 0:879add9a219d 687 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 688 SeeedGrayOled.setTextXY(9, 0);
hkjung 0:879add9a219d 689 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 690 break;
hkjung 0:879add9a219d 691 case 5:
hkjung 0:879add9a219d 692 SeeedGrayOled.setTextXY(3, 0);
hkjung 0:879add9a219d 693 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 694 SeeedGrayOled.setTextXY(4, 0);
hkjung 0:879add9a219d 695 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 696 SeeedGrayOled.setTextXY(5, 0);
hkjung 0:879add9a219d 697 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 698 SeeedGrayOled.setTextXY(6, 0);
hkjung 0:879add9a219d 699 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 700 SeeedGrayOled.setTextXY(7, 0);
hkjung 0:879add9a219d 701 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 702 SeeedGrayOled.setTextXY(8, 0);
hkjung 0:879add9a219d 703 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 704 SeeedGrayOled.setTextXY(9, 0);
hkjung 0:879add9a219d 705 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 706 break;
hkjung 0:879add9a219d 707 case 6:
hkjung 0:879add9a219d 708 SeeedGrayOled.setTextXY(3, 0);
hkjung 0:879add9a219d 709 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 710 SeeedGrayOled.setTextXY(4, 0);
hkjung 0:879add9a219d 711 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 712 SeeedGrayOled.setTextXY(5, 0);
hkjung 0:879add9a219d 713 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 714 SeeedGrayOled.setTextXY(6, 0);
hkjung 0:879add9a219d 715 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 716 SeeedGrayOled.setTextXY(7, 0);
hkjung 0:879add9a219d 717 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 718 SeeedGrayOled.setTextXY(8, 0);
hkjung 0:879add9a219d 719 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 720 SeeedGrayOled.setTextXY(9, 0);
hkjung 0:879add9a219d 721 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 722 break;
hkjung 0:879add9a219d 723 case 7:
hkjung 0:879add9a219d 724 SeeedGrayOled.setTextXY(3, 0);
hkjung 0:879add9a219d 725 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 726 SeeedGrayOled.setTextXY(4, 0);
hkjung 0:879add9a219d 727 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 728 SeeedGrayOled.setTextXY(5, 0);
hkjung 0:879add9a219d 729 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 730 SeeedGrayOled.setTextXY(6, 0);
hkjung 0:879add9a219d 731 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 732 SeeedGrayOled.setTextXY(7, 0);
hkjung 0:879add9a219d 733 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 734 SeeedGrayOled.setTextXY(8, 0);
hkjung 0:879add9a219d 735 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 736 SeeedGrayOled.setTextXY(9, 0);
hkjung 0:879add9a219d 737 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 738 break;
hkjung 0:879add9a219d 739 case 8:
hkjung 0:879add9a219d 740 SeeedGrayOled.setTextXY(3, 0);
hkjung 0:879add9a219d 741 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 742 SeeedGrayOled.setTextXY(4, 0);
hkjung 0:879add9a219d 743 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 744 SeeedGrayOled.setTextXY(5, 0);
hkjung 0:879add9a219d 745 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 746 SeeedGrayOled.setTextXY(6, 0);
hkjung 0:879add9a219d 747 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 748 SeeedGrayOled.setTextXY(7, 0);
hkjung 0:879add9a219d 749 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 750 SeeedGrayOled.setTextXY(8, 0);
hkjung 0:879add9a219d 751 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 752 SeeedGrayOled.setTextXY(9, 0);
hkjung 0:879add9a219d 753 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 754 break;
hkjung 0:879add9a219d 755 case 9:
hkjung 0:879add9a219d 756 SeeedGrayOled.setTextXY(3, 0);
hkjung 0:879add9a219d 757 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 758 SeeedGrayOled.setTextXY(4, 0);
hkjung 0:879add9a219d 759 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 760 SeeedGrayOled.setTextXY(5, 0);
hkjung 0:879add9a219d 761 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 762 SeeedGrayOled.setTextXY(6, 0);
hkjung 0:879add9a219d 763 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 764 SeeedGrayOled.setTextXY(7, 0);
hkjung 0:879add9a219d 765 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 766 SeeedGrayOled.setTextXY(8, 0);
hkjung 0:879add9a219d 767 SeeedGrayOled.putString(" ~ ");
hkjung 0:879add9a219d 768 SeeedGrayOled.setTextXY(9, 0);
hkjung 0:879add9a219d 769 SeeedGrayOled.putString(" ~~~~ ");
hkjung 0:879add9a219d 770 break;
hkjung 0:879add9a219d 771 case 10:
hkjung 0:879add9a219d 772 case 11: // 10
hkjung 0:879add9a219d 773 SeeedGrayOled.setTextXY(3, 0);
hkjung 0:879add9a219d 774 SeeedGrayOled.putString(" ~~ ~~~~ ");
hkjung 0:879add9a219d 775 SeeedGrayOled.setTextXY(4, 0);
hkjung 0:879add9a219d 776 SeeedGrayOled.putString(" ~ ~ ~ ");
hkjung 0:879add9a219d 777 SeeedGrayOled.setTextXY(5, 0);
hkjung 0:879add9a219d 778 SeeedGrayOled.putString(" ~ ~ ~ ");
hkjung 0:879add9a219d 779 SeeedGrayOled.setTextXY(6, 0);
hkjung 0:879add9a219d 780 SeeedGrayOled.putString(" ~ ~ ~ ");
hkjung 0:879add9a219d 781 SeeedGrayOled.setTextXY(7, 0);
hkjung 0:879add9a219d 782 SeeedGrayOled.putString(" ~ ~ ~ ");
hkjung 0:879add9a219d 783 SeeedGrayOled.setTextXY(8, 0);
hkjung 0:879add9a219d 784 SeeedGrayOled.putString(" ~ ~ ~ ");
hkjung 0:879add9a219d 785 SeeedGrayOled.setTextXY(9, 0);
hkjung 0:879add9a219d 786 SeeedGrayOled.putString(" ~ ~~~~ ");
hkjung 0:879add9a219d 787 break;
hkjung 0:879add9a219d 788 case 12:
hkjung 0:879add9a219d 789 case 13:
hkjung 0:879add9a219d 790 case 14: // 12
hkjung 0:879add9a219d 791 SeeedGrayOled.setTextXY(3, 0);
hkjung 0:879add9a219d 792 SeeedGrayOled.putString(" ~~ ~~~~ ");
hkjung 0:879add9a219d 793 SeeedGrayOled.setTextXY(4, 0);
hkjung 0:879add9a219d 794 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 795 SeeedGrayOled.setTextXY(5, 0);
hkjung 0:879add9a219d 796 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 797 SeeedGrayOled.setTextXY(6, 0);
hkjung 0:879add9a219d 798 SeeedGrayOled.putString(" ~ ~~~~ ");
hkjung 0:879add9a219d 799 SeeedGrayOled.setTextXY(7, 0);
hkjung 0:879add9a219d 800 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 801 SeeedGrayOled.setTextXY(8, 0);
hkjung 0:879add9a219d 802 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 803 SeeedGrayOled.setTextXY(9, 0);
hkjung 0:879add9a219d 804 SeeedGrayOled.putString(" ~ ~~~~ ");
hkjung 0:879add9a219d 805 break;
hkjung 0:879add9a219d 806 case 15:
hkjung 0:879add9a219d 807 case 16: // 15
hkjung 0:879add9a219d 808 SeeedGrayOled.setTextXY(3, 0);
hkjung 0:879add9a219d 809 SeeedGrayOled.putString(" ~~ ~~~~ ");
hkjung 0:879add9a219d 810 SeeedGrayOled.setTextXY(4, 0);
hkjung 0:879add9a219d 811 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 812 SeeedGrayOled.setTextXY(5, 0);
hkjung 0:879add9a219d 813 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 814 SeeedGrayOled.setTextXY(6, 0);
hkjung 0:879add9a219d 815 SeeedGrayOled.putString(" ~ ~~~~ ");
hkjung 0:879add9a219d 816 SeeedGrayOled.setTextXY(7, 0);
hkjung 0:879add9a219d 817 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 818 SeeedGrayOled.setTextXY(8, 0);
hkjung 0:879add9a219d 819 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 820 SeeedGrayOled.setTextXY(9, 0);
hkjung 0:879add9a219d 821 SeeedGrayOled.putString(" ~ ~~~~ ");
hkjung 0:879add9a219d 822 break;
hkjung 0:879add9a219d 823 case 17:
hkjung 0:879add9a219d 824 case 18: // 17
hkjung 0:879add9a219d 825 case 19: // 17
hkjung 0:879add9a219d 826 SeeedGrayOled.setTextXY(3, 0);
hkjung 0:879add9a219d 827 SeeedGrayOled.putString(" ~~ ~~~~ ");
hkjung 0:879add9a219d 828 SeeedGrayOled.setTextXY(4, 0);
hkjung 0:879add9a219d 829 SeeedGrayOled.putString(" ~ ~ ~ ");
hkjung 0:879add9a219d 830 SeeedGrayOled.setTextXY(5, 0);
hkjung 0:879add9a219d 831 SeeedGrayOled.putString(" ~ ~ ~ ");
hkjung 0:879add9a219d 832 SeeedGrayOled.setTextXY(6, 0);
hkjung 0:879add9a219d 833 SeeedGrayOled.putString(" ~ ~ ~ ");
hkjung 0:879add9a219d 834 SeeedGrayOled.setTextXY(7, 0);
hkjung 0:879add9a219d 835 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 836 SeeedGrayOled.setTextXY(8, 0);
hkjung 0:879add9a219d 837 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 838 SeeedGrayOled.setTextXY(9, 0);
hkjung 0:879add9a219d 839 SeeedGrayOled.putString(" ~ ~ ");
hkjung 0:879add9a219d 840 break;
hkjung 0:879add9a219d 841 case 20: // 20
hkjung 0:879add9a219d 842 SeeedGrayOled.setTextXY(3, 0);
hkjung 0:879add9a219d 843 SeeedGrayOled.putString(" ~~~~ ~~~~ ");
hkjung 0:879add9a219d 844 SeeedGrayOled.setTextXY(4, 0);
hkjung 0:879add9a219d 845 SeeedGrayOled.putString(" ~ ~ ~ ");
hkjung 0:879add9a219d 846 SeeedGrayOled.setTextXY(5, 0);
hkjung 0:879add9a219d 847 SeeedGrayOled.putString(" ~ ~ ~ ");
hkjung 0:879add9a219d 848 SeeedGrayOled.setTextXY(6, 0);
hkjung 0:879add9a219d 849 SeeedGrayOled.putString(" ~~~~ ~ ~ ");
hkjung 0:879add9a219d 850 SeeedGrayOled.setTextXY(7, 0);
hkjung 0:879add9a219d 851 SeeedGrayOled.putString(" ~ ~ ~ ");
hkjung 0:879add9a219d 852 SeeedGrayOled.setTextXY(8, 0);
hkjung 0:879add9a219d 853 SeeedGrayOled.putString(" ~ ~ ~ ");
hkjung 0:879add9a219d 854 SeeedGrayOled.setTextXY(9, 0);
hkjung 0:879add9a219d 855 SeeedGrayOled.putString(" ~~~~ ~~~~ ");
hkjung 0:879add9a219d 856 break;
hkjung 0:879add9a219d 857 default: // 20
hkjung 0:879add9a219d 858 SeeedGrayOled.setTextXY(3, 0);
hkjung 0:879add9a219d 859 SeeedGrayOled.putString(" ~~~~ ~~~~ ");
hkjung 0:879add9a219d 860 SeeedGrayOled.setTextXY(4, 0);
hkjung 0:879add9a219d 861 SeeedGrayOled.putString(" ~ ~ ~ ");
hkjung 0:879add9a219d 862 SeeedGrayOled.setTextXY(5, 0);
hkjung 0:879add9a219d 863 SeeedGrayOled.putString(" ~ ~ ~ ");
hkjung 0:879add9a219d 864 SeeedGrayOled.setTextXY(6, 0);
hkjung 0:879add9a219d 865 SeeedGrayOled.putString(" ~~~~ ~ ~ ");
hkjung 0:879add9a219d 866 SeeedGrayOled.setTextXY(7, 0);
hkjung 0:879add9a219d 867 SeeedGrayOled.putString(" ~ ~ ~ ");
hkjung 0:879add9a219d 868 SeeedGrayOled.setTextXY(8, 0);
hkjung 0:879add9a219d 869 SeeedGrayOled.putString(" ~ ~ ~ ");
hkjung 0:879add9a219d 870 SeeedGrayOled.setTextXY(9, 0);
hkjung 0:879add9a219d 871 SeeedGrayOled.putString(" ~~~~ ~~~~ ~");
hkjung 0:879add9a219d 872 break;
hkjung 0:879add9a219d 873 }
hkjung 0:879add9a219d 874 }