Skip to content

Commit 4c6b7f6

Browse files
authored
Merge pull request #10772 from iNavFlight/mmosca-jeti-fixes
Fixes channel 17 behavior and hopefully, the long standing locking up issue. It has been running for 6h so far, and I will leave it running a bit longer, but need more users to report back.
2 parents 6ae615c + bbc1d4e commit 4c6b7f6

File tree

6 files changed

+92
-26
lines changed

6 files changed

+92
-26
lines changed

lib/main/STM32H7/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_mdma.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@
2323
#ifdef USE_FULL_ASSERT
2424
#include "stm32_assert.h"
2525
#else
26+
#ifndef assert_param
2627
#define assert_param(expr) ((void)0U)
2728
#endif
29+
#endif
2830

2931
/** @addtogroup STM32H7xx_LL_Driver
3032
* @{

lib/main/STM32H7/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_rcc.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222
#ifdef USE_FULL_ASSERT
2323
#include "stm32_assert.h"
2424
#else
25+
#ifndef assert_param
2526
#define assert_param(expr) ((void)0U)
2627
#endif
28+
#endif
2729

2830
/** @addtogroup STM32H7xx_LL_Driver
2931
* @{

src/main/rx/jetiexbus.c

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939

4040
#include <stdbool.h>
4141
#include <stdint.h>
42+
#include <string.h>
4243

4344
#include "platform.h"
4445

@@ -48,6 +49,7 @@
4849
#include "build/debug.h"
4950

5051
#include "common/utils.h"
52+
#include "common/maths.h"
5153

5254
#include "drivers/time.h"
5355

@@ -83,13 +85,15 @@
8385

8486
serialPort_t *jetiExBusPort;
8587

86-
uint32_t jetiTimeStampRequest = 0;
88+
volatile uint32_t jetiTimeStampRequest = 0;
89+
90+
volatile bool jetiExBusCanTx = false;
8791

8892
static uint8_t jetiExBusFramePosition;
8993
static uint8_t jetiExBusFrameLength;
9094

91-
static uint8_t jetiExBusFrameState = EXBUS_STATE_ZERO;
92-
uint8_t jetiExBusRequestState = EXBUS_STATE_ZERO;
95+
static volatile uint8_t jetiExBusFrameState = EXBUS_STATE_ZERO;
96+
volatile uint8_t jetiExBusRequestState = EXBUS_STATE_ZERO;
9397

9498
// Use max values for ram areas
9599
static uint8_t jetiExBusChannelFrame[EXBUS_MAX_CHANNEL_FRAME_SIZE];
@@ -117,16 +121,18 @@ void jetiExBusDecodeChannelFrame(uint8_t *exBusFrame)
117121
{
118122
uint16_t value;
119123
uint8_t frameAddr;
124+
uint8_t channelDataLen = exBusFrame[EXBUS_HEADER_LEN - 1];
125+
uint8_t receivedChannelCount = MIN((channelDataLen) / 2, JETIEXBUS_CHANNEL_COUNT);
120126

121127
// Decode header
122128
switch (((uint16_t)exBusFrame[EXBUS_HEADER_SYNC] << 8) | ((uint16_t)exBusFrame[EXBUS_HEADER_REQ])) {
123129

124130
case EXBUS_CHANNELDATA_DATA_REQUEST: // not yet specified
125131
case EXBUS_CHANNELDATA:
126-
for (uint8_t i = 0; i < JETIEXBUS_CHANNEL_COUNT; i++) {
127-
frameAddr = EXBUS_HEADER_LEN + i * 2;
132+
for (uint8_t i = 0; i < receivedChannelCount; i++) {
133+
frameAddr = EXBUS_HEADER_LEN + (i * 2);
128134
value = ((uint16_t)exBusFrame[frameAddr + 1]) << 8;
129-
value += (uint16_t)exBusFrame[frameAddr];
135+
value |= (uint16_t)exBusFrame[frameAddr];
130136
// Convert to internal format
131137
jetiExBusChannelData[i] = value >> 3;
132138
}
@@ -152,7 +158,7 @@ void jetiExBusFrameReset(void)
152158
*/
153159

