37 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
38 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
39 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
40 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
41 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
42 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
43 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
44 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
45 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
46 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
47 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
48 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
49 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
50 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
51 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
52 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
53 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
54 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
55 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
56 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
57 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
58 0x00, 0xC1, 0x81, 0x40
62 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7,
63 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E,
64 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9,
65 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC,
66 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
67 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32,
68 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D,
69 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38,
70 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF,
71 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
72 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1,
73 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4,
74 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB,
75 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA,
76 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
77 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,
78 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97,
79 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E,
80 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89,
81 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
82 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83,
83 0x41, 0x81, 0x80, 0x40
87 ScheduledWorkItem(MODULE_NAME,
px4::serial_port_to_wq(port)),
115 unsigned char crc_high_byte = 0xFF;
116 unsigned char crc_low_byte = 0xFF;
119 while (crc16_length--) {
120 index = crc_low_byte ^ *(data_frame++);
121 crc_low_byte = (
unsigned char)(crc_high_byte ^
crc_msb_vector[index]);
125 uint16_t
crc16 = (crc_high_byte << 8 | crc_low_byte);
126 crc16 = (crc16 >> 8) | (crc16 << 8);
136 int bytes_processed = 0;
137 int distance_mm = -1;
140 bool crc_valid =
false;
146 if (bytes_read > 0) {
147 index = bytes_read - 6 ;
149 while (index >= 0 && !crc_valid) {
151 bytes_processed = index;
153 while (bytes_processed < bytes_read && !crc_valid) {
168 PX4_INFO(
"read error: %d", bytes_read);
180 const float current_distance =
static_cast<float>(distance_mm) / 1000.0
f;
224 crc16 =
crc16_calc(parserbuf, PARSER_BUF_LENGTH);
228 if (check_byte == (crc16 >> 8)) {
241 if (check_byte == (crc16 & 0xFF)) {
271 int flags = (O_RDWR | O_NOCTTY | O_NONBLOCK);
277 PX4_ERR(
"open failed (%i)", errno);
281 termios uart_config = {};
287 uart_config.c_oflag &= ~ONLCR;
290 uart_config.c_cflag &= ~(CSTOPB | PARENB);
293 int termios_state = cfsetispeed(&uart_config, speed);
295 if (termios_state < 0) {
296 PX4_ERR(
"CFG: %d ISPD", termios_state);
302 termios_state = cfsetospeed(&uart_config, speed);
304 if (termios_state < 0) {
305 PX4_ERR(
"CFG: %d OSPD", termios_state);
313 if (termios_state < 0) {
314 PX4_ERR(
"baud %d ATTR", termios_state);
319 PX4_INFO(
"successfully opened UART port %s",
_port);
348 PX4_INFO(
"driver started");
void set_max_distance(const float distance)
static constexpr unsigned char START_FRAME_DIGIT1
static constexpr unsigned char crc_msb_vector[]
static constexpr unsigned char START_FRAME_DIGIT2
void set_fov(const float fov)
CM8JL65(const char *port, uint8_t rotation=distance_sensor_s::ROTATION_DOWNWARD_FACING)
Default Constructor.
unsigned char _frame_data[PARSER_BUF_LENGTH]
int init()
Method : init() This method initializes the general driver for a range finder sensor.
static constexpr uint8_t DISTANCE_MSB_POS
Frame format definition 1B 1B 1B 1B 2B | 0xA5 | 0x5A | distance-MSB | distance-LSB | crc-16 |...
perf_counter_t _sample_perf
int collect()
Reads data from serial UART and places it into a buffer.
static constexpr unsigned char crc_lsb_vector[]
virtual ~CM8JL65() override
Virtual destructor.
static void read(bootloader_app_shared_t *pshared)
PX4Rangefinder _px4_rangefinder
void update(const hrt_abstime timestamp, const float distance, const int8_t quality=-1)
void perf_count(perf_counter_t handle)
Count a performance event.
void perf_free(perf_counter_t handle)
Free a counter.
void stop()
Stops the automatic measurement state machine.
Vector< float, 6 > f(float t, const Matrix< float, 6, 1 > &, const Matrix< float, 3, 1 > &)
void set_min_distance(const float distance)
static constexpr uint8_t PARSER_BUF_LENGTH
uint16_t crc16(const uint8_t *data_p, uint32_t length)
Calculate buffer CRC16.
void perf_end(perf_counter_t handle)
End a performance event.
perf_counter_t _comms_errors
__BEGIN_DECLS typedef uint64_t hrt_abstime
Absolute time, in microsecond units.
void start()
Initialise the automatic measurement state machine and start it.
void print_info()
Diagnostics - print some basic information about the driver.
int open_serial_port(const speed_t speed=B115200)
Opens and configures the UART serial communications port.
void perf_print_counter(perf_counter_t handle)
Print one performance counter to stdout.
void Run() override
Perform a reading cycle; collect from the previous measurement and start a new one.
int data_parser(const uint8_t check_byte, uint8_t parserbuf[PARSER_BUF_LENGTH], PARSE_STATE &state, uint16_t &crc16, int &distance)
uint16_t crc16_calc(const unsigned char *data_frame, uint8_t crc16_length)
Calculates the 16 byte crc value for the data frame.
static constexpr uint8_t DISTANCE_LSB_POS
void perf_begin(perf_counter_t handle)
Begin a performance event.
__EXPORT hrt_abstime hrt_absolute_time(void)
Get absolute time in [us] (does not wrap).
static constexpr uint32_t CM8JL65_MEASURE_INTERVAL