plc/comm.h

Go to the documentation of this file.
00001 
00017 #ifndef _COMM_H
00018 #define _COMM_H
00019 
00020 #include <stdarg.h>
00021 #include "gridlabd.h"
00022 
00023 class Message {
00024 private:
00025     static unsigned int64 next_id;
00026     unsigned int64 id;
00027     class machine *src;
00028     class machine *dst;
00029     TIMESTAMP delivery_time; 
00030     size_t size; 
00031     void *data; 
00032     Message *next, *prev; 
00033 public:
00034     Message(void *ptr, size_t len, class machine *from, class machine *to)
00035     {
00036         id = next_id++;
00037         if (len>0)
00038         {
00039             data = malloc((len/16+1)*16); // allocation in 16 byte increments
00040             memcpy(data,ptr,len+1);
00041         }
00042         else
00043             data = NULL;
00044         size=len;
00045         src=from;
00046         dst=to;
00047         delivery_time = TS_NEVER;
00048         next = prev = NULL;
00049     };
00050     ~Message(void)
00051     {
00052         if (data!=NULL)
00053             free(data);
00054     }
00055     inline unsigned int64 get_id(void) const { return id;};
00056     inline void *get_data(void) const { return data;};
00057     inline size_t get_size(void) const { return size;};
00058     inline TIMESTAMP get_deliverytime(void) const { return delivery_time;};
00059     inline void set_deliverytime(TIMESTAMP dt) { delivery_time=dt;};
00060     inline class machine *get_src(void) const { return src;};
00061     inline class machine *get_dst(void) const { return dst;};
00062     inline Message *get_next(void) const { return next;};
00063     inline Message *get_prev(void) const { return prev;};
00064     inline void set_next(Message *msg) { next=msg;};
00065     inline void set_prev(Message *msg) { prev=msg;};
00066 };
00067 
00068 class Queue {
00069 private:
00070     Message *first;
00071     Message *last;
00072 public:
00073     Queue();
00074     ~Queue();
00075     void add(Message *msg);
00076     Message *peek(void);
00077     Message *take(Message *msg=NULL);
00078     TIMESTAMP next_delivery_time(void);
00079     inline bool is_empty(void) { return first==NULL;};
00080     Message *next(Message *msg);
00081     Message *drop(Message *msg, bool reverse=false);
00082 };
00083 
00084 #include "machine.h"
00085 
00086 class comm {
00087 public:
00088     double bitrate;             
00089     char256 latency;            
00090     double reliability;         
00091     double timeout;             
00092 private:
00093     Queue queue;
00094     RANDOMTYPE rtype;
00095     double a, b;
00096     TIMESTAMP next_delivery;
00097 public:
00098     static CLASS *oclass;
00099     static comm* defaults;
00100 public:
00101     comm(MODULE *mod);
00102     ~comm(void);
00103     int create();
00104     int init(OBJECT *parent);
00105     TIMESTAMP sync(TIMESTAMP t0);
00106 public:
00107     static void route(comm *net, Message *msg);
00108 protected:
00109     int send(void *data, size_t size, machine *from, machine *to);
00110 private:
00111     void route(Message *msg);
00112     friend class machine;
00113 };
00114 
00116 #endif

GridLAB-DTM Version 1.0
An open-source project initiated by the US Department of Energy