LCOV - code coverage report
Current view: top level - SITL - SIM_RF_Benewake_TFMiniPlus.cpp (source / functions) Hit Total Coverage
Test: lcov.info Lines: 68 80 85.0 %
Date: 2026-09-09 11:02:08 Functions: 2 2 100.0 %

          Line data    Source code
       1             : #include "SIM_config.h"
       2             : 
       3             : #if AP_SIM_RF_BENEWAKE_TFMINIPLUS_ENABLED
       4             : 
       5             : #include "SIM_RF_Benewake_TFMiniPlus.h"
       6             : 
       7             : #include <stdio.h>
       8             : 
       9        2094 : void SITL::Benewake_TFMiniPlus::init()
      10             : {
      11        2094 : }
      12             : 
      13       15518 : int SITL::Benewake_TFMiniPlus::rdwr(I2C::i2c_rdwr_ioctl_data *&data)
      14             : {
      15       15518 :     if (data->nmsgs != 1) {
      16           0 :         AP_HAL::panic("Only ever expect a single message from driver");
      17             :     }
      18       15518 :     auto msg = data->msgs[0];
      19       15518 :     if (msg.flags == I2C_M_RD) {
      20             :         // an attempt to retrieve data which was previously requested
      21        7753 :         const auto data_type_requested_for_processing = data_type_requested;
      22        7753 :         data_type_requested = DataTypeRequested::NONE;
      23        7753 :         switch (data_type_requested_for_processing) {
      24           0 :         case DataTypeRequested::NONE:
      25           0 :             AP_HAL::panic("Request to read data when none requested");
      26           2 :         case DataTypeRequested::FW_VERSION: {
      27           2 :             if (msg.len != 7) {
      28           0 :                 AP_HAL::panic("Invalid read length");
      29             :             }
      30           2 :             msg.buf[0] = 0x5A;
      31           2 :             msg.buf[1] = 0x07;
      32           2 :             msg.buf[2] = 0x01;
      33           2 :             msg.buf[3] = 1;
      34           2 :             msg.buf[4] = 2;
      35           2 :             msg.buf[5] = 3;
      36           2 :             msg.buf[6] = crc_sum_of_bytes(msg.buf, 6);
      37           2 :             msg.len = 7;
      38           2 :             return 0;
      39             :         }
      40        7751 :         case DataTypeRequested::READING: {
      41        7751 :             if (msg.len != 11) {
      42           0 :                 AP_HAL::panic("Invalid read length");
      43             :             }
      44        7751 :             if (!running_config.data_output_enabled) {
      45           0 :                 AP_HAL::panic("Request for data before enabling output?!");
      46             :             }
      47        7751 :             float tmp_range = range;
      48        7751 :             if (!running_config.output_format_is_cm) {
      49           0 :                 tmp_range /= 4.5;  // convert to decicubits
      50             :             }
      51        7751 :             const uint16_t strength = 100;
      52        7751 :             uint16_t dist_cm = tmp_range * 100;
      53        7751 :             msg.buf[0] = 0x59;
      54        7751 :             msg.buf[1] = 0x59;
      55        7751 :             msg.buf[2] = dist_cm & 0xff;
      56        7751 :             msg.buf[3] = dist_cm >> 8;
      57        7751 :             msg.buf[4] = strength & 0xff;
      58        7751 :             msg.buf[5] = strength >> 8;
      59        7751 :             msg.buf[6] = 0;  // timestamp
      60        7751 :             msg.buf[7] = 0;  // timestamp
      61        7751 :             msg.buf[8] = 0;  // timestamp
      62        7751 :             msg.buf[9] = 0;  // timestamp
      63        7751 :             msg.buf[10] = crc_sum_of_bytes(msg.buf, 10);
      64        7751 :             msg.len = 11;
      65        7751 :             return 0;
      66             :         }
      67             :         }
      68           0 :         return -1;
      69             :     }
      70             : 
      71             :     // an attempt to retrieve data which was previously requested
      72        7765 :     if (msg.buf[0] != 0x5A) {
      73           0 :         AP_HAL::panic("Unexpected header");
      74             :     }
      75        7765 :     const uint8_t len = msg.buf[1];
      76        7765 :     if (len > msg.len) {
      77           0 :         AP_HAL::panic("Length too long");
      78             :     }
      79        7765 :     if (crc_sum_of_bytes(msg.buf, len-1) != msg.buf[len-1]) {
      80           0 :         AP_HAL::panic("Invalid checksum");
      81             :     }
      82        7765 :     switch (Command(msg.buf[2])) {
      83           2 :     case Command::FW_VERSION:
      84           2 :         data_type_requested = DataTypeRequested::FW_VERSION;
      85           2 :         break;
      86           2 :     case Command::SYSTEM_RESET:
      87           2 :         reset();
      88           2 :         break;
      89           2 :     case Command::OUTPUT_FORMAT_CM:
      90           2 :         new_config.output_format_is_cm = (msg.buf[3] == 1);
      91           2 :         break;
      92           4 :     case Command::ENABLE_DATA_OUTPUT:
      93           4 :         new_config.data_output_enabled = (msg.buf[3] == 1);
      94           4 :         running_config.data_output_enabled = new_config.data_output_enabled;
      95           4 :         break;
      96           2 :     case Command::SET_FRAME_RATE:
      97           2 :         new_config.frame_rate = (msg.buf[3] | msg.buf[4]<<8);
      98           2 :         break;
      99           2 :     case Command::SAVE_SETTINGS:
     100             :         // whatever
     101           2 :         break;
     102        7751 :     case Command::READ_MEASUREMENT:
     103        7751 :         if (msg.buf[3] != 0x07) {
     104           0 :             AP_HAL::panic("Invalid number which I don't know anything about");
     105             :         }
     106        7751 :         data_type_requested = DataTypeRequested::READING;
     107        7751 :         break;
     108             :     }
     109        7765 :     return 0;
     110             : }
     111             : 
     112             : #endif  // AP_SIM_RF_BENEWAKE_TFMINIPLUS_ENABLED

Generated by: LCOV version 1.14