| 1 | /*-----------------------------------------------------------------------------
 | 
|---|
| 2 | msg.h -- Messages and message queues
 | 
|---|
| 3 | 
 | 
|---|
| 4 | Copyright (c) 1994 JANZ Computer AG
 | 
|---|
| 5 | All Rights Reserved
 | 
|---|
| 6 | 
 | 
|---|
| 7 | Created 94/10/11 by Soenke Hansen
 | 
|---|
| 8 | Version 1.7 of 99/12/07
 | 
|---|
| 9 | 
 | 
|---|
| 10 | Messages consist of a specifier for its contents, the (address of its)
 | 
|---|
| 11 | contents, and the relevant length of the contents.  Messages are
 | 
|---|
| 12 | allocated from the heap with the maximum length of the contents specified.
 | 
|---|
| 13 | The relevant length is useful when transmitting the message outside
 | 
|---|
| 14 | the local address space.
 | 
|---|
| 15 | Messages can be linked to form message queues or lists.
 | 
|---|
| 16 | 
 | 
|---|
| 17 | -----------------------------------------------------------------------------*/
 | 
|---|
| 18 | 
 | 
|---|
| 19 | #ifndef msg_DEFINED
 | 
|---|
| 20 | #define msg_DEFINED
 | 
|---|
| 21 | 
 | 
|---|
| 22 | #ifdef __cplusplus
 | 
