wdbUserEvtLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:6k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* wdbUserEvtLib.c - WDB user event library */
  2. /* Copyright 1998 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01e,09feb99,fle  doc : put the code examples between .CS and .CE markups
  7. 01d,11jan99,dbt  use wdbSvcHookAdd() to free memory (fixed SPR #24323).
  8. 01c,09nov98,dbt  removed direct free() call.
  9. 01b,05oct98,jmp  doc: fixed DESCRIPTION section.
  10. 01a,25jan98,dbt  written.
  11. */
  12. /*
  13. DESCRIPTION
  14. This library contains routines for sending WDB User Events.  The event
  15. is sent through the WDB agent, the WDB communication link and the target
  16. server to the host tools that have registered for it. The event received
  17. by host tools will be a WTX user event string.
  18. INCLUDE FILES: wdb/wdbLib.h
  19. SEE ALSO:
  20. .I "API Guide: WTX Protocol"
  21. */
  22. #include "vxWorks.h"
  23. #include "string.h"
  24. #include "wdb/wdb.h"
  25. #include "wdb/wdbLib.h"
  26. #include "wdb/wdbLibP.h"
  27. #include "wdb/wdbSvcLib.h"
  28. #include "wdb/wdbEvtLib.h"
  29. #include "wdb/wdbRtIfLib.h"
  30. /* data types */
  31. typedef struct
  32.     {
  33.     WDB_EVT_NODE eventNode; /* event node */
  34.     char * pEvtData; /* event to send through WDB */
  35.     UINT32 numBytes; /* size of the event */
  36.     } wdbUserEvtNode_t;
  37. /* local variables */
  38. LOCAL wdbUserEvtNode_t externUserEvtNode;
  39. LOCAL char externUserData [WDB_MAX_USER_EVT_SIZE];
  40. /* forward declarations */
  41. static void wdbUserEvtGet (void * pNode, WDB_EVT_DATA * pWdbEvtData);
  42. static void wdbUserEvtMemFree (wdbUserEvtNode_t * pUserEvtNode);
  43. /******************************************************************************
  44. *
  45. * wdbUserEvtLibInit - include the WDB user event library 
  46. *
  47. * This null routine is provided so that wdbUserEvtLib can be linked into
  48. * the system. If INCLUDE_WDB_USER_EVENT is defined in configAll.h,
  49. * wdbUserEvtLibInit is called by the WDB config routine, wdbConfig(),
  50. * in usrWdb.c.  
  51. * RETURNS: N/A 
  52. */
  53. void wdbUserEvtLibInit (void)
  54.     {
  55.     }
  56. /******************************************************************************
  57. *
  58. * wdbUserEvtPost - post a user event string to host tools.
  59. * This routine posts the string <event> to host tools that have registered 
  60. * for it. Host tools will receive a USER WTX event string. The 
  61. * maximum size of the event is WDB_MAX_USER_EVT_SIZE (defined in 
  62. * $WIND_BASE/target/h/wdb/wdbLib.h).
  63. *
  64. * EXAMPLE
  65. *
  66. * The code below sends a WDB user event to host tools :
  67. *
  68. * .CS
  69. *   char * message = "Alarm: reactor overheating !!!";
  70. *
  71. *   if (wdbUserEvtPost (message) != OK)
  72. *       printf ("Can't send alarm message to host tools");
  73. * .CE
  74. *
  75. * This event will be received by host tools that have registered for it.
  76. * For example a WTX TCL based tool would do :
  77. *
  78. * .CS
  79. *   wtxtcl> wtxToolAttach EP960CX
  80. *   EP960CX_ps@sevre
  81. *   wtxtcl> wtxRegisterForEvent "USER.*"
  82. *   0
  83. *   wtxtcl> wtxEventGet
  84. *   USER Alarm: reactor overheating !!!
  85. * .CE
  86. *
  87. * Host tools can register for more specific user events :
  88. *
  89. * .CS
  90. *   wtxtcl> wtxToolAttach EP960CX
  91. *   EP960CX_ps@sevre
  92. *   wtxtcl> wtxRegisterForEvent "USER Alarm.*"
  93. *   0
  94. *   wtxtcl> wtxEventGet
  95. *   USER Alarm: reactor overheating !!!
  96. * .CE
  97. *
  98. * In this piece of code, only the USER events beginning with "Alarm"
  99. * will be received.
  100. *
  101. * RETURNS:
  102. * OK upon successful completion, a WDB error code if unable to send the
  103. * event to the host or ERROR if the size of the event is greater
  104. * than WDB_MAX_USER_EVT_SIZE.
  105. */
  106. STATUS wdbUserEvtPost
  107.     (
  108.     char * event /* event string to send */
  109.     )
  110.     {
  111.     wdbUserEvtNode_t * pWdbUserEvtNode; /* event node */
  112.     char *  pWdbUsrEvtData; /* event data */
  113.     UINT32 nBytes; /* event size */
  114.     nBytes = strlen (event) + 1; 
  115.     if (nBytes > WDB_MAX_USER_EVT_SIZE) /* check the event size */
  116. return (ERROR);
  117.     if (wdbIsNowTasking()) /* tasking mode */
  118. {
  119. if ((pWdbRtIf->malloc == NULL) ||
  120.     (pWdbRtIf->free == NULL))
  121.     return (WDB_ERR_NO_RT_PROC);
  122. pWdbUserEvtNode = (wdbUserEvtNode_t *)(*pWdbRtIf->malloc)
  123. (sizeof (wdbUserEvtNode_t));
  124.     
  125. if (pWdbUserEvtNode == NULL)
  126.     return (WDB_ERR_RT_ERROR);
  127. /* allocate room to copy user's data */
  128. if ((pWdbUsrEvtData = (*pWdbRtIf->malloc) (nBytes)) == NULL)
  129.     {
  130.     (*pWdbRtIf->free) (pWdbUserEvtNode);
  131.     return (WDB_ERR_RT_ERROR);
  132.     }
  133. }
  134.     else /* external mode */
  135. {
  136. pWdbUserEvtNode = &externUserEvtNode;
  137. pWdbUsrEvtData = externUserData;
  138. }
  139.     /* fill pWdbUsrEvtData structure */
  140.     strcpy (pWdbUsrEvtData, event);
  141.     pWdbUserEvtNode->pEvtData = pWdbUsrEvtData;
  142.     pWdbUserEvtNode->numBytes = nBytes;
  143.     wdbEventNodeInit (&pWdbUserEvtNode->eventNode, wdbUserEvtGet, 
  144.     NULL, pWdbUserEvtNode);
  145.     /* post the user event */
  146.     wdbEventPost (&pWdbUserEvtNode->eventNode);
  147.     return (OK);
  148.     }
  149. /******************************************************************************
  150. *
  151. * wdbUserEvtGet - fill in the WDB_EVT_DATA for the host.
  152. *
  153. * This routine fills the WDB_EVT_DATA structure for the host.
  154. *
  155. * RETURNS : NA
  156. *
  157. * NOMANUAL
  158. */ 
  159. static void wdbUserEvtGet
  160.     (
  161.     void * pNode,
  162.     WDB_EVT_DATA * pWdbEvtData /* Event to send through WDB */
  163.     )
  164.     {
  165.     wdbUserEvtNode_t * pWdbUserEvtNode = pNode;
  166.     WDB_MEM_XFER * pUserEvtInfo;
  167.     pUserEvtInfo = (WDB_MEM_XFER *)&pWdbEvtData->eventInfo.vioWriteInfo;
  168.     pWdbEvtData->evtType = WDB_EVT_USER;
  169.     pUserEvtInfo->source = pWdbUserEvtNode->pEvtData;
  170.     pUserEvtInfo->destination = 0;
  171.     pUserEvtInfo->numBytes = pWdbUserEvtNode->numBytes;
  172.     wdbSvcHookAdd ((FUNCPTR) wdbUserEvtMemFree, (u_int) pWdbUserEvtNode);
  173.     }
  174. /******************************************************************************
  175. *
  176. * wdbUserEvtMemFree - free the memory used for the user event node.
  177. *
  178. * RETURNS : NA
  179. *
  180. * NOMANUAL
  181. */ 
  182. static void wdbUserEvtMemFree
  183.     (
  184.     wdbUserEvtNode_t * pUserEvtNode
  185.     )
  186.     {
  187.     if (wdbIsNowTasking ())
  188. {
  189. (*pWdbRtIf->free) (pUserEvtNode->pEvtData);
  190. (*pWdbRtIf->free) (pUserEvtNode);
  191. }
  192.     }