LINUX.ORG.RU

История изменений

Исправление tailgunner, (текущая версия) :

Какой ужас. Си++, итераторы, классы, Q_BYTE_ORDER (!!!11), и поверх всего - не-слово Reading.

#include <stdint.h>

#define ALEN(a) (sizeof(a)/sizeof((a)[0]))

const double delta = 1.25/0xffffff;
const double Vcm = 1.25;

struct adc_sample { uint8_t parts[3]; };

struct adc_packet {
  uint8_t pad1[8];
  struct adc_sample samples[150];
};

static unsigned cvt1(struct adc_sample *n)
{
  /* никаких проверок Q_BYTE_ORDER, блеать */
  return (n->parts[0] << 16) | (n->parts[1] << 8) | n-> parts[2];
}

void convert_adc_packet(const struct adc_packet *pkt, double *numbers)
{
   int i;

   for (i = 0; i < ALEN(pkt->samples); i++)
     numbers[i] = cvt1(&pkt->samples[i])*delta - Vcm;
}

P.S. не пользуйся битовыми полями.

P.P.S. к перемежающейся проблеме код преобразования наверняка не имеет никакого отношения.

Исходная версия tailgunner, :

Какой ужас. Си++, итераторы, классы, Q_BYTE_ORDER (!!!11), и поверх всего - не-слово Reading.

#include <stdint.h>

#define ALEN(a) (sizeof(a)/sizeof((a)[0]))

const double delta = 1.25/0xffffff;
const double Vcm = 1.25;

struct adc_sample { uint8_t parts[3]; };

struct adc_packet {
  uint8_t pad1[8];
  struct adc_sample samples[150];
};

static unsigned cvt1(struct adc_sample *n)
{
  /* никаких проверок Q_BYTE_ORDER, блеать */
  return (n->parts[0] << 16) | (n->parts[1] << 8) | n-> parts[2];
}

void convert_adc_packet(const struct adc_packet *pkt, double *numbers)
{
   int i;

   for (i = 0; i < ALEN(pkt->samples); i++)
     numbers[i] = cvt1(&pkt->samples[i])*delta - Vcm;
}

P.S. не пользуйся битовыми полями.