|---|
| 23 | extern "C" {
 | 
|---|
| 24 | #endif
 | 
|---|
| 25 | 
 | 
|---|
| 26 | #include "defs.h"
 | 
|---|
| 27 | 
 | 
|---|
| 28 | /* Mode or format type of a message */
 | 
|---|
| 29 | #define MMODE_LOCAL             0x01    /* internal compiler specific format */
 | 
|---|
| 30 | #define MMODE_TRANSFER          0x02    /* external format for transfer */
 | 
|---|
| 31 | 
 | 
|---|
| 32 | /* Maximum length definitions */
 | 
|---|
| 33 | #define BCAN_LEN         8      /* max data length in CAN message */
 | 
|---|
| 34 | #define MB_LEN          16      /* max data length in bounded sized message */
 | 
|---|
| 35 | 
 | 
|---|
| 36 | /* Message contents types */
 | 
|---|
| 37 | struct m_m1 {   /* multiple purpose message (local format) */
 | 
|---|
| 38 |         WORD_t  w[6];
 | 
|---|
| 39 | };
 | 
|---|
| 40 | struct m_m2 {   /* for BCAN messages (local format) */
 | 
|---|
| 41 |         WORD_t  r;              /* request id */
 | 
|---|
| 42 |         WORD_t  d;              /* descriptor */
 | 
|---|
| 43 |         BYTE_t  b[BCAN_LEN];    /* data bytes */
 | 
|---|
| 44 | };
 | 
|---|
| 45 | struct m_m3 {   /* generic transfer data buffer */
 | 
|---|
| 46 |         BYTE_t  len;            /* length, number of relevant bytes */
 | 
|---|
| 47 |         BYTE_t  gap;            /* just to align component b[] */
 | 
|---|
| 48 |         BYTE_t  b[MB_LEN];      /* bounded buffer */
 | 
|---|
| 49 |         BYTE_t  *pb;            /* allocated buffer if len > MB_LEN */
 | 
|---|
| 50 | };
 | 
|---|
| 51 | 
 | 
|---|
| 52 | struct m_m4 {   /* transfer data buffer for bulk purposes */
 | 
|---|
| 53 |         BYTE_t          len;            /* length, number of relevant bytes */
 | 
|---|
| 54 |         BYTE_t          gap1;           /* just to align component b[] */
 | 
|---|
| 55 | 
 | 
|---|
| 56 |         BYTE_t          available;
 | 
|---|
| 57 |         BYTE_t          gap2;           /* align */
 | 
|---|
| 58 |         WORD_t          actByteCount;   /* actual usage of bulk buffer */
 | 
|---|
| 59 |         LWORD_t         actTime;        /* last write time of this bulk buffer */
 | 
|---|
| 60 |         BYTE_t          *pActData;      /* pointer to actual write-data location */
 | 
|---|
| 61 |         
 | 
|---|
| 62 |         BYTE_t          gap3[4];        /* gap */
 | 
|---|
| 63 |         BYTE_t          *pb;            /* allocated buffer */
 | 
|---|
| 64 | };
 | 
|---|
| 65 | 
 | 
|---|
| 66 | /* Message object definition */
 | 
|---|
| 67 | struct message {
 | 
|---|
| 68 |         BYTE_t          spec;   /* message contents specifier */
 | 
|---|
| 69 |         BYTE_t          mode;   /* mode (message format type) */
 | 
|---|
| 70 |         union {                 /* message contents */
 | 
|---|
| 71 |                 WORD_t          align;
 | 
|---|
| 72 |                 /* mode == MMODE_LOCAL */
 | 
|---|
| 73 |                 struct m_m1     m1;
 | 
|---|
| 74 |                 struct m_m2     m2;
 | 
|---|
| 75 |                 /* mode == MMODE_TRANSFER */
 | 
|---|
| 76 |                 struct m_m3     m3;
 | 
|---|
| 77 |                 /* mode == MMODE_TRANSFER for bulk/sniff buffer */
 | 
|---|
| 78 |                 struct m_m4     m4;
 | 
|---|
| 79 |         } u;
 | 
|---|
| 80 |         struct message  *next;  /* next on list/queue */
 | 
|---|
| 81 | };
 | 
|---|
| 82 | 
 | 
|---|
| 83 | #define NIL_MESSAGE     (struct message *)0
 | 
|---|
| 84 | 
 | 
|---|
| 85 | /* Message components for mode==MMODE_TRANSFER */
 | 
|---|
| 86 | #define mlen    u.m3.len        /* usage: m->mlen (if: struct message *m) */
 | 
|---|
| 87 | #define fdata   u.m3.b          /* pointer to fixed length data buffer */
 | 
|---|
| 88 | #define vdata   u.m3.pb         /* pointer to variable length data buffer */
 | 
|---|
| 89 | /* Pointer to beginning of data buffer */
 | 
|---|
| 90 | #define m_data(m) (((m)->mlen > MB_LEN) ? (m)->vdata : (m)->fdata)
 | 
|---|
| 91 | 
 | 
|---|
| 92 | /* definitions for bulk buffer transfer */
 | 
|---|
| 93 | /* (always MMODE_TRANSFER, always variable length data buffer) */
 | 
|---|
| 94 | #define mBulkAvailable    u.m4.available        /* usage: m->mBulkAvailable */
 | 
|---|
| 95 | #define mBulkActByteCount u.m4.actByteCount     /* usage: m->mBulkActByteCount */
 | 
|---|
| 96 | #define mBulkActTim       u.m4.actTime          /* usage: m->mBulkActTime */
 | 
|---|
| 97 | #define mBulkDataAddr     u.m4.pActData         /* usage: m->mBulkDataAddr */
 | 
|---|
| 98 | 
 | 
|---|
| 99 | /* definitions for sniff buffer transfer */
 | 
|---|
| 100 | /* (always MMODE_TRANSFER, always variable length data buffer) */
 | 
|---|
| 101 | #define mSniffAvailable   u.m4.available        /* usage: m->mSniffAvailable */
 | 
|---|
| 102 | #define mSniffActByteCount u.m4.actByteCount    /* usage: m->mSniffActByteCount */
 | 
|---|
| 103 | #define mSniffActTim      u.m4.actTime          /* usage: m->mSniffActTime */
 | 
|---|
| 104 | #define mSniffDataAddr    u.m4.pActData         /* usage: m->mSniffDataAddr */
 | 
|---|
| 105 | 
 | 
|---|
| 106 | /* Components of a timer message (struct m_m1) */
 | 
|---|
| 107 | #define timer_period    u.m1.w[0]
 | 
|---|
| 108 | #define timer_req       u.m1.w[0]
 | 
|---|
| 109 | #define timer_tid       u.m1.w[1]
 | 
|---|
| 110 | #define timer_tleft     u.m1.w[2]
 | 
|---|
| 111 | 
 | 
|---|
| 112 | /* Components of a filter message (struct m_m1) */
 | 
|---|
| 113 | #define afil_id         u.m1.w[0]
 | 
|---|
| 114 | #define afil_idlow      u.m1.w[0]
 | 
|---|
| 115 | #define afil_idhigh     u.m1.w[1]
 | 
|---|
| 116 | 
 | 
|---|
| 117 | /* Components of contents of struct m_m1 message */
 | 
|---|
| 118 | #define bcan_reset      u.m1.w[0]       /* !=0 if reset for M_BCAN_SET*req */
 | 
|---|
| 119 | #define bcan_acm        u.m1.w[1]       /* M_BCAN_SET_ACM_req */
 | 
|---|
| 120 | #define bcan_btr        u.m1.w[1]       /* M_BCAN_SET_BTR_req */
 | 
|---|
| 121 | #define bcan_evt        u.m1.w[0]       /* M_BCAN_EVENT_ind */
 | 
|---|
| 122 | #define bcan_evt_e0     u.m1.w[1]       /*  M_BCAN_EVENT_ind extended error */
 | 
|---|
| 123 | #define bcan_evt_e1     u.m1.w[2]       /*  M_BCAN_EVENT_ind extended error*/
 | 
|---|
| 124 | #define bcan_evt_e2     u.m1.w[3]       /*  M_BCAN_EVENT_ind extended error*/
 | 
|---|
| 125 | #define bcan_evt_e3     u.m1.w[4]       /*  M_BCAN_EVENT_ind extended error*/
 | 
|---|
| 126 | #define bcan_txreq      u.m1.w[0]       /* M_BCAN_TX_con */
 | 
|---|
| 127 | #define bcan_txcon      u.m1.w[1]       /* M_BCAN_TX_con */
 | 
|---|
| 128 | 
 | 
|---|
| 129 | /* Components of a BCAN message (struct m_m2) */
 | 
|---|
| 130 | #define bcan_req        u.m2.r
 | 
|---|
| 131 | #define bcan_desc       u.m2.d
 | 
|---|
| 132 | #define bcan_data       u.m2.b
 | 
|---|
| 133 | 
 | 
|---|
| 134 | 
 | 
|---|
| 135 | /* Message queues */
 | 
|---|
| 136 | struct mqueue {
 | 
|---|
| 137 |         struct message  *head;  /* first element on queue */
 | 
|---|
| 138 |         struct message  *tail;  /* last element on queue */
 | 
|---|
| 139 |         struct message  *pos;   /* current position in queue */
 | 
|---|
| 140 | };
 | 
|---|
| 141 | 
 | 
|---|
| 142 | #define NIL_MQUEUE      (struct mqueue *)0
 | 
|---|
| 143 | 
 | 
|---|
| 144 | /* Get pointer to the first message in a queue */
 | 
|---|
| 145 | #define head_mqueue(q) ((q)->head)
 | 
|---|
| 146 | #define first_mqueue(q) ((q)->head)
 | 
|---|
| 147 | 
 | 
|---|
| 148 | /* Remove the head from a non-empty queue */
 | 
|---|
| 149 | #define rmhead_mqueue(q) do { \
 | 
|---|
| 150 |                 if ((q)->head != (q)->tail) (q)->head = (q)->head->next; \
 | 
|---|
| 151 |                 else (q)->head = (q)->tail = NIL_MESSAGE; \
 | 
|---|
| 152 |                 } while (0)
 | 
