| 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 */ | 
|---|