Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@2:7b8ab39a1b6d, 2020-06-19 (annotated)
- 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?
User | Revision | Line number | New 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 | } |