22 #define MIN_NUM_CHANNELS 5 26 using namespace Linux;
65 for (i=0; i<len; i++) {
73 if (
override < 0)
return false;
97 if (width_usec >= 2700) {
101 for (uint8_t i=0; i<
ppm_state._channel_counter; i++) {
120 if (width_usec > 700 && width_usec < 2300) {
132 for (uint8_t i=0; i<
ppm_state._channel_counter; i++) {
147 uint16_t bits_s0 = (width_s0+1) / 10;
148 uint16_t bits_s1 = (width_s1+1) / 10;
154 if (bits_s0 == 0 || bits_s1 == 0) {
159 if (bits_s0+bit_ofs > 10) {
171 if (nlow + bit_ofs > 12) {
177 if (
sbus_state.bit_ofs == 25*12 && bits_s1 > 12) {
181 for (i=0; i<25; i++) {
189 if ((v & 0xC00) != 0xC00) {
193 uint8_t parity = 0, j;
194 for (j=1; j<=8; j++) {
195 parity ^= (v & (1U<<j))?1:0;
197 if (parity != (v&0x200)>>9) {
200 bytes[i] = ((v>>1) & 0xFF);
203 uint16_t num_values=0;
204 bool sbus_failsafe=
false, sbus_frame_drop=
false;
206 &sbus_failsafe, &sbus_frame_drop,
209 for (i=0; i<num_values; i++) {
213 if (!sbus_failsafe) {
218 }
else if (bits_s1 > 12) {
230 uint16_t bits_s0 = ((width_s0+4)*(uint32_t)115200) / 1000000;
231 uint16_t bits_s1 = ((width_s1+4)*(uint32_t)115200) / 1000000;
235 if (bits_s0 == 0 || bits_s1 == 0) {
250 if (nbits+bit_ofs > 10) {
257 if (bits_s0 - nbits > 10) {
262 for (i=0; i<16; i++) {
271 if ((v & 0x200) != 0x200) {
274 bytes[i] = ((v>>1) & 0xFF);
277 uint16_t num_values=0;
280 for (i=0; i<num_values; i++) {
293 if (bits_s1+bit_ofs > 10) {
313 if (rclog ==
nullptr) {
314 rclog =
fopen(
"/tmp/rcin.log",
"w");
317 fprintf(rclog,
"%u %u\n", (
unsigned)width_s0, (
unsigned)width_s1);
338 for (
unsigned int i=0; i < len; i++) {
354 const uint8_t dsm_frame_size =
sizeof(
dsm.frame);
358 if (now -
dsm.last_input_ms > 5) {
360 dsm.partial_frame_count = 0;
362 dsm.last_input_ms = now;
366 if (
dsm.partial_frame_count + n > dsm_frame_size) {
367 n = dsm_frame_size -
dsm.partial_frame_count;
370 memcpy(&
dsm.frame[
dsm.partial_frame_count], bytes, n);
371 dsm.partial_frame_count += n;
376 if (
dsm.partial_frame_count == dsm_frame_size) {
377 dsm.partial_frame_count = 0;
378 uint16_t values[16] {};
379 uint16_t num_values=0;
388 for (uint8_t i=0; i<num_values; i++) {
389 if (values[i] != 0) {
403 printf(
"Decoded DSM %u channels %u %u %u %u %u %u %u %u\n",
404 (
unsigned)num_values,
405 values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7]);
423 uint16_t channel_count;
431 for (uint8_t i=0; i<channel_count; i++) {
432 if (values[i] != 0) {
454 uint16_t channel_count;
462 for (uint8_t i=0; i<channel_count; i++) {
463 if (values[i] != 0) {
483 uint8_t channel_count;
493 for (uint8_t i=0; i<channel_count; i++) {
497 if (failsafe_state ==
false) {
516 const uint8_t sbus_frame_size =
sizeof(
sbus.frame);
519 if (now -
sbus.last_input_ms > 5) {
521 sbus.partial_frame_count = 0;
523 sbus.last_input_ms = now;
527 if (
sbus.partial_frame_count + n > sbus_frame_size) {
528 n = sbus_frame_size -
sbus.partial_frame_count;
531 memcpy(&
sbus.frame[
sbus.partial_frame_count], bytes, n);
532 sbus.partial_frame_count += n;
537 if (
sbus.partial_frame_count == sbus_frame_size) {
538 sbus.partial_frame_count = 0;
539 uint16_t values[16] {};
540 uint16_t num_values=0;
542 bool sbus_frame_drop;
543 if (
sbus_decode(
sbus.frame, values, &num_values, &sbus_failsafe, &sbus_frame_drop, 16) &&
545 for (uint8_t i=0; i<num_values; i++) {
546 if (values[i] != 0) {
558 if (!sbus_failsafe) {
562 printf(
"Decoded SBUS %u channels %u %u %u %u %u %u %u %u %s\n",
563 (
unsigned)num_values,
564 values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7],
565 sbus_failsafe?
"FAIL":
"OK");
int printf(const char *fmt,...)
int srxl_decode(uint64_t timestamp_us, uint8_t byte, uint8_t *num_values, uint16_t *values, uint16_t max_values, bool *failsafe_state)
int sumd_decode(uint8_t byte, uint8_t *rssi, uint8_t *rx_count, uint16_t *channel_count, uint16_t *channels, uint16_t max_chan_count)
bool sbus_decode(const uint8_t frame[25], uint16_t *values, uint16_t *num_values, bool *sbus_failsafe, bool *sbus_frame_drop, uint16_t max_values)
bool dsm_decode(uint64_t frame_time, const uint8_t dsm_frame[16], uint16_t *values, uint16_t *num_values, uint16_t max_values)
FILE * fopen(const char *path, const char *mode)
POSIX Open a file with path name and ascii file mode string.
int fprintf(FILE *fp, const char *fmt,...)
fprintf character write function
int st24_decode(uint8_t byte, uint8_t *rssi, uint8_t *rx_count, uint16_t *channel_count, uint16_t *channels, uint16_t max_chan_count)