Dependents:   SimpleLCDClock readCard2Twitter_http AnalogClock_StepperMotor_NTP ServoCamV1

Committer:
donatien
Date:
Mon May 24 10:23:42 2010 +0000
Revision:
0:3717b703f76d
Child:
1:e52ec2a24c6a

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:3717b703f76d 1 #ifndef NETUDPSOCKET_H
donatien 0:3717b703f76d 2 #define NETUDPSOCKET_H
donatien 0:3717b703f76d 3
donatien 0:3717b703f76d 4 #include "net.h"
donatien 0:3717b703f76d 5 #include "host.h"
donatien 0:3717b703f76d 6
donatien 0:3717b703f76d 7 #include <queue>
donatien 0:3717b703f76d 8 using std::queue;
donatien 0:3717b703f76d 9
donatien 0:3717b703f76d 10 //Implements a Berkeley-like socket if
donatien 0:3717b703f76d 11 //Can be interfaced either to lwip or a Telit module
donatien 0:3717b703f76d 12
donatien 0:3717b703f76d 13 enum NetUdpSocketErr
donatien 0:3717b703f76d 14 {
donatien 0:3717b703f76d 15 __NETUDPSOCKET_MIN = -0xFFFF,
donatien 0:3717b703f76d 16 NETUDPSOCKET_SETUP, //NetUdpSocket not properly configured
donatien 0:3717b703f76d 17 NETUDPSOCKET_IF, //If has problems
donatien 0:3717b703f76d 18 NETUDPSOCKET_MEM, //Not enough mem
donatien 0:3717b703f76d 19 NETUDPSOCKET_INUSE, //If/Port is in use
donatien 0:3717b703f76d 20 //...
donatien 0:3717b703f76d 21 NETUDPSOCKET_OK = 0
donatien 0:3717b703f76d 22 };
donatien 0:3717b703f76d 23
donatien 0:3717b703f76d 24 enum NetUdpSocketEvent //Only one lonely event here... but who knows, maybe some day there'll be another one!
donatien 0:3717b703f76d 25 {
donatien 0:3717b703f76d 26 NETUDPSOCKET_READABLE, //Data in buf
donatien 0:3717b703f76d 27 };
donatien 0:3717b703f76d 28
donatien 0:3717b703f76d 29
donatien 0:3717b703f76d 30 class NetUdpSocket
donatien 0:3717b703f76d 31 {
donatien 0:3717b703f76d 32 public:
donatien 0:3717b703f76d 33 NetUdpSocket();
donatien 0:3717b703f76d 34 virtual ~NetUdpSocket(); //close()
donatien 0:3717b703f76d 35
donatien 0:3717b703f76d 36 virtual NetUdpSocketErr bind(const Host& me) = 0;
donatien 0:3717b703f76d 37
donatien 0:3717b703f76d 38 virtual int /*if < 0 : NetUdpSocketErr*/ sendto(const char* buf, int len, Host* pHost) = 0;
donatien 0:3717b703f76d 39 virtual int /*if < 0 : NetUdpSocketErr*/ recvfrom(char* buf, int len, Host* pHost) = 0;
donatien 0:3717b703f76d 40
donatien 0:3717b703f76d 41 /* TODO NTH : printf / scanf helpers that call send/recv */
donatien 0:3717b703f76d 42
donatien 0:3717b703f76d 43 virtual NetUdpSocketErr close() = 0;
donatien 0:3717b703f76d 44
donatien 0:3717b703f76d 45 virtual NetUdpSocketErr poll() = 0;
donatien 0:3717b703f76d 46
donatien 0:3717b703f76d 47 class CDummy;
donatien 0:3717b703f76d 48 //Callbacks
donatien 0:3717b703f76d 49 template<class T>
donatien 0:3717b703f76d 50 //Linker bug : Must be defined here :(
donatien 0:3717b703f76d 51 void setOnEvent( T* pItem, void (T::*pMethod)(NetUdpSocketEvent) )
donatien 0:3717b703f76d 52 {
donatien 0:3717b703f76d 53 m_pCbItem = (CDummy*) pItem;
donatien 0:3717b703f76d 54 m_pCbMeth = (void (CDummy::*)(NetUdpSocketEvent)) pMethod;
donatien 0:3717b703f76d 55 }
donatien 0:3717b703f76d 56
donatien 0:3717b703f76d 57 void resetOnEvent(); //Disable callback
donatien 0:3717b703f76d 58
donatien 0:3717b703f76d 59 protected:
donatien 0:3717b703f76d 60 void queueEvent(NetUdpSocketEvent e);
donatien 0:3717b703f76d 61 void discardEvents();
donatien 0:3717b703f76d 62 void flushEvents(); //to be called during polling
donatien 0:3717b703f76d 63
donatien 0:3717b703f76d 64 Host m_host;
donatien 0:3717b703f76d 65 Host m_client;
donatien 0:3717b703f76d 66
donatien 0:3717b703f76d 67 friend class Net;
donatien 0:3717b703f76d 68 int m_refs;
donatien 0:3717b703f76d 69
donatien 0:3717b703f76d 70 bool m_closed;
donatien 0:3717b703f76d 71 bool m_removed;
donatien 0:3717b703f76d 72
donatien 0:3717b703f76d 73 private:
donatien 0:3717b703f76d 74 //We do not want to execute user code in interrupt routines, so we queue events until the server is polled
donatien 0:3717b703f76d 75 //If we port this to a multithreaded OS, we could avoid this (however some functions here are not thread-safe, so beware ;) )
donatien 0:3717b703f76d 76 void onEvent(NetUdpSocketEvent e); //To be called on poll
donatien 0:3717b703f76d 77 CDummy* m_pCbItem;
donatien 0:3717b703f76d 78 void (CDummy::*m_pCbMeth)(NetUdpSocketEvent);
donatien 0:3717b703f76d 79 queue<NetUdpSocketEvent> m_events;
donatien 0:3717b703f76d 80
donatien 0:3717b703f76d 81 };
donatien 0:3717b703f76d 82
donatien 0:3717b703f76d 83 #endif