scpi_errq.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include <string.h>
  2. #include "app/scpi/scpi_errq.h"
  3. #include "app/queue/queue.h"
  4. #include "app/queue/queue_ex.h"
  5. typedef struct
  6. {
  7. queue_record_t header; // queue record header
  8. int16_t errorCode; // SCPI error code
  9. }
  10. sSCPIErrorHeader_t;
  11. void errq_clear( errq_t * self )
  12. {
  13. while( !errq_isempty(self) )
  14. errq_removetop(self);
  15. }
  16. bool errq_removetop( errq_t * self )
  17. {
  18. return (0 < queue_removefront( self ));
  19. }
  20. bool errq_isempty( errq_t * self )
  21. {
  22. return (queue_empty( self ));
  23. }
  24. bool errq_peek( errq_t * self, int16_t * perrorCode, char * message, size_t * msgBufSize )
  25. {
  26. sSCPIErrorHeader_t record;
  27. assert( self );
  28. if( sizeof(record.header) == queue_peek_payload( self, &record.header, sizeof(record.header), NULL, 0 ) )
  29. {
  30. assert( record.header.size >= sizeof(record) );
  31. int16_t msgBuf = 0;
  32. if( NULL != message && NULL != msgBufSize && 0 != *msgBufSize )
  33. {
  34. if( record.header.payload > *msgBufSize )
  35. {
  36. return false;
  37. }
  38. msgBuf = *msgBufSize;
  39. }
  40. if( record.header.size == queue_peek_payload( self, &record.header, sizeof(record), message, msgBuf ) )
  41. {
  42. if( NULL != perrorCode )
  43. {
  44. *perrorCode = record.errorCode;
  45. }
  46. if( NULL != message && 0 != msgBuf && NULL != msgBufSize )
  47. {
  48. *msgBufSize = record.header.payload;
  49. }
  50. return true;
  51. }
  52. }
  53. return false;
  54. }
  55. bool errq_pop( errq_t * self, int16_t * perrorCode, char * message, size_t * msgBufSize )
  56. {
  57. bool rc = false;
  58. rc = errq_peek( self, perrorCode, message, msgBufSize );
  59. if( rc ) queue_removefront( self );
  60. return rc;
  61. }
  62. bool errq_push( errq_t * self, int16_t errorCode, const char * message )
  63. {
  64. bool rc = false;
  65. sSCPIErrorHeader_t record = {
  66. .header = {
  67. .size = sizeof( sSCPIErrorHeader_t ),
  68. .payload = 0
  69. },
  70. .errorCode = errorCode
  71. };
  72. if( NULL != message )
  73. {
  74. size_t len = strlen( message );
  75. record.header.size += (len+1);
  76. record.header.payload = (len+1);
  77. rc = (QUEUE_RC_NOERROR == queue_pushback_payload( self, &record.header, message ));
  78. }
  79. else
  80. {
  81. rc = (QUEUE_RC_NOERROR == queue_pushback( self, &record.header ));
  82. }
  83. return rc;
  84. }