|---|
| 153 | 
 | 
|---|
| 154 | 
 | 
|---|
| 155 | /* Allocate a message */
 | 
|---|
| 156 | extern struct message *new_message _PARAMS((int, int));
 | 
|---|
| 157 | 
 | 
|---|
| 158 | /* Deallocate a message */
 | 
|---|
| 159 | extern void delete_message _PARAMS((struct message *));
 | 
|---|
| 160 | 
 | 
|---|
| 161 | /* Allocate a message queue */
 | 
|---|
| 162 | extern struct mqueue *new_mqueue _PARAMS((void));
 | 
|---|
| 163 | 
 | 
|---|
| 164 | /* Deallocate a message queue. Any messages in the queue are also
 | 
|---|
| 165 |    deallocated. */
 | 
|---|
| 166 | extern void delete_mqueue _PARAMS((struct mqueue *));
 | 
|---|
| 167 | 
 | 
|---|
| 168 | /* Remove the first message from a queue. The address of the message
 | 
|---|
| 169 |    is returned. */
 | 
|---|
| 170 | extern struct message * extract_mqueue _PARAMS((struct mqueue *));
 | 
|---|
| 171 | 
 | 
|---|
| 172 | /* Append a message to a queue */
 | 
|---|
| 173 | extern void append_mqueue _PARAMS((struct mqueue *, struct message *));
 | 
|---|
| 174 | 
 | 
|---|
| 175 | /* Rewind queue for looping through its elements */
 | 
|---|
| 176 | extern void rewind_mqueue _PARAMS((struct mqueue *));
 | 
|---|
| 177 | 
 | 
|---|
| 178 | /* Get next message from queue */
 | 
|---|
| 179 | extern struct message *getnext_mqueue _PARAMS((struct mqueue *));
 | 
|---|
| 180 | 
 | 
|---|
| 181 | /* Delete the successor of a message from a queue.  The deleted (not
 | 
|---|
| 182 |    freed!) message is returned. */
 | 
|---|
| 183 | extern struct message *
 | 
|---|
| 184 | delsuc_mqueue _PARAMS((struct mqueue *, struct message *));
 | 
|---|
| 185 | 
 | 
|---|
| 186 | /* Insert a message into the queue after a specified message. */
 | 
|---|
| 187 | extern void
 | 
|---|
| 188 | insert_mqueue _PARAMS((struct mqueue *, struct message *, struct message *));
 | 
|---|
| 189 | 
 | 
|---|
| 190 | #ifdef __cplusplus
 | 
|---|
| 191 | }
 | 
|---|
| 192 | #endif
 | 
|---|
| 193 | 
 | 
|---|
| 194 | #endif /* !msg_DEFINED */
 | 
|---|