62 typedef struct __stMAILBOX {
64 struct stTask* pst_Task;
80 #define __MAIL_MSG_MAX_DATA_LEN 16 // can be no BIGGER than 16 bytes
82 typedef struct __stMAILMESSAGE {
84 uint16_t u16_FromTaskID;
86 uint32_t u32_Postmark;
97 #define ESOS_MAILMESSAGE_STRING 0x0
98 #define ESOS_MAILMESSAGE_UINT8 0x1
99 #define ESOS_MAILMESSAGE_UINT16 0x2
100 #define ESOS_MAILMESSAGE_UINT32 0x4
101 #define ESOS_MAILMESSAGE_REQUEST_ACK 0x8
104 #define __MAIL_MSG_HEADER_LEN (1+2+1+4)
105 #define __MAIL_MSG_MAX_LEN (__MAIL_MSG_HEADER_LEN+__MAIL_MSG_MAX_DATA_LEN)
108 #define MAX_SIZE_TASK_MAILBOX 5*__MAIL_MSG_MAX_LEN
119 #define ESOS_TASK_HAS_MAIL(pstTask) (__ESOS_CB_IS_NOT_EMPTY((pstTask)->pst_Mailbox->pst_CBuffer))
129 #define ESOS_TASK_IS_WAITING_MAIL_DELIVERY(TaskHandle) IS_BIT_SET_MASK((TaskHandle)->flags, __TASK_MAILNACK_MASK)
141 #define ESOS_TASK_IVE_GOT_MAIL() ESOS_TASK_HAS_MAIL(__pstSelf)
150 #define ESOS_TASK_WAIT_FOR_MAIL() ESOS_TASK_WAIT_UNTIL(ESOS_TASK_IVE_GOT_MAIL())
164 #define ESOS_TASK_WAIT_ON_TASKS_MAILBOX_HAS_AT_LEAST(pstTask, x) ESOS_TASK_WAIT_UNTIL(ESOS_TASK_MAILBOX_GOT_AT_LEAST_DATA_BYTES((pstTask), ((x)+__MAIL_MSG_HEADER_LEN)))
180 #define ESOS_TASK_WAIT_ON_TASKS_MAILBOX_HAS_ROOM_MESSAGE(pstTask, pstMsg) \
181 ESOS_TASK_WAIT_ON_TASKS_MAILBOX_HAS_AT_LEAST(pstTask, __MAIL_MSG_MAX_DATA_LEN )
191 #define ESOS_TASK_MAILBOX_GET_AVAILABLE_LEN(pstTask) ((__ESOS_CB_GET_AVAILABLE((pstTask)->pst_Mailbox->pst_CBuffer))-__MAIL_MSG_HEADER_LEN)
203 #define ESOS_TASK_MAILBOX_GOT_EXACTLY_DATA_BYTES(pstTask,x) (ESOS_TASK_MAILBOX_GET_AVAILABLE_LEN((pstTask)) == ((x)+__MAIL_MSG_HEADER_LEN))
216 #define ESOS_TASK_MAILBOX_GOT_AT_LEAST_DATA_BYTES(pstTask, x) (ESOS_TASK_MAILBOX_GET_AVAILABLE_LEN((pstTask)) >= ((x)+__MAIL_MSG_HEADER_LEN))
230 #define ESOS_TASK_FLUSH_TASK_MAILBOX(pstTask) __ESOS_CB_FLUSH((pstTask)->pst_Mailbox->pst_CBuffer)
232 #define ESOS_TASK_SEND_MESSAGE(pst_ToTask, pst_Msg) __esos_SendMailMessage((pst_ToTask),(pst_Msg))
234 #define ESOS_TASK_WAIT_ON_DELIVERY(pst_ToTask, pstMsg) \
236 (pstMsg)->u8_flags |= ESOS_MAILMESSAGE_REQUEST_ACK; \
237 ESOS_TASK_SEND_MESSAGE((pst_ToTask),(pstMsg)); \
238 __ESOS_SET_TASK_MAILNACK_FLAG((__pstSelf)); \
239 ESOS_TASK_WAIT_WHILE( ESOS_TASK_IS_WAITING_MAIL_DELIVERY( __pstSelf ) ); \
242 #define ESOS_TASK_GET_NEXT_MESSAGE(pst_Msg) __esos_ReadMailMessage(__pstSelf, (pst_Msg))
244 #define ESOS_TASK_GET_LAST_MESSAGE(pst_Msg) \
246 while ( ESOS_TASK_IVE_GOT_MAIL() ) { \
247 __esos_ReadMailMessage(__pstSelf, (pst_Msg) ); \
254 #define ESOS_IS_TASK_SENDER(hTask, stMsg) (hTask->u16_taskID==stMsg.u16_FromTaskID)
256 #define ESOS_SET_MSG_FLAGS(stMsg, flags) stMsg.u8_flags=(flags)
257 #define ESOS_SET_MSG_FROMTASK(stMsg, pstFromTask) stMsg.u16_FromTaskID=pstFromTask->u16_taskID
258 #define ESOS_SET_MSG_DATA_LENGTH(stMsg, len) stMsg.u8_DataLength=(len)
259 #define ESOS_GET_MSG_FLAGS(stMsg) (stMsg.u8_flags)
260 #define ESOS_GET_MSG_FROMTASK(stMsg) (stMsg.u16_FromTaskID)
261 #define ESOS_GET_MSG_DATA_LENGTH(stMsg) (stMsg.u8_DataLength)
262 #define ESOS_GET_MSG_POSTMARK(stMsg) (stMsg.u32_Postmark)
264 #define ESOS_SET_PMSG_FLAGS(pstMsg, flags) pstMsg->u8_flags=(flags)
265 #define ESOS_SET_PMSG_FROMTASK(pstMsg, pstFromTask) pstMsg->u16_FromTaskID=pstFromTask->u16_taskID
266 #define ESOS_SET_PMSG_DATA_LENGTH(pstMsg, len) pstMsg->u8_DataLength=(len)
267 #define ESOS_GET_PMSG_FLAGS(pstMsg) (pstMsg->u8_flags)
268 #define ESOS_GET_PMSG_FROMTASK(pstMsg) (pstMsg->u16_FromTaskID)
269 #define ESOS_GET_PMSG_DATA_LENGTH(pstMsg) (pstMsg->u8_DataLength)
270 #define ESOS_GET_PMSG_POSTMARK(pstMsg) (pstMsg->u32_Postmark)
272 #define ESOS_TASK_MAKE_MSG_EMPTY(stMsg) \
274 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT8); \
275 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \
276 ESOS_SET_MSG_DATA_LENGTH(stMsg, 0); \
279 #define ESOS_TASK_MAKE_MSG_UINT8(stMsg, u8x) \
281 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT8); \
282 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \
283 ESOS_SET_MSG_DATA_LENGTH(stMsg, 1); \
284 stMsg.au8_Contents[0] = (u8x); \
287 #define ESOS_TASK_MAKE_MSG_UINT8_X2(stMsg, u8x0, u8x1) \
289 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT8); \
290 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \
291 ESOS_SET_MSG_DATA_LENGTH(stMsg, 2); \
292 stMsg.au8_Contents[0] = (u8x0); \
293 stMsg.au8_Contents[1] = (u8x1); \
296 #define ESOS_TASK_MAKE_MSG_UINT8_X3(stMsg, u8x0, u8x1, u8x2) \
298 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT8); \
299 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \
300 ESOS_SET_MSG_DATA_LENGTH(stMsg, 3); \
301 stMsg.au8_Contents[0] = (u8x0); \
302 stMsg.au8_Contents[1] = (u8x1); \
303 stMsg.au8_Contents[2] = (u8x2); \
306 #define ESOS_TASK_MAKE_MSG_UINT8_X4(stMsg, u8x0, u8x1, u8x2, u8x3) \
308 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT8); \
309 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \
310 ESOS_SET_MSG_DATA_LENGTH(stMsg, 4); \
311 stMsg.au8_Contents[0] = (u8x0); \
312 stMsg.au8_Contents[1] = (u8x1); \
313 stMsg.au8_Contents[2] = (u8x2); \
314 stMsg.au8_Contents[3] = (u8x3); \
317 #define ESOS_TASK_MAKE_MSG_AUINT8(stMsg, pau8x, len) \
319 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT8); \
320 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \
321 ESOS_SET_MSG_DATA_LENGTH(stMsg, 1); \
322 for (__u8_esos_mail_routines_dummy_uint8=0; __u8_esos_mail_routines_dummy_uint8<len; __u8_esos_mail_routines_dummy_uint8++) { \
323 stMsg.au8_Contents[__u8_esos_mail_routines_dummy_uint] = pau8x[__u8_esos_mail_routines_dummy_uint8]; \
327 #define ESOS_TASK_MAKE_MSG_UINT16(stMsg, u16x) \
329 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT16); \
330 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \
331 ESOS_SET_MSG_DATA_LENGTH(stMsg, 1); \
332 stMsg.au16_Contents[0] = (u16x); \
335 #define ESOS_TASK_MAKE_MSG_UINT16_X2(stMsg, u16x0, u16x1) \
337 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT16); \
338 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \
339 ESOS_SET_MSG_DATA_LENGTH(stMsg, 2); \
340 stMsg.au16_Contents[0] = (u16x0); \
341 stMsg.au16_Contents[1] = (u16x1); \
344 #define ESOS_TASK_MAKE_MSG_UINT16_X3(stMsg, u16x0, u16x1, u16x2) \
346 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT16); \
347 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \
348 ESOS_SET_MSG_DATA_LENGTH(stMsg, 3); \
349 stMsg.au16_Contents[0] = (u16x0); \
350 stMsg.au16_Contents[1] = (u16x1); \
351 stMsg.au16_Contents[2] = (u16x2); \
354 #define ESOS_TASK_MAKE_MSG_UINT16_X4(stMsg, u16x0, u16x1, u16x2, u16x3) \
356 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT16); \
357 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \
358 ESOS_SET_MSG_DATA_LENGTH(stMsg, 4); \
359 stMsg.au16_Contents[0] = (u16x0); \
360 stMsg.au16_Contents[1] = (u16x1); \
361 stMsg.au16_Contents[2] = (u16x2); \
362 stMsg.au16_Contents[3] = (u16x3); \
365 #define ESOS_TASK_MAKE_MSG_UINT32(stMsg, u32x) \
367 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT32); \
368 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \
369 ESOS_SET_MSG_DATA_LENGTH(stMsg, 1); \
370 stMsg.au32_Contents[0] = (u32x); \
373 #define ESOS_TASK_MAKE_MSG_UINT32_X2(stMsg, u32x0, u32x1) \
375 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT32); \
376 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \
377 ESOS_SET_MSG_DATA_LENGTH(stMsg, 2); \
378 stMsg.au32_Contents[0] = (u32x0); \
379 stMsg.au32_Contents[1] = (u32x1); \
383 #define PRINTF_MESSAGE(stMsg) \
385 printf("MESSAGE u8_flags = %02X\n",ESOS_GET_MSG_FLAGS(stMsg) ); \
386 printf(" u16_FromTaskID = %d\n",ESOS_GET_MSG_FROMTASK(stMsg) ); \
387 printf(" u8_DataLength = %d\n",ESOS_GET_MSG_DATA_LENGTH(stMsg) ); \
388 printf(" u32_PostMark = %d\n",ESOS_GET_MSG_POSTMARK(stMsg) ); \
389 printf(" first byte = %d\n",stMsg.au8_Contents[0]); \
393 extern MAILBOX __astMailbox[MAX_NUM_USER_TASKS];
394 extern uint8_t __au8_MBData[MAX_NUM_USER_TASKS][MAX_SIZE_TASK_MAILBOX];
395 extern uint8_t __u8_esos_mail_routines_dummy_uint8;
407 #define __esos_WriteMailboxUINT8(pstMB, u8x) __esos_CB_WriteUINT8((pstMB)->pst_CBuffer, (u8x) )
410 #define __esos_ReadMailboxUINT8(pstMB, u8x) __esos_CB_ReadUINT8((pstMB)->pst_CBuffer )
418 void __esos_ReadMailMessage(
struct stTask* pst_Task, MAILMESSAGE* pst_Message );
419 void __esos_SendMailMessage(
struct stTask* pst_RcvrTask, MAILMESSAGE* pst_Msg );
423 #endif // ESOS_MAIL_H