00001 #ifndef _BASIC_H__
00002 #define _BASIC_H__
00003
00004 #include <awds/NodeId.h>
00005 #include <awds/BasePacket.h>
00006 #include <gea/Handle.h>
00007 #include <gea/Time.h>
00008
00009 namespace awds {
00010
00013 struct basic {
00014
00015 typedef void (*recv_callback_t)(BasePacket *p, void *self_p);
00016 recv_callback_t recv_callback;
00017 void *recv_callback_data;
00018 gea::Duration recvTimeout;
00019
00020 NodeId BroadcastId;
00021 NodeId MyId;
00022
00023 protected:
00024 gea::Handle *sendHandle;
00025 gea::Handle *recvHandle;
00026 public:
00027
00028 basic() : recv_callback(0), recvTimeout(30,2) {}
00029 virtual void setSendDest(const NodeId& id) = 0;
00030 virtual void getRecvSrc(NodeId& id) = 0;
00031 virtual ~basic() = 0;
00032
00033 virtual bool doSend(BasePacket *p) {
00034 setSendDest(p->dest);
00035 ssize_t ret = sendHandle->write(p->buffer, p->size);
00036 if (p->cb)
00037 p->cb(*p, p->cb_data, ret);
00038 p->cb = NULL;
00039 return ret >= 0;
00040
00041 }
00042
00043 virtual bool send(BasePacket *p, bool high_prio) {
00044 return doSend(p);
00045 }
00046
00047
00048
00049 virtual void start();
00050
00051 protected:
00052 static void recv_data(gea::Handle *h, gea::AbsTime t, void *data);
00053
00054 };
00055
00056 }
00057
00058 #endif //BASIC_H__
00059
00060
00061
00062
00063
00064