Rik Van Dyck / Mbed 2 deprecated Project_Embedded_C

Dependencies:   mbed DS1307 Servo TextLCD

Committer:
rikvandyck
Date:
Thu Dec 04 10:44:07 2014 +0000
Revision:
0:e1edd52b1ee2
test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rikvandyck 0:e1edd52b1ee2 1
rikvandyck 0:e1edd52b1ee2 2 /*
rikvandyck 0:e1edd52b1ee2 3 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
rikvandyck 0:e1edd52b1ee2 4
rikvandyck 0:e1edd52b1ee2 5 Permission is hereby granted, free of charge, to any person obtaining a copy
rikvandyck 0:e1edd52b1ee2 6 of this software and associated documentation files (the "Software"), to deal
rikvandyck 0:e1edd52b1ee2 7 in the Software without restriction, including without limitation the rights
rikvandyck 0:e1edd52b1ee2 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
rikvandyck 0:e1edd52b1ee2 9 copies of the Software, and to permit persons to whom the Software is
rikvandyck 0:e1edd52b1ee2 10 furnished to do so, subject to the following conditions:
rikvandyck 0:e1edd52b1ee2 11
rikvandyck 0:e1edd52b1ee2 12 The above copyright notice and this permission notice shall be included in
rikvandyck 0:e1edd52b1ee2 13 all copies or substantial portions of the Software.
rikvandyck 0:e1edd52b1ee2 14
rikvandyck 0:e1edd52b1ee2 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
rikvandyck 0:e1edd52b1ee2 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
rikvandyck 0:e1edd52b1ee2 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
rikvandyck 0:e1edd52b1ee2 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
rikvandyck 0:e1edd52b1ee2 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
rikvandyck 0:e1edd52b1ee2 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
rikvandyck 0:e1edd52b1ee2 21 THE SOFTWARE.
rikvandyck 0:e1edd52b1ee2 22 */
rikvandyck 0:e1edd52b1ee2 23
rikvandyck 0:e1edd52b1ee2 24 /** \file
rikvandyck 0:e1edd52b1ee2 25 NTP Client header file
rikvandyck 0:e1edd52b1ee2 26 */
rikvandyck 0:e1edd52b1ee2 27
rikvandyck 0:e1edd52b1ee2 28 #ifndef NTP_CLIENT_H
rikvandyck 0:e1edd52b1ee2 29 #define NTP_CLIENT_H
rikvandyck 0:e1edd52b1ee2 30
rikvandyck 0:e1edd52b1ee2 31 #include "core/net.h"
rikvandyck 0:e1edd52b1ee2 32 #include "core/netservice.h"
rikvandyck 0:e1edd52b1ee2 33 #include "api/UDPSocket.h"
rikvandyck 0:e1edd52b1ee2 34 #include "api/DNSRequest.h"
rikvandyck 0:e1edd52b1ee2 35 #include "mbed.h"
rikvandyck 0:e1edd52b1ee2 36
rikvandyck 0:e1edd52b1ee2 37 ///NTP Client results
rikvandyck 0:e1edd52b1ee2 38 enum NTPResult
rikvandyck 0:e1edd52b1ee2 39 {
rikvandyck 0:e1edd52b1ee2 40 NTP_OK, ///<Success
rikvandyck 0:e1edd52b1ee2 41 NTP_PROCESSING, ///<Processing
rikvandyck 0:e1edd52b1ee2 42 NTP_PRTCL, ///<Protocol error
rikvandyck 0:e1edd52b1ee2 43 NTP_TIMEOUT, ///<Connection timeout
rikvandyck 0:e1edd52b1ee2 44 NTP_DNS ///<Could not resolve DNS hostname
rikvandyck 0:e1edd52b1ee2 45 };
rikvandyck 0:e1edd52b1ee2 46
rikvandyck 0:e1edd52b1ee2 47 ///A NTP Client
rikvandyck 0:e1edd52b1ee2 48 /**
rikvandyck 0:e1edd52b1ee2 49 The NTP client is a simple UDP client that will update the mbed's RTC
rikvandyck 0:e1edd52b1ee2 50 */
rikvandyck 0:e1edd52b1ee2 51 class NTPClient : protected NetService
rikvandyck 0:e1edd52b1ee2 52 {
rikvandyck 0:e1edd52b1ee2 53 public:
rikvandyck 0:e1edd52b1ee2 54 /**
rikvandyck 0:e1edd52b1ee2 55 Instantiates the NTP client
rikvandyck 0:e1edd52b1ee2 56 */
rikvandyck 0:e1edd52b1ee2 57 NTPClient();
rikvandyck 0:e1edd52b1ee2 58 virtual ~NTPClient();
rikvandyck 0:e1edd52b1ee2 59
rikvandyck 0:e1edd52b1ee2 60 //High level setup functions
rikvandyck 0:e1edd52b1ee2 61
rikvandyck 0:e1edd52b1ee2 62 ///Gets current time (blocking)
rikvandyck 0:e1edd52b1ee2 63 /**
rikvandyck 0:e1edd52b1ee2 64 Updates the time using the server host
rikvandyck 0:e1edd52b1ee2 65 Blocks until completion
rikvandyck 0:e1edd52b1ee2 66 @param host : NTP server
rikvandyck 0:e1edd52b1ee2 67 */
rikvandyck 0:e1edd52b1ee2 68 NTPResult setTime(const Host& host); //Blocking
rikvandyck 0:e1edd52b1ee2 69
rikvandyck 0:e1edd52b1ee2 70 ///Gets current time (non-blocking)
rikvandyck 0:e1edd52b1ee2 71 /**
rikvandyck 0:e1edd52b1ee2 72 Updates the time using the server host
rikvandyck 0:e1edd52b1ee2 73 The function returns immediately and calls the callback on completion or error
rikvandyck 0:e1edd52b1ee2 74 @param host : NTP server
rikvandyck 0:e1edd52b1ee2 75 @param pMethod : callback function
rikvandyck 0:e1edd52b1ee2 76 */
rikvandyck 0:e1edd52b1ee2 77 NTPResult setTime(const Host& host, void (*pMethod)(NTPResult)); //Non blocking
rikvandyck 0:e1edd52b1ee2 78
rikvandyck 0:e1edd52b1ee2 79 ///Gets current time (non-blocking)
rikvandyck 0:e1edd52b1ee2 80 /**
rikvandyck 0:e1edd52b1ee2 81 Updates the time
rikvandyck 0:e1edd52b1ee2 82 @param host : NTP server
rikvandyck 0:e1edd52b1ee2 83 @param pItem : instance of class on which to execute the callback method
rikvandyck 0:e1edd52b1ee2 84 @param pMethod : callback method
rikvandyck 0:e1edd52b1ee2 85 The function returns immediately and calls the callback on completion or error
rikvandyck 0:e1edd52b1ee2 86 */
rikvandyck 0:e1edd52b1ee2 87 template<class T>
rikvandyck 0:e1edd52b1ee2 88 NTPResult setTime(const Host& host, T* pItem, void (T::*pMethod)(NTPResult)) //Non blocking
rikvandyck 0:e1edd52b1ee2 89 {
rikvandyck 0:e1edd52b1ee2 90 setOnResult(pItem, pMethod);
rikvandyck 0:e1edd52b1ee2 91 doSetTime(host);
rikvandyck 0:e1edd52b1ee2 92 return NTP_PROCESSING;
rikvandyck 0:e1edd52b1ee2 93 }
rikvandyck 0:e1edd52b1ee2 94
rikvandyck 0:e1edd52b1ee2 95 ///Gets current time (non-blocking)
rikvandyck 0:e1edd52b1ee2 96 /**
rikvandyck 0:e1edd52b1ee2 97 Updates the time using the server host
rikvandyck 0:e1edd52b1ee2 98 The function returns immediately and calls the previously set callback on completion or error
rikvandyck 0:e1edd52b1ee2 99 @param host : NTP server
rikvandyck 0:e1edd52b1ee2 100 */
rikvandyck 0:e1edd52b1ee2 101 void doSetTime(const Host& host);
rikvandyck 0:e1edd52b1ee2 102
rikvandyck 0:e1edd52b1ee2 103 ///Setups the result callback
rikvandyck 0:e1edd52b1ee2 104 /**
rikvandyck 0:e1edd52b1ee2 105 @param pMethod : callback function
rikvandyck 0:e1edd52b1ee2 106 */
rikvandyck 0:e1edd52b1ee2 107 void setOnResult( void (*pMethod)(NTPResult) );
rikvandyck 0:e1edd52b1ee2 108
rikvandyck 0:e1edd52b1ee2 109 ///Setups the result callback
rikvandyck 0:e1edd52b1ee2 110 /**
rikvandyck 0:e1edd52b1ee2 111 @param pItem : instance of class on which to execute the callback method
rikvandyck 0:e1edd52b1ee2 112 @param pMethod : callback method
rikvandyck 0:e1edd52b1ee2 113 */
rikvandyck 0:e1edd52b1ee2 114 class CDummy;
rikvandyck 0:e1edd52b1ee2 115 template<class T>
rikvandyck 0:e1edd52b1ee2 116 void setOnResult( T* pItem, void (T::*pMethod)(NTPResult) )
rikvandyck 0:e1edd52b1ee2 117 {
rikvandyck 0:e1edd52b1ee2 118 m_pCbItem = (CDummy*) pItem;
rikvandyck 0:e1edd52b1ee2 119 m_pCbMeth = (void (CDummy::*)(NTPResult)) pMethod;
rikvandyck 0:e1edd52b1ee2 120 }
rikvandyck 0:e1edd52b1ee2 121
rikvandyck 0:e1edd52b1ee2 122 void close();
rikvandyck 0:e1edd52b1ee2 123
rikvandyck 0:e1edd52b1ee2 124 protected:
rikvandyck 0:e1edd52b1ee2 125 virtual void poll(); //Called by NetServices
rikvandyck 0:e1edd52b1ee2 126
rikvandyck 0:e1edd52b1ee2 127 private:
rikvandyck 0:e1edd52b1ee2 128 void init();
rikvandyck 0:e1edd52b1ee2 129 void open();
rikvandyck 0:e1edd52b1ee2 130
rikvandyck 0:e1edd52b1ee2 131 __packed struct NTPPacket //See RFC 4330 for Simple NTP
rikvandyck 0:e1edd52b1ee2 132 {
rikvandyck 0:e1edd52b1ee2 133 //WARN: We are in LE! Network is BE!
rikvandyck 0:e1edd52b1ee2 134 //LSb first
rikvandyck 0:e1edd52b1ee2 135 unsigned mode : 3;
rikvandyck 0:e1edd52b1ee2 136 unsigned vn : 3;
rikvandyck 0:e1edd52b1ee2 137 unsigned li : 2;
rikvandyck 0:e1edd52b1ee2 138
rikvandyck 0:e1edd52b1ee2 139 uint8_t stratum;
rikvandyck 0:e1edd52b1ee2 140 uint8_t poll;
rikvandyck 0:e1edd52b1ee2 141 uint8_t precision;
rikvandyck 0:e1edd52b1ee2 142 //32 bits header
rikvandyck 0:e1edd52b1ee2 143
rikvandyck 0:e1edd52b1ee2 144 uint32_t rootDelay;
rikvandyck 0:e1edd52b1ee2 145 uint32_t rootDispersion;
rikvandyck 0:e1edd52b1ee2 146 uint32_t refId;
rikvandyck 0:e1edd52b1ee2 147
rikvandyck 0:e1edd52b1ee2 148 uint32_t refTm_s;
rikvandyck 0:e1edd52b1ee2 149 uint32_t refTm_f;
rikvandyck 0:e1edd52b1ee2 150 uint32_t origTm_s;
rikvandyck 0:e1edd52b1ee2 151 uint32_t origTm_f;
rikvandyck 0:e1edd52b1ee2 152 uint32_t rxTm_s;
rikvandyck 0:e1edd52b1ee2 153 uint32_t rxTm_f;
rikvandyck 0:e1edd52b1ee2 154 uint32_t txTm_s;
rikvandyck 0:e1edd52b1ee2 155 uint32_t txTm_f;
rikvandyck 0:e1edd52b1ee2 156 };
rikvandyck 0:e1edd52b1ee2 157
rikvandyck 0:e1edd52b1ee2 158 void process(); //Main state-machine
rikvandyck 0:e1edd52b1ee2 159
rikvandyck 0:e1edd52b1ee2 160 void setTimeout(int ms);
rikvandyck 0:e1edd52b1ee2 161 void resetTimeout();
rikvandyck 0:e1edd52b1ee2 162
rikvandyck 0:e1edd52b1ee2 163 void onTimeout(); //Connection has timed out
rikvandyck 0:e1edd52b1ee2 164 void onDNSReply(DNSReply r);
rikvandyck 0:e1edd52b1ee2 165 void onUDPSocketEvent(UDPSocketEvent e);
rikvandyck 0:e1edd52b1ee2 166 void onResult(NTPResult r); //Called when exchange completed or on failure
rikvandyck 0:e1edd52b1ee2 167
rikvandyck 0:e1edd52b1ee2 168 NTPResult blockingProcess(); //Called in blocking mode, calls Net::poll() until return code is available
rikvandyck 0:e1edd52b1ee2 169
rikvandyck 0:e1edd52b1ee2 170 UDPSocket* m_pUDPSocket;
rikvandyck 0:e1edd52b1ee2 171
rikvandyck 0:e1edd52b1ee2 172 enum NTPStep
rikvandyck 0:e1edd52b1ee2 173 {
rikvandyck 0:e1edd52b1ee2 174 NTP_PING,
rikvandyck 0:e1edd52b1ee2 175 NTP_PONG
rikvandyck 0:e1edd52b1ee2 176 };
rikvandyck 0:e1edd52b1ee2 177
rikvandyck 0:e1edd52b1ee2 178 NTPStep m_state;
rikvandyck 0:e1edd52b1ee2 179
rikvandyck 0:e1edd52b1ee2 180 NTPPacket m_pkt;
rikvandyck 0:e1edd52b1ee2 181
rikvandyck 0:e1edd52b1ee2 182 CDummy* m_pCbItem;
rikvandyck 0:e1edd52b1ee2 183 void (CDummy::*m_pCbMeth)(NTPResult);
rikvandyck 0:e1edd52b1ee2 184
rikvandyck 0:e1edd52b1ee2 185 void (*m_pCb)(NTPResult);
rikvandyck 0:e1edd52b1ee2 186
rikvandyck 0:e1edd52b1ee2 187 Timer m_watchdog;
rikvandyck 0:e1edd52b1ee2 188 int m_timeout;
rikvandyck 0:e1edd52b1ee2 189
rikvandyck 0:e1edd52b1ee2 190 bool m_closed;
rikvandyck 0:e1edd52b1ee2 191
rikvandyck 0:e1edd52b1ee2 192 Host m_host;
rikvandyck 0:e1edd52b1ee2 193
rikvandyck 0:e1edd52b1ee2 194 DNSRequest* m_pDnsReq;
rikvandyck 0:e1edd52b1ee2 195
rikvandyck 0:e1edd52b1ee2 196 NTPResult m_blockingResult; //Result if blocking mode
rikvandyck 0:e1edd52b1ee2 197
rikvandyck 0:e1edd52b1ee2 198 };
rikvandyck 0:e1edd52b1ee2 199
rikvandyck 0:e1edd52b1ee2 200 #endif