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)