feat: implement channel helpers
cel_crsf_channel_us_to_val() and cel_crsf_channel_val_to_us() convert between microseconds (988-2012) and 11-bit values (172-1811) with rounding. cel_crsf_channel_default() fills safe/disarmed values.
This commit is contained in:
+22
-16
@@ -124,28 +124,34 @@ int16_t cel_crsf_channel_clamp(int16_t value) {
|
||||
}
|
||||
|
||||
int16_t cel_crsf_channel_us_to_val(uint16_t us) {
|
||||
/* TODO: convert microseconds to 11-bit channel value.
|
||||
* Linear mapping: 988us -> 172, 2012us -> 1811.
|
||||
* value = (us - 988) * (1811 - 172) / (2012 - 988) + 172
|
||||
* Clamp result to [CEL_CRSF_CH_MIN, CEL_CRSF_CH_MAX]. */
|
||||
(void)us;
|
||||
return CEL_CRSF_CH_MID;
|
||||
/* Clamp to valid range first to avoid underflow */
|
||||
if (us < 988) us = 988;
|
||||
if (us > 2012) us = 2012;
|
||||
/* Round to nearest: add half the divisor before dividing */
|
||||
int16_t value = (int16_t)(
|
||||
((us - 988) * (CEL_CRSF_CH_MAX - CEL_CRSF_CH_MIN)
|
||||
+ (2012 - 988) / 2) / (2012 - 988)
|
||||
+ CEL_CRSF_CH_MIN);
|
||||
return cel_crsf_channel_clamp(value);
|
||||
}
|
||||
|
||||
uint16_t cel_crsf_channel_val_to_us(int16_t value) {
|
||||
/* TODO: convert 11-bit channel value to microseconds.
|
||||
* Linear mapping: 172 -> 988us, 1811 -> 2012us.
|
||||
* us = (value - 172) * (2012 - 988) / (1811 - 172) + 988 */
|
||||
(void)value;
|
||||
return 1500;
|
||||
value = cel_crsf_channel_clamp(value);
|
||||
return (uint16_t)(
|
||||
((value - CEL_CRSF_CH_MIN) * (2012 - 988)
|
||||
+ (CEL_CRSF_CH_MAX - CEL_CRSF_CH_MIN) / 2)
|
||||
/ (CEL_CRSF_CH_MAX - CEL_CRSF_CH_MIN) + 988);
|
||||
}
|
||||
|
||||
void cel_crsf_channel_default(int16_t channels[16]) {
|
||||
/* TODO: fill with safe/disarmed values.
|
||||
* CH1-Roll, CH2-Pitch, CH4-Yaw = CEL_CRSF_CH_MID (centered)
|
||||
* CH3-Throttle = CEL_CRSF_CH_MIN (zero)
|
||||
* CH5..CH16 (AUX) = CEL_CRSF_CH_MIN (off) */
|
||||
(void)channels;
|
||||
memset(channels, 0, sizeof(int16_t) * 16);
|
||||
channels[0] = CEL_CRSF_CH_MID; /* roll */
|
||||
channels[1] = CEL_CRSF_CH_MID; /* pitch */
|
||||
channels[2] = CEL_CRSF_CH_MIN; /* throttle */
|
||||
channels[3] = CEL_CRSF_CH_MID; /* yaw */
|
||||
for (int i = 4; i < 16; i++) {
|
||||
channels[i] = CEL_CRSF_CH_MIN;
|
||||
}
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------- */
|
||||
|
||||
Reference in New Issue
Block a user