Browse Source

add error detection when insert value in dataframe

Juraj Ďuďák 2 years ago
parent
commit
e096a80554
4 changed files with 55 additions and 15 deletions
  1. 10 0
      .gitlab-ci.yml
  2. 4 2
      readme.md
  3. 23 13
      src/dataframe.cpp
  4. 18 0
      src/dataframe.h

+ 10 - 0
.gitlab-ci.yml

@@ -10,9 +10,19 @@ before_script:
         #rsync
         #- apt-get update -qq && apt-get install -y --yes  --allow-unauthenticated -qq rsync
 stages: 
+    - checks
     - build_release
     - doxy_stage
 
+check-lint:
+    image: xianpengshen/clang-tools:14
+    stage: checks
+    script:
+        - linter_errors=$(clang-format -n ./src/* 2>&1 | grep  -v --color=never "no modified files to format" || true)
+        - echo "$linter_errors"
+        - if [[ ! -z "$linter_errors" ]]; then echo "Detected formatting issues; please fix"; exit 1; else echo "Formatting is correct"; exit 0; fi
+
+
 build_release:
     stage: build_release
     image: python

+ 4 - 2
readme.md

@@ -56,9 +56,11 @@ Structure of data frame (**TYPE_PLAIN**):
 
    // resulted length is 23B (20B of data, 1B breamble, 1B lenfth byte, 1B CRC)
     int data_length = packet.Commit();  
-    uint8_t* frame = packet.GetFrame();
-    // frame[1] contain packet length. The real value is 20
+    if (packet.getError() == ERROR_NONE) {
+        // frame[1] contain packet length. The real value is 20
+        uint8_t* frame = packet.GetFrame();
     }
+}
 
 ```
 

+ 23 - 13
src/dataframe.cpp

@@ -33,23 +33,25 @@ Detailed description of class: DataFrame
 
    \code{.c}
     void main(){
-                uint8_t data[24];
+        uint8_t data[24];
 
-                DataFrame packet(data_packet, sizeof(data_packet),
-TYPE_HEADER_1B, CRC_ON);
+        DataFrame packet(data_packet, sizeof(data_packet), TYPE_HEADER_1B,
+CRC_ON);
 
-                packet.AddUint8(0xAB);
-                packet.AddUint16(65874);
-                packet.AddInt8(-45874);
-                packet.AddUint32(0x12345678);
-                packet.AddInt32(-0xA2345678);
+        packet.AddUint8(0xAB);
+        packet.AddUint16(65874);
+        packet.AddInt8(-45874);
+        packet.AddUint32(0x12345678);
+        packet.AddInt32(-0xA2345678);
 
-                packet.AddFloat(0.265);
-                packet.AddFloat(-3.1415);
+        packet.AddFloat(0.265);
+        packet.AddFloat(-3.1415);
 
-           // resulted length is 23B (20B of data, 1B breamble, 1B lenfth byte,
-1B CRC) int data_length = packet.Commit(); uint8_t* frame = packet.GetFrame();
-                // frame[1] contain packet length. The real value is 20
+        // resulted length is 23B (20B of data, 1B breamble, 1B lenfth byte,1B
+CRC) int data_length = packet.Commit(); if (packet.getError() == ERROR_NONE) {
+            // frame[1] contain packet length. The real value is 20
+            uint8_t* frame = packet.GetFrame();
+        }
     }
   \endcode
 
@@ -112,6 +114,8 @@ DataFrame::DataFrame(uint8_t *frame, uint8_t size, DataframeType_t type,
 }
 
 void DataFrame::Init(void) {
+  _error = ERROR_NONE;
+
   if (_type == TYPE_HEADER_1B) {
     _frame[0] = HEADER_CHAR1;
     _frame[1] = 0; // length of packet
@@ -133,6 +137,7 @@ void DataFrame::Init(void) {
 
 bool DataFrame::AddUint8(uint8_t d) {
   if ((_length + 1) >= _capacity) {
+    _error = ERROR_OVERFLOW;
     return false;
   }
 
@@ -143,6 +148,7 @@ bool DataFrame::AddUint8(uint8_t d) {
 
 bool DataFrame::AddUint16(uint16_t d) {
   if ((_length + 2) >= _capacity) {
+    _error = ERROR_OVERFLOW;
     return false;
   }
 
@@ -154,6 +160,7 @@ bool DataFrame::AddUint16(uint16_t d) {
 
 bool DataFrame::AddUint32(uint32_t d) {
   if ((_length + 4) >= _capacity) {
+    _error = ERROR_OVERFLOW;
     return false;
   }
 
@@ -173,6 +180,7 @@ bool DataFrame::AddInt32(int32_t d) { return this->AddUint32((uint32_t)d); }
 
 bool DataFrame::AddFloat(float f) {
   if ((_length + 4) >= _capacity) {
+    _error = ERROR_OVERFLOW;
     return false;
   }
 
@@ -214,4 +222,6 @@ uint8_t DataFrame::Commit(void) {
   return _length;
 }
 
+DataframeError_t DataFrame::getError(void) { return _error; }
+
 uint8_t *DataFrame::GetFrame(void) { return _frame; }

+ 18 - 0
src/dataframe.h

@@ -39,6 +39,16 @@ typedef enum {
   CRC_ON,
 } DataframeCrc_t;
 
+/**
+ * Internal representation of error state.
+ */
+typedef enum {
+  /** There is no error in dataframe create. */
+  ERROR_NONE,
+  /** The dataframe has small capacity */
+  ERROR_OVERFLOW,
+} DataframeError_t;
+
 /**
  * @brief Class for representing data frame.
  */
@@ -50,6 +60,7 @@ private:
   uint8_t _capacity;
   DataframeType_t _type;
   DataframeCrc_t _crcUse;
+  DataframeError_t _error;
 
 public:
   /**
@@ -127,6 +138,13 @@ public:
    * @return resulting packet
    */
   uint8_t *GetFrame(void);
+
+  /**
+   * @brief Return error status from data processing
+   * @return 0 - no error, 1 - internal buffer overflow. The buffer have to be
+   * increased in user code.
+   */
+  DataframeError_t getError(void);
 };
 
 #ifdef __cplusplus