154160
// Receive ISR callback
155-
static void jetiExBusDataReceive(uint16_t c, void *data)
161+
FAST_CODE NOINLINE static void jetiExBusDataReceive(uint16_t c, void *data)
156162
{
157163
UNUSED(data);
158164

@@ -189,6 +195,14 @@ static void jetiExBusDataReceive(uint16_t c, void *data)
189195
}
190196
}
191197

198+
if(jetiExBusFramePosition == 1) {
199+
if(c == 0x01) {
200+
jetiExBusCanTx = true;
201+
} else {
202+
jetiExBusCanTx = false;
203+
}
204+
}
205+
192206
if (jetiExBusFramePosition == jetiExBusFrameMaxSize) {
193207
// frame overrun
194208
jetiExBusFrameReset();
@@ -204,7 +218,6 @@ static void jetiExBusDataReceive(uint16_t c, void *data)
204218

205219
// Check the header for the message length
206220
if (jetiExBusFramePosition == EXBUS_HEADER_LEN) {
207-
208221
if ((jetiExBusFrameState == EXBUS_STATE_IN_PROGRESS) && (jetiExBusFrame[EXBUS_HEADER_MSG_LEN] <= EXBUS_MAX_CHANNEL_FRAME_SIZE)) {
209222
jetiExBusFrameLength = jetiExBusFrame[EXBUS_HEADER_MSG_LEN];
210223
return;
@@ -223,9 +236,12 @@ static void jetiExBusDataReceive(uint16_t c, void *data)
223236

224237
// Done?
225238
if (jetiExBusFrameLength == jetiExBusFramePosition) {
226-
if (jetiExBusFrameState == EXBUS_STATE_IN_PROGRESS)
239+
if (jetiExBusFrameState == EXBUS_STATE_IN_PROGRESS) {
227240
jetiExBusFrameState = EXBUS_STATE_RECEIVED;
241+
jetiExBusRequestState = EXBUS_STATE_ZERO;
242+
}
228243
if (jetiExBusRequestState == EXBUS_STATE_IN_PROGRESS) {
244+
jetiExBusFrameState = EXBUS_STATE_ZERO;
229245
jetiExBusRequestState = EXBUS_STATE_RECEIVED;
230246
jetiTimeStampRequest = now;
231247
}
@@ -268,6 +284,8 @@ bool jetiExBusInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfi
268284
rxRuntimeConfig->rcReadRawFn = jetiExBusReadRawRC;
269285
rxRuntimeConfig->rcFrameStatusFn = jetiExBusFrameStatus;
270286

287+
memset(jetiExBusChannelData, 0, sizeof(uint16_t) * JETIEXBUS_CHANNEL_COUNT);
288+
271289
jetiExBusFrameReset();
272290

273291
const serialPortConfig_t *portConfig = findSerialPortConfig(FUNCTION_RX_SERIAL);

src/main/rx/jetiexbus.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
#define EXBUS_CRC_LEN 2
2222
#define EXBUS_OVERHEAD (EXBUS_HEADER_LEN + EXBUS_CRC_LEN)
2323
#define EXBUS_MAX_CHANNEL_FRAME_SIZE (EXBUS_HEADER_LEN + JETIEXBUS_CHANNEL_COUNT*2 + EXBUS_CRC_LEN)
24-
#define EXBUS_MAX_REQUEST_FRAME_SIZE 9
24+
#define EXBUS_MAX_REQUEST_FRAME_SIZE 32 //9
2525

2626
#define EXBUS_EX_REQUEST (0x3A)
2727

@@ -42,11 +42,13 @@ enum {
4242
EXBUS_STATE_PROCESSED
4343
};
4444

45-
extern uint8_t jetiExBusRequestState;
46-
extern uint32_t jetiTimeStampRequest;
45+
extern volatile uint8_t jetiExBusRequestState;
46+
extern volatile uint32_t jetiTimeStampRequest;
4747
extern uint8_t jetiExBusRequestFrame[EXBUS_MAX_REQUEST_FRAME_SIZE];
4848
struct serialPort_s;
4949
extern struct serialPort_s *jetiExBusPort;
5050

51+
extern volatile bool jetiExBusCanTx;
52+
5153
uint16_t jetiExBusCalcCRC16(uint8_t *pt, uint8_t msgLen);
5254
bool jetiExBusInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig);

src/main/telemetry/jetiexbus.c

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -138,14 +138,22 @@ const exBusSensor_t jetiExSensors[] = {
138138
{"GPS Speed", "m/s", EX_TYPE_22b, DECIMAL_MASK(2)},
139139
{"GPS H-Distance", "m", EX_TYPE_22b, DECIMAL_MASK(0)},
140140
{"GPS H-Direction", "\xB0", EX_TYPE_22b, DECIMAL_MASK(1)},
141-
{"INAV D2", "", EX_TYPE_DES, 0 }, // device descripton
141+
{"INAV D2", "", EX_TYPE_DES, 0 }, // device descripton
142142
{"GPS Heading", "\xB0", EX_TYPE_22b, DECIMAL_MASK(1)},
143143
{"GPS Altitude", "m", EX_TYPE_22b, DECIMAL_MASK(2)},
144144
{"G-Force X", "", EX_TYPE_22b, DECIMAL_MASK(3)},
145145
{"G-Force Y", "", EX_TYPE_22b, DECIMAL_MASK(3)},
146146
{"G-Force Z", "", EX_TYPE_22b, DECIMAL_MASK(3)},
147147
{"RPM", "", EX_TYPE_22b, DECIMAL_MASK(0)},
148-
{"Trip Distance", "m", EX_TYPE_22b, DECIMAL_MASK(1)}
148+
{"Trip Distance", "m", EX_TYPE_22b, DECIMAL_MASK(1)},
149+
{"DEBUG0", "", EX_TYPE_22b, DECIMAL_MASK(0)},
150+
{"DEBUG1", "", EX_TYPE_22b, DECIMAL_MASK(0)},
151+
{"DEBUG2", "", EX_TYPE_22b, DECIMAL_MASK(0)},
152+
{"DEBUG3", "", EX_TYPE_22b, DECIMAL_MASK(0)},
153+
{"DEBUG4", "", EX_TYPE_22b, DECIMAL_MASK(0)},
154+
{"DEBUG5", "", EX_TYPE_22b, DECIMAL_MASK(0)},
155+
{"DEBUG6", "", EX_TYPE_22b, DECIMAL_MASK(0)},
156+
{"DEBUG7", "", EX_TYPE_22b, DECIMAL_MASK(0)}
149157
};
150158

151159
// after every 15 sensors increment the step by 2 (e.g. ...EX_VAL15, EX_VAL16 = 17) to skip the device description
@@ -172,6 +180,14 @@ enum exSensors_e {
172180
EX_GFORCE_Z,
173181
EX_RPM,
174182
EX_TRIP_DISTANCE,
183+
EX_DEBUG0,
184+
EX_DEBUG1,
185+
EX_DEBUG2,
186+
EX_DEBUG3,
187+
EX_DEBUG4,
188+
EX_DEBUG5,
189+
EX_DEBUG6,
190+
EX_DEBUG7
175191
};
176192

177193
union{
@@ -183,8 +199,7 @@ union{
183199

184200
#define JETI_EX_SENSOR_COUNT (ARRAYLEN(jetiExSensors))
185201

186-
static uint8_t jetiExBusTelemetryFrame[40];
187-
static uint8_t jetiExBusTransceiveState = EXBUS_TRANS_RX;
202+
static uint8_t jetiExBusTelemetryFrame[JETI_EXBUS_TELEMETRY_FRAME_LEN];
188203
static uint8_t firstActiveSensor = 0;
189204
static uint32_t exSensorEnabled = 0;
190205

@@ -283,6 +298,17 @@ void initJetiExBusTelemetry(void)
283298
}
284299
#endif
285300

301+
if (debugMode != DEBUG_NONE) {
302+
bitArraySet(&exSensorEnabled, EX_DEBUG0);
303+
bitArraySet(&exSensorEnabled, EX_DEBUG1);
304+
bitArraySet(&exSensorEnabled, EX_DEBUG2);
305+
bitArraySet(&exSensorEnabled, EX_DEBUG3);
306+
bitArraySet(&exSensorEnabled, EX_DEBUG4);
307+
bitArraySet(&exSensorEnabled, EX_DEBUG5);
308+
bitArraySet(&exSensorEnabled, EX_DEBUG6);
309+
bitArraySet(&exSensorEnabled, EX_DEBUG7);
310+
}
311+
286312
firstActiveSensor = getNextActiveSensor(0); // find the first active sensor
287313
}
288314

@@ -421,6 +447,23 @@ int32_t getSensorValue(uint8_t sensor)
421447

422448
case EX_TRIP_DISTANCE:
423449
return getTotalTravelDistance() / 10;
450+
451+
case EX_DEBUG0:
452+
return debug[0];
453+
case EX_DEBUG1:
454+
return debug[1];
455+
case EX_DEBUG2:
456+
return debug[2];
457+
case EX_DEBUG3:
458+
return debug[3];
459+
case EX_DEBUG4:
460+
return debug[4];
461+
case EX_DEBUG5:
462+
return debug[5];
463+
case EX_DEBUG6:
464+
return debug[6];
465+
case EX_DEBUG7:
466+
return debug[7];
424467

425468
default:
426469
return -1;
@@ -503,12 +546,16 @@ void checkJetiExBusTelemetryState(void)
503546
return;
504547
}
505548

506-
void handleJetiExBusTelemetry(void)
549+
void NOINLINE handleJetiExBusTelemetry(void)
507550
{
508551
static uint16_t framesLost = 0; // only for debug
509552
static uint8_t item = 0;
510553
uint32_t timeDiff;
511554

555+
if(!jetiExBusCanTx) {
556+
return;
557+
}
558+
512559
// Check if we shall reset frame position due to time
513560
if (jetiExBusRequestState == EXBUS_STATE_RECEIVED) {
514561

@@ -523,7 +570,6 @@ void handleJetiExBusTelemetry(void)
523570

524571
if ((jetiExBusRequestFrame[EXBUS_HEADER_DATA_ID] == EXBUS_EX_REQUEST) && (jetiExBusCalcCRC16(jetiExBusRequestFrame, jetiExBusRequestFrame[EXBUS_HEADER_MSG_LEN]) == 0)) {
525572
if (serialRxBytesWaiting(jetiExBusPort) == 0) {
526-
jetiExBusTransceiveState = EXBUS_TRANS_TX;
527573
item = sendJetiExBusTelemetry(jetiExBusRequestFrame[EXBUS_HEADER_PACKET_ID], item);
528574
jetiExBusRequestState = EXBUS_STATE_PROCESSED;
529575
return;
@@ -534,13 +580,7 @@ void handleJetiExBusTelemetry(void)
534580
}
535581
}
536582

537-
// check the state if transmit is ready
538-
if (jetiExBusTransceiveState == EXBUS_TRANS_IS_TX_COMPLETED) {
539-
if (isSerialTransmitBufferEmpty(jetiExBusPort)) {
540-
jetiExBusTransceiveState = EXBUS_TRANS_RX;
541-
jetiExBusRequestState = EXBUS_STATE_ZERO;
542-
}
543-
}
583+
jetiExBusRequestState = EXBUS_STATE_ZERO;
544584
}
545585

546586
uint8_t sendJetiExBusTelemetry(uint8_t packetID, uint8_t item)
@@ -587,7 +627,7 @@ uint8_t sendJetiExBusTelemetry(uint8_t packetID, uint8_t item)
587627
}
588628

589629
serialWriteBuf(jetiExBusPort, jetiExBusTelemetryFrame, jetiExBusTelemetryFrame[EXBUS_HEADER_MSG_LEN]);
590-
jetiExBusTransceiveState = EXBUS_TRANS_IS_TX_COMPLETED;
630+
jetiExBusCanTx = false;
591631

592632
return item;
593633
}

src/main/telemetry/jetiexbus.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
#pragma once
1919

20+
#define JETI_EXBUS_TELEMETRY_FRAME_LEN 128
21+
2022
void initJetiExBusTelemetry(void);
2123
void checkJetiExBusTelemetryState(void);
2224
void handleJetiExBusTelemetry(void);

0 commit comments

Comments
 (0)