Andrew Reed / Mbed OS mbed-os-example-NTPDemo
Committer:
reedas
Date:
Fri Jun 19 10:09:08 2020 +0000
Revision:
2:7b8ab39a1b6d
Parent:
1:fe2e90c1c706
clean up display

Who changed what in which revision?

UserRevisionLine numberNew contents of line
reedas 0:98c914fd9dae 1 #include "mbed.h"
reedas 0:98c914fd9dae 2 #include "GUI.h"
reedas 0:98c914fd9dae 3 #include "mbed_events.h"
reedas 0:98c914fd9dae 4 #include "ntp-client/NTPClient.h"
reedas 0:98c914fd9dae 5 Thread netTimeThreadHandle;
reedas 0:98c914fd9dae 6 WiFiInterface *wifi;
reedas 0:98c914fd9dae 7 #define MBED_CONF_APP_WIFI_SSID "brackenhillc"
reedas 0:98c914fd9dae 8 #define MBED_CONF_APP_WIFI_PASSWORD "1broches"
reedas 0:98c914fd9dae 9 EventQueue *displayQueue;
reedas 0:98c914fd9dae 10 Semaphore WiFiSemaphore;
reedas 0:98c914fd9dae 11 /******************************************************************************************
reedas 0:98c914fd9dae 12 *
reedas 0:98c914fd9dae 13 * Display Functions
reedas 0:98c914fd9dae 14 *
reedas 0:98c914fd9dae 15 ********************************************************************************************/
reedas 0:98c914fd9dae 16 #define DISP_LEFTMARGIN 10
reedas 0:98c914fd9dae 17 #define DISP_TOPMARGIN 4
reedas 0:98c914fd9dae 18 #define DISP_LINESPACE 2
reedas 0:98c914fd9dae 19 // updateDisplayWiFiStatus
reedas 0:98c914fd9dae 20 // Used to display the wifi status
reedas 0:98c914fd9dae 21 void updateDisplayWiFiStatus(char *status)
reedas 0:98c914fd9dae 22 {
reedas 0:98c914fd9dae 23 GUI_SetFont(GUI_FONT_16_1);
reedas 0:98c914fd9dae 24 GUI_DispStringAt(status,DISP_LEFTMARGIN, DISP_TOPMARGIN);
reedas 0:98c914fd9dae 25 free(status);
reedas 0:98c914fd9dae 26 }
reedas 0:98c914fd9dae 27 // updateDisplayWiFiConnectAttempts
reedas 0:98c914fd9dae 28 // This function displays the number of attempted connections
reedas 0:98c914fd9dae 29 void updateDisplayWiFiConnectAttempts(int count)
reedas 0:98c914fd9dae 30 {
reedas 0:98c914fd9dae 31 char buffer[128];
reedas 0:98c914fd9dae 32 snprintf(buffer,sizeof(buffer),"WiFi Connect Attempts = %d",count);
reedas 0:98c914fd9dae 33 GUI_SetFont(GUI_FONT_16_1);
reedas 0:98c914fd9dae 34 GUI_DispStringAt(buffer,DISP_LEFTMARGIN, DISP_TOPMARGIN + (GUI_GetFontSizeY()+DISP_LINESPACE) );
reedas 0:98c914fd9dae 35 }
reedas 0:98c914fd9dae 36 // updateDisplayNTPFailed
reedas 0:98c914fd9dae 37 // updates the display with the number of time the NTP Server has been called
reedas 0:98c914fd9dae 38 // and got a failed response
reedas 0:98c914fd9dae 39 void updateDisplayNTPFailed(void)
reedas 0:98c914fd9dae 40 {
reedas 0:98c914fd9dae 41 static int count=0;
reedas 0:98c914fd9dae 42 char buffer[128];
reedas 0:98c914fd9dae 43 count = count + 1;
reedas 0:98c914fd9dae 44 snprintf(buffer,sizeof(buffer),"NTP Update Failure = %d\n",count);
reedas 0:98c914fd9dae 45 GUI_SetFont(GUI_FONT_16_1);
reedas 0:98c914fd9dae 46 GUI_DispStringHCenterAt(buffer,LCD_GetXSize()/2,LCD_GetYSize() - 2*GUI_GetFontSizeY()); // near the bottom
reedas 0:98c914fd9dae 47 }
reedas 0:98c914fd9dae 48 // updateDisplayNTPCount
reedas 0:98c914fd9dae 49 // updates the display with the number of time the NTP Server has been called
reedas 0:98c914fd9dae 50 void updateDisplayNTPCount(void)
reedas 0:98c914fd9dae 51 {
reedas 0:98c914fd9dae 52 static int count=0;
reedas 0:98c914fd9dae 53 char buffer[128];
reedas 0:98c914fd9dae 54 count = count + 1;
reedas 0:98c914fd9dae 55 snprintf(buffer,sizeof(buffer),"NTP Updates = %d\n",count);
reedas 0:98c914fd9dae 56 GUI_SetFont(GUI_FONT_16_1);
reedas 0:98c914fd9dae 57 GUI_DispStringHCenterAt(buffer,LCD_GetXSize()/2,LCD_GetYSize() - GUI_GetFontSizeY()); // near the bottom
reedas 0:98c914fd9dae 58 }
reedas 0:98c914fd9dae 59 // updateDisplayTime
reedas 0:98c914fd9dae 60 // This function updates the time on the screen
reedas 0:98c914fd9dae 61 void updateDisplayTime()
reedas 0:98c914fd9dae 62 {
reedas 0:98c914fd9dae 63 time_t rawtime;
reedas 0:98c914fd9dae 64 struct tm * timeinfo;
reedas 0:98c914fd9dae 65 char buffer [128];
reedas 0:98c914fd9dae 66 time (&rawtime);
reedas 0:98c914fd9dae 67 //rawtime = rawtime - (4*60*60); // UTC - 4hours ... serious hack which only works in summer
reedas 1:fe2e90c1c706 68 rawtime = rawtime + 3600; // GMT + 1 for BST
reedas 0:98c914fd9dae 69 timeinfo = localtime (&rawtime);
reedas 2:7b8ab39a1b6d 70 strftime (buffer,sizeof(buffer)," %r ",timeinfo);
reedas 0:98c914fd9dae 71 GUI_SetFont(GUI_FONT_32B_1);
reedas 1:fe2e90c1c706 72 GUI_DispStringHCenterAt(buffer,LCD_GetXSize()/2,LCD_GetYSize()/2 - GUI_GetFontSizeY()/2 - 20);
reedas 2:7b8ab39a1b6d 73 strftime (buffer,sizeof(buffer)," %A ",timeinfo);
reedas 1:fe2e90c1c706 74 GUI_SetFont(GUI_FONT_32B_1);
reedas 1:fe2e90c1c706 75 GUI_DispStringHCenterAt(buffer,LCD_GetXSize()/2,LCD_GetYSize()/2 - GUI_GetFontSizeY()/2 + 20);
reedas 2:7b8ab39a1b6d 76 strftime (buffer,sizeof(buffer)," %D ",timeinfo);
reedas 0:98c914fd9dae 77 GUI_SetFont(GUI_FONT_32B_1);
reedas 1:fe2e90c1c706 78 GUI_DispStringHCenterAt(buffer,LCD_GetXSize()/2,LCD_GetYSize()/2 - GUI_GetFontSizeY()/2 + 60);
reedas 0:98c914fd9dae 79 }
reedas 0:98c914fd9dae 80 /******************************************************************************************
reedas 0:98c914fd9dae 81 * NTPTimeThread
reedas 0:98c914fd9dae 82 * This thread calls the NTP Timeserver to get the UTC time
reedas 0:98c914fd9dae 83 * It then updates the time in the RTC
reedas 0:98c914fd9dae 84 * And it updates the display by adding an event to the display queue
reedas 0:98c914fd9dae 85 ********************************************************************************************/
reedas 0:98c914fd9dae 86 void NTPTimeThread()
reedas 0:98c914fd9dae 87 {
reedas 0:98c914fd9dae 88 static time_t old_timestamp = 0, timestamp;
reedas 0:98c914fd9dae 89 NTPClient ntpclient(wifi);
reedas 0:98c914fd9dae 90 while(1) {
reedas 0:98c914fd9dae 91 if(wifi->get_connection_status() == NSAPI_STATUS_GLOBAL_UP) {
reedas 0:98c914fd9dae 92 timestamp = ntpclient.get_timestamp();
reedas 0:98c914fd9dae 93 if (timestamp < old_timestamp) {
reedas 0:98c914fd9dae 94 displayQueue->call(updateDisplayNTPFailed);
reedas 0:98c914fd9dae 95 } else {
reedas 0:98c914fd9dae 96 set_time(timestamp);
reedas 0:98c914fd9dae 97 displayQueue->call(updateDisplayNTPCount);
reedas 0:98c914fd9dae 98 }
reedas 0:98c914fd9dae 99 }
reedas 0:98c914fd9dae 100 old_timestamp = timestamp;
reedas 0:98c914fd9dae 101 ThisThread::sleep_for(300000); // Goto the NTP server every 5 minutes
reedas 0:98c914fd9dae 102 }
reedas 0:98c914fd9dae 103 }
reedas 0:98c914fd9dae 104 /******************************************************************************************
reedas 0:98c914fd9dae 105 *
reedas 0:98c914fd9dae 106 * Main & WiFi Thread
reedas 0:98c914fd9dae 107 *
reedas 0:98c914fd9dae 108 ********************************************************************************************/
reedas 0:98c914fd9dae 109 // wifiStatusCallback
reedas 0:98c914fd9dae 110 // Changes the display when the wifi status is changed
reedas 0:98c914fd9dae 111 void wifiStatusCallback(nsapi_event_t status, intptr_t param)
reedas 0:98c914fd9dae 112 {
reedas 0:98c914fd9dae 113 const int buffSize=40;
reedas 0:98c914fd9dae 114 char *statusText;
reedas 0:98c914fd9dae 115 statusText = (char *)malloc(buffSize);
reedas 0:98c914fd9dae 116 switch(param) {
reedas 0:98c914fd9dae 117 case NSAPI_STATUS_LOCAL_UP:
reedas 0:98c914fd9dae 118 snprintf(statusText,buffSize,"WiFi IP = %s",wifi->get_ip_address());
reedas 0:98c914fd9dae 119 break;
reedas 0:98c914fd9dae 120 case NSAPI_STATUS_GLOBAL_UP:
reedas 0:98c914fd9dae 121 snprintf(statusText,buffSize,"WiFi IP = %s",wifi->get_ip_address());
reedas 0:98c914fd9dae 122 break;
reedas 0:98c914fd9dae 123 case NSAPI_STATUS_DISCONNECTED:
reedas 0:98c914fd9dae 124 WiFiSemaphore.release();
reedas 0:98c914fd9dae 125 snprintf(statusText,buffSize,"WiFi Disconnected");
reedas 0:98c914fd9dae 126 break;
reedas 0:98c914fd9dae 127 case NSAPI_STATUS_CONNECTING:
reedas 0:98c914fd9dae 128 snprintf(statusText,buffSize,"WiFi Connecting");
reedas 0:98c914fd9dae 129 break;
reedas 0:98c914fd9dae 130 default:
reedas 0:98c914fd9dae 131 snprintf(statusText,buffSize,"Not Supported");
reedas 0:98c914fd9dae 132 break;
reedas 0:98c914fd9dae 133 }
reedas 0:98c914fd9dae 134 displayQueue->call(updateDisplayWiFiStatus,statusText);
reedas 0:98c914fd9dae 135 }
reedas 0:98c914fd9dae 136 int main()
reedas 0:98c914fd9dae 137 {
reedas 0:98c914fd9dae 138 int wifiConnectionAttempts;
reedas 0:98c914fd9dae 139 int ret;
reedas 0:98c914fd9dae 140 GUI_Init();
reedas 0:98c914fd9dae 141 displayQueue = mbed_event_queue();
reedas 0:98c914fd9dae 142 displayQueue->call_every(1000, &updateDisplayTime);
reedas 0:98c914fd9dae 143 wifi = WiFiInterface::get_default_instance();
reedas 0:98c914fd9dae 144 wifi->attach(&wifiStatusCallback);
reedas 0:98c914fd9dae 145 while(1) {
reedas 0:98c914fd9dae 146 wifiConnectionAttempts = 1;
reedas 0:98c914fd9dae 147 do {
reedas 0:98c914fd9dae 148 ret = wifi->connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2);
reedas 0:98c914fd9dae 149 displayQueue->call(updateDisplayWiFiConnectAttempts,wifiConnectionAttempts);
reedas 0:98c914fd9dae 150 if (ret != 0) {
reedas 0:98c914fd9dae 151 wifiConnectionAttempts += 1;
reedas 0:98c914fd9dae 152 ThisThread::sleep_for(2000); // If for some reason it doesnt work wait 2s and try again
reedas 0:98c914fd9dae 153 }
reedas 0:98c914fd9dae 154 } while(ret !=0);
reedas 0:98c914fd9dae 155 // If the NTPThread is not running... then start it up
reedas 0:98c914fd9dae 156 if(netTimeThreadHandle.get_state() == Thread::Deleted)
reedas 0:98c914fd9dae 157 netTimeThreadHandle.start(NTPTimeThread);
reedas 0:98c914fd9dae 158 WiFiSemaphore.acquire();
reedas 0:98c914fd9dae 159 }
reedas 0:98c914fd9dae 160 }