Dependents:   SimpleLCDClock readCard2Twitter_http AnalogClock_StepperMotor_NTP ServoCamV1

Committer:
donatien
Date:
Mon May 24 10:24:38 2010 +0000
Revision:
0:a2dd0ba6cd2d
Child:
1:7043cc0db03c

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:a2dd0ba6cd2d 1 #ifndef SMTP_CLIENT_H
donatien 0:a2dd0ba6cd2d 2 #define SMTP_CLIENT_H
donatien 0:a2dd0ba6cd2d 3
donatien 0:a2dd0ba6cd2d 4 #include "if/net/net.h"
donatien 0:a2dd0ba6cd2d 5 #include "api/UdpSocket.h"
donatien 0:a2dd0ba6cd2d 6 #include "api/DnsRequest.h"
donatien 0:a2dd0ba6cd2d 7 #include "mbed.h"
donatien 0:a2dd0ba6cd2d 8
donatien 0:a2dd0ba6cd2d 9 #define NTP_PORT 123
donatien 0:a2dd0ba6cd2d 10 #define NTP_REQUEST_TIMEOUT 15000
donatien 0:a2dd0ba6cd2d 11 #define NTP_TIMESTAMP_DELTA 2208988800ull //Diff btw a UNIX timestamp (Starting Jan, 1st 1970) and a NTP timestamp (Starting Jan, 1st 1900)
donatien 0:a2dd0ba6cd2d 12
donatien 0:a2dd0ba6cd2d 13 enum NtpResult
donatien 0:a2dd0ba6cd2d 14 {
donatien 0:a2dd0ba6cd2d 15 NTP_OK,
donatien 0:a2dd0ba6cd2d 16 NTP_PROCESSING,
donatien 0:a2dd0ba6cd2d 17 NTP_PRTCL, //Protocol error
donatien 0:a2dd0ba6cd2d 18 NTP_TIMEOUT, //Connection timeout
donatien 0:a2dd0ba6cd2d 19 NTP_DNS //Could not resolve DNS Addr
donatien 0:a2dd0ba6cd2d 20 };
donatien 0:a2dd0ba6cd2d 21
donatien 0:a2dd0ba6cd2d 22 class NtpClient
donatien 0:a2dd0ba6cd2d 23 {
donatien 0:a2dd0ba6cd2d 24 public:
donatien 0:a2dd0ba6cd2d 25 NtpClient();
donatien 0:a2dd0ba6cd2d 26 virtual ~NtpClient();
donatien 0:a2dd0ba6cd2d 27
donatien 0:a2dd0ba6cd2d 28 //High level setup functions
donatien 0:a2dd0ba6cd2d 29 NtpResult setTime(const Host& host); //Blocking
donatien 0:a2dd0ba6cd2d 30 NtpResult setTime(const Host& host, void (*pMethod)(NtpResult)); //Non blocking
donatien 0:a2dd0ba6cd2d 31 template<class T>
donatien 0:a2dd0ba6cd2d 32 //Linker bug : Must be defined here :(
donatien 0:a2dd0ba6cd2d 33 NtpResult setTime(const Host& host, T* pItem, void (T::*pMethod)(NtpResult)) //Non blocking
donatien 0:a2dd0ba6cd2d 34 {
donatien 0:a2dd0ba6cd2d 35 setOnResult(pItem, pMethod);
donatien 0:a2dd0ba6cd2d 36 doSetTime(host);
donatien 0:a2dd0ba6cd2d 37 return NTP_PROCESSING;
donatien 0:a2dd0ba6cd2d 38 }
donatien 0:a2dd0ba6cd2d 39
donatien 0:a2dd0ba6cd2d 40 void doSetTime(const Host& host);
donatien 0:a2dd0ba6cd2d 41
donatien 0:a2dd0ba6cd2d 42 void setOnResult( void (*pMethod)(NtpResult) );
donatien 0:a2dd0ba6cd2d 43 class CDummy;
donatien 0:a2dd0ba6cd2d 44 template<class T>
donatien 0:a2dd0ba6cd2d 45 //Linker bug : Must be defined here :(
donatien 0:a2dd0ba6cd2d 46 void setOnResult( T* pItem, void (T::*pMethod)(NtpResult) )
donatien 0:a2dd0ba6cd2d 47 {
donatien 0:a2dd0ba6cd2d 48 m_pCbItem = (CDummy*) pItem;
donatien 0:a2dd0ba6cd2d 49 m_pCbMeth = (void (CDummy::*)(NtpResult)) pMethod;
donatien 0:a2dd0ba6cd2d 50 }
donatien 0:a2dd0ba6cd2d 51
donatien 0:a2dd0ba6cd2d 52 void init();
donatien 0:a2dd0ba6cd2d 53 void close();
donatien 0:a2dd0ba6cd2d 54
donatien 0:a2dd0ba6cd2d 55 private:
donatien 0:a2dd0ba6cd2d 56 __packed struct NtpPacket //See RFC 4330 for Simple NTP
donatien 0:a2dd0ba6cd2d 57 {
donatien 0:a2dd0ba6cd2d 58 //WARN: We are in LE! Network is BE!
donatien 0:a2dd0ba6cd2d 59 //LSb first
donatien 0:a2dd0ba6cd2d 60 unsigned mode : 3;
donatien 0:a2dd0ba6cd2d 61 unsigned vn : 3;
donatien 0:a2dd0ba6cd2d 62 unsigned li : 2;
donatien 0:a2dd0ba6cd2d 63
donatien 0:a2dd0ba6cd2d 64 uint8_t stratum;
donatien 0:a2dd0ba6cd2d 65 uint8_t poll;
donatien 0:a2dd0ba6cd2d 66 uint8_t precision;
donatien 0:a2dd0ba6cd2d 67 //32 bits header
donatien 0:a2dd0ba6cd2d 68
donatien 0:a2dd0ba6cd2d 69 uint32_t rootDelay;
donatien 0:a2dd0ba6cd2d 70 uint32_t rootDispersion;
donatien 0:a2dd0ba6cd2d 71 uint32_t refId;
donatien 0:a2dd0ba6cd2d 72
donatien 0:a2dd0ba6cd2d 73 uint32_t refTm_s;
donatien 0:a2dd0ba6cd2d 74 uint32_t refTm_f;
donatien 0:a2dd0ba6cd2d 75 uint32_t origTm_s;
donatien 0:a2dd0ba6cd2d 76 uint32_t origTm_f;
donatien 0:a2dd0ba6cd2d 77 uint32_t rxTm_s;
donatien 0:a2dd0ba6cd2d 78 uint32_t rxTm_f;
donatien 0:a2dd0ba6cd2d 79 uint32_t txTm_s;
donatien 0:a2dd0ba6cd2d 80 uint32_t txTm_f;
donatien 0:a2dd0ba6cd2d 81 };
donatien 0:a2dd0ba6cd2d 82
donatien 0:a2dd0ba6cd2d 83 void process(); //Main state-machine
donatien 0:a2dd0ba6cd2d 84
donatien 0:a2dd0ba6cd2d 85 void setTimeout(int ms);
donatien 0:a2dd0ba6cd2d 86 void resetTimeout();
donatien 0:a2dd0ba6cd2d 87
donatien 0:a2dd0ba6cd2d 88 void onTimeout(); //Connection has timed out
donatien 0:a2dd0ba6cd2d 89 void onDnsReply(DnsReply r);
donatien 0:a2dd0ba6cd2d 90 void onUdpSocketEvent(UdpSocketEvent e);
donatien 0:a2dd0ba6cd2d 91 void onResult(NtpResult r); //Called when exchange completed or on failure
donatien 0:a2dd0ba6cd2d 92
donatien 0:a2dd0ba6cd2d 93 NtpResult blockingProcess(); //Called in blocking mode, calls Net::poll() until return code is available
donatien 0:a2dd0ba6cd2d 94
donatien 0:a2dd0ba6cd2d 95 UdpSocket* m_pUdpSocket;
donatien 0:a2dd0ba6cd2d 96
donatien 0:a2dd0ba6cd2d 97 enum NtpStep
donatien 0:a2dd0ba6cd2d 98 {
donatien 0:a2dd0ba6cd2d 99 NTP_PING,
donatien 0:a2dd0ba6cd2d 100 NTP_PONG
donatien 0:a2dd0ba6cd2d 101 };
donatien 0:a2dd0ba6cd2d 102
donatien 0:a2dd0ba6cd2d 103 NtpStep m_state;
donatien 0:a2dd0ba6cd2d 104
donatien 0:a2dd0ba6cd2d 105 CDummy* m_pCbItem;
donatien 0:a2dd0ba6cd2d 106 void (CDummy::*m_pCbMeth)(NtpResult);
donatien 0:a2dd0ba6cd2d 107
donatien 0:a2dd0ba6cd2d 108 void (*m_pCb)(NtpResult);
donatien 0:a2dd0ba6cd2d 109
donatien 0:a2dd0ba6cd2d 110 Timeout m_watchdog;
donatien 0:a2dd0ba6cd2d 111 int m_timeout;
donatien 0:a2dd0ba6cd2d 112
donatien 0:a2dd0ba6cd2d 113 bool m_closed;
donatien 0:a2dd0ba6cd2d 114
donatien 0:a2dd0ba6cd2d 115 Host m_host;
donatien 0:a2dd0ba6cd2d 116
donatien 0:a2dd0ba6cd2d 117 DnsRequest* m_pDnsReq;
donatien 0:a2dd0ba6cd2d 118
donatien 0:a2dd0ba6cd2d 119 NtpResult m_blockingResult; //Result if blocking mode
donatien 0:a2dd0ba6cd2d 120
donatien 0:a2dd0ba6cd2d 121 };
donatien 0:a2dd0ba6cd2d 122
donatien 0:a2dd0ba6cd2d 123 #endif