testharn.c
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:23k
源码类别:

DVD

开发平台:

Others

  1. /*******************************************************************************
  2. * Copyright(c) Philips Consumer Electronics B.V. 2001
  3. * The attached material and the information contained therein is proprietary
  4. * to Philips and is issued only under strict confidentiality arrangements.
  5. * It shall not be used, reproduced, copied in whole or in part, adapted,
  6. * modified, or disseminated without a written license of Philips.           
  7. * It must be returned to Philips upon its first request.
  8. *
  9. *  Project:        SA-MP ( Super Audio Media Player )
  10. *  File %name:     testharn.c %
  11. *  %version:       12 %
  12. *  %date_modified: Tue Nov 12 15:04:35 2002 %
  13. *  %derived_by:    klerxm %
  14. *  Creation date:  Tue Feb 26 18:03:49 2002
  15. *  First author:   kokh
  16. *
  17. *  Advanced Systems and Applications Lab - Eindhoven
  18. *
  19. *  Continuus %full_filespec: testharn.c~12:csrc:4 %
  20. *
  21. *  Description:    Test harness
  22. *
  23. * Change history:
  24. *
  25. * Rev  Date       Who      Comments
  26. * ---- ---------- -------- -----------------------------------------------------
  27. *   1  2002-02-16 kokh     Initial version (taken over from DVDv2)
  28. * 2-5  2002-03-07 kokh     Several improvements
  29. *   6  2002-05-23 klerxm   Added tasks for sending and receiving strings over UART
  30. *   7  2002-10-09 potm     Made reception more robust with regard to line endings
  31. *   8  2002-10-14 potm     Added definition of MAX_MESSAGE_SIZE
  32. *   9  2002-11-07 klerxm   See CRPR443: Added mutual exclusion semaphore to thCommSend
  33. *                          See CRPR448: Decreased maximum message size and added
  34. *                          additional error checking in thCommRecvTask
  35. *                          Alo keep calling UART_Write until entire string has been
  36. *                          sent in thCommSendTask
  37. *  10  2002-11-11 klerxm   See CRPR448: Increased mailbox size and added retry
  38. *                          mechanism in thCommSend for OS_SendMsg
  39. *  11  2002-11-12 klerxm   See CRPR448: Use different sizes for send and receive
  40. *                          buffers and always check buffer overflow
  41. *                          Changed prefix of local functions and variables to comply
  42. *                          to naming convention
  43. *  12  2003-04-02 klerxm   Additional error check on received command string
  44. *
  45. *******************************************************************************/
  46. #define COMP_PREFIX "TESTH"
  47. /*******************************************************************************
  48. *                                Include Files
  49. *******************************************************************************/
  50. #include "config.h"
  51. #if 1 //def TEST_HARNASS///////////////////////////////////////////////////////////////////////////////////////////////
  52. #include "Config.h" // Global Configuration - do not remove!
  53. #include "cpuv186tv186t.h"
  54. #include "Kernelker_api.h"
  55. #include "Cpuv186tserio.h"
  56. #include <embedded.h>
  57. #include "playcoresampsamp_gen.h"
  58. #if 0 //jerry todo: check later
  59. #include <glue_dbg.h>
  60. #include <glue_osa.h>
  61. #else
  62. #include "includesysdefs.h"
  63. #endif
  64. #include "playcorenav_sacdglue_test.h"
  65. #include "playcorenav_sacdfatal.h"
  66. #if 0 //jerry todo: check later
  67. #include <sdm.h>
  68. #endif
  69. #include "playcoretestharnass_samptestharn.h"
  70. #include <stdio.h>
  71. #include <string.h>
  72. #include <stdlib.h>
  73. #include <stdarg.h>
  74. /*******************************************************************************
  75. *                               Macro Definitions
  76. *******************************************************************************/
  77. #define TH_MBOX_SIZE       20
  78. #define TH_RCV_BUFFER_SIZE 100 //change to 100 from 256 to save memory
  79. #define TH_SND_BUFFER_SIZE 512
  80. /*******************************************************************************
  81. *                               Data Definitions
  82. *******************************************************************************/
  83. //jerry cai add CONST attribute.
  84. #ifdef TEST_HARNASS
  85. extern CONST THGConnection THGConnections[];
  86. #endif
  87. //jerry cai, print nothing at the moment. Otherwise it can affect the communication between host and target.
  88. #define DBG_Dprintf(x, y, z)
  89. //jerry cai disable it for saving memory #define TH_USE_MSG_BUFFER
  90. #ifdef TH_USE_MSG_BUFFER
  91. #define TH_MAX_MESSAGES     128
  92. #define TH_CHAR_BUFFER_SIZE 8192
  93. static char           *thCurrentGrp = NULL;
  94. static char           *thCurrentCmd = NULL;
  95. static SAMP(UInt32)   thCmdSem = 0;
  96. static int            thMsgStart[TH_MAX_MESSAGES];
  97. static int            thMsgFill = 0;
  98. static char           thCharBuffer[TH_CHAR_BUFFER_SIZE];
  99. static int            thCharFill = 0;
  100. #endif
  101. static int            thInitCounter = 0;
  102. #if 0 //jerry cai
  103. static char           thCommBuffer[TH_MBOX_SIZE][TH_SND_BUFFER_SIZE];
  104. #endif
  105. static unsigned long  thCommIndex = 0;
  106. static SAMP(UInt32)   thCommSemId;
  107. static SAMP(UInt32)   thCommMboxId;
  108. static SAMP(UInt32)   thCommSendTaskId;
  109. #if 0 //jerry cai
  110. static SAMP(UInt32)   thCommRecvTaskId;
  111. #endif
  112. /*******************************************************************************
  113. *                              Function prototype
  114. *******************************************************************************/
  115. static int  thCheckMsg(char *msg);
  116. static int  thDecode(char *msg, char **group, char **cmd, char **options);
  117. static void thMakeParamStr(char *parstring, int length, char *formatstr, va_list argptr);
  118. static void thGroupSwitch(char *group, char *cmd, char *options);
  119. #ifdef TH_USE_MSG_BUFFER
  120. static void thFlushMessageBuffer(void);
  121. static void thPutMessageInBuffer(char *msg);
  122. #endif
  123. void __interrupt SER1_ISR(void);
  124. /*******************************************************************************
  125. *                               Local Functions
  126. *******************************************************************************/
  127. /*******************************************************************************
  128. * Name       : thCommRecvTask
  129. * Purpose    : -
  130. * Input      : -
  131. * Output     : -
  132. * Returns    : -
  133. * Description: See purpose.
  134. *******************************************************************************/
  135. #ifdef TEST_HARNASS
  136. #if 1
  137. extern BYTE SER1_BUFF[100];
  138. extern BYTE ser1_buff_counter;
  139. extern BYTE ser1_message_ready;
  140. #endif
  141. BYTE get_ser1_buff_counter()
  142. {
  143.  return ser1_buff_counter;
  144. }
  145. #if 1 // jerry cai
  146. void thCommRecvTask(void)
  147. #else
  148. static void thCommRecvTask(void)
  149. #endif
  150. {
  151.   SAMP(Bool) end, error;
  152.   SAMP(UInt16) read;
  153.   char buffer[TH_RCV_BUFFER_SIZE], *bufferptr;
  154. #if 0 //jerry cai
  155.   char group[10];
  156.   char cmd[TH_RCV_BUFFER_SIZE];
  157.   char options[TH_RCV_BUFFER_SIZE];
  158. #else
  159.   char *group, *cmd, *options;
  160. #endif
  161. //  SAMP(TH_Init)();
  162.   while (1)
  163.   {
  164.     /* read a whole line into buffer */
  165. //    memset(buffer, 0, TH_RCV_BUFFER_SIZE);
  166. //    bufferptr = buffer;
  167.     end = FALSE;
  168.     error = FALSE;
  169.     while(ser1_message_ready == 0)usleep(2000UL);
  170.     ser1_message_ready = 0;
  171.     if (!error)
  172.     {
  173.       /* end string */
  174. //      *bufferptr = '';
  175.       /* decode string */
  176.       if( thDecode(SER1_BUFF, &group, &cmd, &options) )
  177.       {
  178.         SAMP(UInt32) err = SAMP(ERR_OK);
  179.         /* call group switch function */
  180.         thGroupSwitch(group, cmd, options);
  181. //        SAMP(TH_Send)(group, cmd, "%u", err);
  182.       }
  183.       else
  184.       {
  185.         DBG_Dprintf( COMP_PREFIX, DBG_MASK_ERROR, "Invalid message received" );
  186.       }
  187.     }
  188.     else
  189.     {
  190.       DBG_Dprintf( COMP_PREFIX, DBG_MASK_ERROR, "Received message exceeds maximum size" );
  191.     }
  192.   }
  193. }
  194. #endif
  195. #if 0 //jerry cai remove send task. Messages will be sent to host directly by the other tasks.
  196. /*******************************************************************************
  197. * Name       : thCommSendTask
  198. * Purpose    : -
  199. * Input      : -
  200. * Output     : -
  201. * Returns    : -
  202. * Description: See purpose.
  203. *******************************************************************************/
  204. static void thCommSendTask(void)
  205. {
  206.   unsigned long index;
  207.   char          *msg;
  208.   SAMP(UInt16)  written, length;
  209.   size_t        size;
  210.   while (1)
  211.   {
  212.     /* wait for the queue */
  213.     if ( SAMP(OS_RecvMsg)(thCommMboxId, OS_FOREVER, &index, sizeof(unsigned long), &size) == SAMP(ERR_OK) )
  214.     {
  215.        msg = thCommBuffer[index];
  216.        written = 0;
  217.        do
  218.        {
  219.          msg += written;
  220.          length = strlen(msg);
  221.          SAMP(UART_Write)(msg, length, 500, &written);
  222.        }
  223.        while( written != length );
  224.     }
  225.   }
  226. }
  227. #endif
  228. /*******************************************************************************
  229. * Name       : thCommSend
  230. * Purpose    : -
  231. * Input      : -
  232. * Output     : -
  233. * Returns    : -
  234. * Description: See purpose.
  235. *******************************************************************************/
  236. static void thCommSend(char* msg)
  237. {
  238.   ASSERT(strlen(msg) < TH_SND_BUFFER_SIZE);
  239. #if 0 //jerry cai
  240.   GUARDED( SAMP(OS_SemP)( thCommSemId, OS_SAFE4EVER ) );
  241.   /* copy string to buffer */
  242.   strncpy(thCommBuffer[thCommIndex], msg, TH_SND_BUFFER_SIZE-1);
  243.   thCommBuffer[thCommIndex][TH_SND_BUFFER_SIZE-1] = '';
  244.   /* send index of string to task */
  245.   while( SAMP(OS_SendMsg)(thCommMboxId, &thCommIndex, sizeof(unsigned long)) != SAMP(ERR_OK) )
  246.   {
  247.     /* mailbox full, wait 10ms and try again */
  248.     ASSERT( SAMP(OS_SemP)( thCommSemId, 1 ) == SAMP(ERR_FAILED) );
  249.   }
  250.   /* update index */
  251.   thCommIndex = (thCommIndex+1)%TH_MBOX_SIZE;
  252.   GUARDED( SAMP(OS_SemV)( thCommSemId ) );
  253. #else
  254.   printf(msg);
  255. #endif
  256. }
  257. static long strtolong(char *str)
  258. {
  259.   int i = 0;
  260.   long l = 0;
  261.   char sign = 1;
  262.   int unit = 10;
  263.   while (*str == ' ') str++;
  264.   if(*str == '-')
  265.   {
  266.     str++;
  267.     sign = -1;
  268.   }
  269.   else
  270.   if(*str == '+')
  271.   {
  272.     str++;
  273.     sign = 1;
  274.   }
  275.   if('0' == str[0] && 'x' == str[1])
  276.   {
  277.     str += 2;
  278.     unit = 16;
  279.   }
  280.   while('0'<=str[i] && str[i] <= '9' || (16 == unit && 'a'<=str[i] && str[i] <= 'f'))
  281.   {
  282.    l = l * unit;
  283.    if(16 == unit && 'a'<=str[i])
  284.     l = l + (str[i] - 'a');
  285.    else
  286.     l = l + (str[i] - '0');
  287.    i++;
  288.   }
  289.   if(-1 == sign)
  290.    l = -l;
  291.   return l;
  292. }
  293. static unsigned long strtoulong(char *str)
  294. {
  295.   int i = 0;
  296.   unsigned long l = 0;
  297.   int unit = 10;
  298.   while (*str == ' ') str++;
  299.   if('0' == str[0] && 'x' == str[1])
  300.   {
  301.     str += 2;
  302.     unit = 16;
  303.   }
  304.   while('0'<=str[i] && str[i] <= '9' || (16 == unit && 'a'<=str[i] && str[i] <= 'f'))
  305.   {
  306.    l = l * unit;
  307.    if(16 == unit && 'a'<=str[i])
  308.     l = l + (str[i] - 'a') + 10;
  309.    else
  310.     l = l + (str[i] - '0');
  311.    i++;
  312.   }
  313.   return l;
  314. }
  315. /*******************************************************************************
  316. *                          Local Test Harness Functions
  317. *******************************************************************************/
  318. static void thltoa(char *str, long l)
  319. {
  320.   int count;
  321.   char tempstr[12];
  322.   char *ptr;
  323.   if ((unsigned long)l == 2147483648UL)
  324.   {
  325.     strcpy(str, "-2147483648");
  326.     return;
  327.   }
  328.   if (l < 0)
  329.   {
  330.     strcpy(str, "-");
  331.     l = -l;
  332.   }
  333.   else
  334.   {
  335.     *str = '';
  336.   }
  337.   for (count = 0; count <= 10; count++)
  338.   {
  339.     tempstr[10 - count] = (char ) (l % 10) + '0';
  340.     l /= 10;
  341.   }
  342.   tempstr[11] = 0;
  343.   ptr = tempstr;
  344.   while (*ptr == '0') ptr++;
  345.   strcat(str, ptr);
  346.   if (*str == '') strcpy(str, "0");
  347. }
  348. static void thutoa(char *str, unsigned long l)
  349. {
  350.   int count;
  351.   char tempstr[12];
  352.   char *ptr;
  353.   for (count = 0; count <= 10; count++)
  354.   {
  355.     tempstr[10 - count] = (char) (l % 10) + '0';
  356.     l /= 10;
  357.   }
  358.   tempstr[11] = 0;
  359.   ptr = tempstr;
  360.   while (*ptr == '0') ptr++;
  361.   strcpy(str, ptr);
  362.   if (*str == '') strcpy(str, "0");
  363. }
  364. static void thMakeParamStr(char *parstring, int length, char *formatstr, va_list argptr)
  365. {
  366.   char *formatptr;
  367.   unsigned long unsarg;
  368.   long longarg;
  369.   char *stringarg;
  370.   char tempstr[15];
  371.   /* intialise parstring */
  372.   strcpy(parstring, "");
  373.   
  374.   /* set formatptr and parptr */
  375.   formatptr = formatstr;
  376.   while (*formatptr && length>2)
  377.   {
  378.     /* skip % sign */
  379.     formatptr++;
  380.     
  381.     if (*formatptr != 's')
  382.     {
  383.       switch(*formatptr)
  384.       {
  385.       case 'd':
  386.       case 'l':
  387.         longarg = va_arg(argptr, long);
  388.         thltoa(tempstr, longarg);
  389.         strncat(parstring, tempstr, length-2);
  390.         strcat(parstring, "," );
  391.         length -= strlen(tempstr)+1;
  392.         break;
  393.       case 'u':
  394.         unsarg = va_arg(argptr, unsigned long);
  395.         thutoa(tempstr, unsarg);
  396.         strncat(parstring, tempstr, length-2);
  397.         strcat(parstring, "," );
  398.         length -= strlen(tempstr)+1;
  399.         break;
  400.       default:
  401.         break;
  402.       }
  403.     }
  404.     else
  405.     {
  406.       stringarg = va_arg(argptr, char*);
  407.       strncat(parstring, stringarg, length-2);
  408.       strcat(parstring, ",");
  409.       length -= strlen(stringarg)+1;
  410.     }
  411.     formatptr++;
  412.   }
  413.   parstring[strlen(parstring) - 1] = '';
  414. }
  415. int thCheckMsg(char *msg)
  416. {
  417.   char *pch = msg;
  418.   if (*pch != '[') return 0;
  419.   while ((*pch != ']') && (*pch != 0))
  420.     pch++;
  421.   if (*pch != ']') return 0;
  422.   pch++;
  423.   if (*pch != 'r') return 0;
  424.   pch++;
  425.   if (*pch != 0) return 0;
  426.   return 1;
  427. }
  428. static int thDecode(char *msg, char **group, char **cmd, char **options)
  429. {
  430.   char *pch, *find;
  431.   int nr;
  432.   while(*msg == 0)
  433.    msg++;
  434.    
  435.   if ( thCheckMsg(msg) )
  436.   {
  437.     pch = msg+1;
  438.     find = strchr(pch, ',');
  439.     nr = find-pch;
  440.     if ( nr > 5 )
  441.     {
  442.        nr = 5;
  443.     }
  444. #if 0 //jerry cai
  445.     strncpy(group, pch, nr);
  446. #else
  447.     *group = pch;
  448. #endif
  449.     pch[nr] = '';
  450.     pch = find+1;
  451.     find = strchr(pch, ',');
  452.     if (find == NULL)
  453.     {
  454.       find = strchr(pch, ']');
  455.     }
  456. #if 0 //jerry cai
  457.     strncpy(cmd, pch, find-pch);
  458. #else
  459.     *cmd = pch;
  460. #endif
  461.     pch[find-pch] = '';
  462.     pch = find+1;
  463.     find = strchr(pch, ']');
  464.     if (find)
  465.     {
  466. #if 0 //jerry cai
  467.       strncpy(options, pch, find-pch);
  468. #else
  469.       *options = pch;
  470. #endif
  471.       pch[find-pch] = '';
  472.     }
  473.     else
  474.     {
  475. #if 0 //jerry cai
  476.       strcpy(options, "");
  477. #else
  478.       *options = pch - 1;
  479. #endif
  480.     }
  481.     return 1;
  482.   }
  483.   return 0;
  484. }
  485. #ifdef TH_USE_MSG_BUFFER
  486. static void thFlushMessageBuffer(void)
  487. {
  488.   int i;
  489.   SAMP(OS_SemP)(thCmdSem, OS_FOREVER);
  490.   for (i=0; i<thMsgFill; i++)
  491.   {
  492.     thCommSend(&thCharBuffer[thMsgStart[i]]);
  493.   }
  494.   thMsgFill  = 0;
  495.   thCharFill = 0;
  496.   SAMP(OS_SemV)(thCmdSem);
  497. }
  498. static void thPutMessageInBuffer(char *msg)
  499. {
  500.   int spaceAvail = 1;
  501.   int length = strlen(msg);
  502.   if (thMsgFill == TH_MAX_MESSAGES)
  503.   {
  504.     spaceAvail = 0;
  505.   }
  506.   if (thCharFill + length >= TH_CHAR_BUFFER_SIZE)
  507.   {
  508.     spaceAvail = 0;
  509.   }
  510.   if (spaceAvail)
  511.   {
  512.     SAMP(OS_SemP)(thCmdSem, OS_FOREVER);
  513.     thMsgStart[thMsgFill] = thCharFill;
  514.     thMsgFill ++;
  515.     strcpy(&thCharBuffer[thCharFill], msg);
  516.     thCharFill += length + 1;
  517.     SAMP(OS_SemV)(thCmdSem);
  518.   }
  519.   else
  520.   {
  521.     DBG_Dprintf( COMP_PREFIX, DBG_MASK_WARNING, "Out of buffer space for messages" );
  522.     thFlushMessageBuffer();
  523.     thCommSend(msg);
  524.   }
  525. }
  526. #endif
  527. #ifdef TEST_HARNASS
  528. static void thGroupSwitch(char *group, char *cmd, char *options)
  529. {
  530.   int count;
  531.   long grp, grp2;
  532.   char newgroup[6];
  533. #ifdef TH_USE_MSG_BUFFER
  534.   SAMP(OS_SemP)(thCmdSem, OS_FOREVER);
  535.   thCurrentGrp = group;
  536.   thCurrentCmd = cmd;
  537.   SAMP(OS_SemV)(thCmdSem);
  538. #endif
  539.   strcpy(newgroup, group);
  540.   if (strlen(group) < 5)
  541.   {
  542.     for (count = strlen(newgroup); count < 5; count++)
  543.     {
  544.       newgroup[count] = '_';
  545.     }
  546.     newgroup[5] = 0;
  547.   }
  548. #if 0
  549.   for (count = 0; count < 5; count++)
  550.   {
  551.     toupper(newgroup[count]);
  552.   }
  553. #endif
  554.   grp = (long) GROUP((long) newgroup[0], (long) newgroup[1], (long) newgroup[2], (long) newgroup[3],
  555.     (long) newgroup[4]);
  556.   count = 0;
  557.   do
  558.   {
  559.     grp2 = THGConnections[count].group;
  560.     if (grp2 == grp)
  561.     {
  562.       THGConnections[count].func(cmd, options);
  563.       count = -1;
  564.     }
  565.     if (grp2 == 0)
  566.     {
  567.       count = -1;
  568.     }
  569.     count++;
  570.   }
  571.   while (count > 0);
  572. #ifdef TH_USE_MSG_BUFFER
  573.   SAMP(OS_SemP)(thCmdSem, OS_FOREVER);
  574.   thCurrentGrp = NULL;
  575.   thCurrentCmd = NULL;
  576.   SAMP(OS_SemV)(thCmdSem);
  577.   thFlushMessageBuffer();
  578. #endif
  579. }
  580. #endif
  581. /*******************************************************************************
  582. *                              Exported Functions
  583. *******************************************************************************/
  584. /*******************************************************************************
  585. * Name       : TH_GetParam
  586. * Purpose    : -
  587. * Input      : -
  588. * Output     : -
  589. * Returns    : -
  590. * Description: See purpose.
  591. *******************************************************************************/
  592. void TH_GetParam(char *parstring, char *formatstr, ...)
  593. {
  594.   va_list marker;
  595.   char *formatptr, *parptr, *tempptr;
  596.   char tempstr[TH_RCV_BUFFER_SIZE];
  597.   void *ptr;
  598.   char *endptr;
  599.   unsigned long *unsarg;
  600.   long *longarg;
  601.   char *stringarg;
  602.   /* start parameter list after formatstr */
  603.   va_start( marker, formatstr );
  604.   /* set formatptr and parptr */
  605.   formatptr = formatstr;
  606.   parptr = parstring;
  607.   /* while there are strings in the format string */
  608.   while (*formatptr && parptr)
  609.   {
  610.     /* skip % sign */
  611.     formatptr++;
  612.     /* find next argument */
  613.     if (*parptr == ',') parptr++;
  614.     ptr = va_arg( marker, void *);
  615.     if (*formatptr != 's')
  616.     {
  617.       tempptr = strchr(parptr, ',');
  618.       if (tempptr)
  619.       {
  620.         strncpy(tempstr, parptr, tempptr - parptr);
  621.         tempstr[tempptr - parptr] = 0;
  622.       }
  623.       else
  624.       {
  625.         //jerry cai, bugbug??? why copy string to NULL pointer?
  626.         strcpy(tempstr, parptr);
  627.       }
  628.       parptr = tempptr;
  629.       switch (*formatptr)
  630.       {
  631.       case 'd':
  632.       case 'l':
  633.         longarg = (long*) ptr;
  634.         *longarg = strtolong(tempstr);
  635.         break;
  636.       case 'u':
  637.         unsarg = (unsigned long*) ptr;
  638.         *unsarg = strtoulong(tempstr);
  639.         break;
  640.       }
  641.     }
  642.     else
  643.     {
  644.       stringarg = (char *) ptr;
  645.       tempptr = strchr(parptr, ',');
  646.       if (tempptr)
  647.       {
  648.         strncpy(stringarg, parptr, tempptr - parptr);
  649.         stringarg[tempptr - parptr] = 0;
  650.       }
  651.       else
  652.       {
  653.         strcpy(stringarg, parptr);
  654.       }
  655.       parptr = tempptr;
  656.     }
  657.     formatptr++;
  658.   }
  659.   va_end( marker );
  660. }
  661. /*******************************************************************************
  662. * Name       : TH_Send
  663. * Purpose    : -
  664. * Input      : -
  665. * Output     : -
  666. * Returns    : -
  667. * Description: See purpose.
  668. *******************************************************************************/
  669. SAMP(ErrCode) SAMP(TH_Send)(char *group, char *cmd, char *format, ...)
  670. {
  671.   char    msg[TH_SND_BUFFER_SIZE];
  672.   va_list marker;
  673.   /* start parameter list after formatstr */
  674.   va_start(marker, format);
  675.   strcpy(msg, "[");
  676.   strcat(msg, group);
  677.   strcat(msg, ",");
  678.   strcat(msg, cmd);
  679.   strcat(msg, ",");
  680.   thMakeParamStr(&msg[strlen(msg)], TH_SND_BUFFER_SIZE-strlen(msg)-1, format, marker);
  681.   va_end(marker);
  682.   strcat(msg, "]n"); //jerry cai todo change back to r for Philips.was r.
  683. #ifdef TH_USE_MSG_BUFFER
  684.   SAMP(OS_SemP)(thCmdSem, OS_FOREVER);
  685.   if ((thCurrentGrp != NULL) && (thCurrentCmd != NULL))
  686.   {
  687.     if ((strcmp(thCurrentGrp, group) == 0) &&
  688.         (strcmp(thCurrentCmd, cmd) == 0))
  689.     {
  690.       SAMP(OS_SemV)(thCmdSem);
  691.       thCommSend(msg);
  692.     }
  693.     else
  694.     {
  695.       SAMP(OS_SemV)(thCmdSem);
  696.       thPutMessageInBuffer(msg);
  697.     }
  698.   }
  699.   else
  700.   {
  701.     SAMP(OS_SemV)(thCmdSem);
  702.     thCommSend(msg);
  703.   }
  704. #else
  705.   thCommSend(msg);
  706. #endif
  707.   return SAMP(ERR_OK);
  708. }
  709. /*******************************************************************************
  710. * Name       : TH_Trace
  711. * Purpose    : -
  712. * Input      : -
  713. * Output     : -
  714. * Returns    : -
  715. * Description: See purpose.
  716. *******************************************************************************/
  717. SAMP(ErrCode) SAMP(TH_Trace)(char *msg)
  718. {
  719.   SAMP(TH_Send)("TSTH", "TRACE", "%s", msg);
  720.   return SAMP(ERR_OK);
  721. }
  722. /*******************************************************************************
  723. * Name       : TH_Init
  724. * Purpose    : -
  725. * Input      : -
  726. * Output     : -
  727. * Returns    : -
  728. * Description: See purpose.
  729. *******************************************************************************/
  730. SAMP(ErrCode) SAMP(TH_Init)(void)
  731. {
  732.   SAMP(ErrCode) lErr = SAMP(ERR_OK);
  733. #if 0 //jerry cai , THG_RCV task is combined with debug task, so the semaphore, mailbox and task are not needed here.
  734.   if( thInitCounter == 0 )
  735.   {
  736. #ifdef TH_USE_MSG_BUFFER
  737.     GUARDED( SAMP(OS_SemCreate)(1, &thCmdSem) );
  738. #endif
  739.     GUARDED( SAMP(UART_Init)() );
  740.     GUARDED( SAMP(OS_SemCreate)( 1, &thCommSemId ) );
  741.     GUARDED( SAMP(OS_MboxCreate)( TH_MBOX_SIZE, &thCommMboxId ) );
  742. #if 0 //jerry cai
  743.     GUARDED( SAMP(OS_TaskCreate)( SDM_PRIORITY_THG_SND, SDM_STACKSIZE_THG_SND, thCommSendTask, &thCommSendTaskId ) );
  744. #endif
  745.     GUARDED( SAMP(OS_TaskCreate)( SDM_PRIORITY_THG_RCV, SDM_STACKSIZE_THG_RCV, thCommRecvTask, &thCommRecvTaskId ) );
  746.     SAMP(TH_Trace)("SA-MP TestHarness Initialised...");
  747.   }
  748.   thInitCounter++;
  749.   ASSERT( thInitCounter>0 );
  750. #else
  751. //  sig_sem(SEM_READY_FOR_CL);
  752. #endif
  753.   return lErr;
  754. }
  755. /*******************************************************************************
  756. * Name       : TH_Term
  757. * Purpose    : -
  758. * Input      : -
  759. * Output     : -
  760. * Returns    : -
  761. * Description: See purpose.
  762. *******************************************************************************/
  763. SAMP(ErrCode) SAMP(TH_Term)(void)
  764. {
  765.   SAMP(ErrCode) lErr = SAMP(ERR_OK);
  766. #if 0 //jerry cai , THG_RCV task is combined with debug task, so the semaphore, mailbox and task are not needed here.
  767.   ASSERT( thInitCounter>0 );
  768.   thInitCounter--;
  769.   if( thInitCounter == 0 )
  770.   {
  771.     GUARDED( SAMP(OS_TaskDelete)( thCommRecvTaskId ) );
  772. #if 0 //jerry cai
  773.     GUARDED( SAMP(OS_TaskDelete)( thCommSendTaskId ) );
  774. #endif
  775.     GUARDED( SAMP(OS_MboxDelete)( thCommMboxId ) );
  776.     GUARDED( SAMP(OS_SemDelete)( thCommSemId ) );
  777.     GUARDED( SAMP(UART_Term)() );
  778. #ifdef TH_USE_MSG_BUFFER
  779.     GUARDED( SAMP(OS_SemDelete)( thCmdSem ) );
  780. #endif
  781.   }
  782. #endif
  783.   return lErr;
  784. }
  785. #endif ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  786. /*******************************************************************************
  787. *                              End of File testharn.c
  788. *******************************************************************************/