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