Интерпретация 16-битных значений Sphero (например, в Collisions)

Я использую Cylon.js и Node.js для работы со Sphero, и я не уверен, каким образом я должен восстановить 16-битные значения из данных, возвращенных из события столкновения.

Документы подразумевают, что они должны быть подписаны 16-разрядными целыми числами и что числа идут в байтовом порядке (MSB, LSB), но я получаю странные значения, когда пытаюсь преобразовать два байта в отрицательные значения мощности (например, удары). сзади или слева).

Код Javascript, который я использую для преобразования двухбайтового значения Sphero:

  function convertToSignedInt(msb, lsb) {
    var negative = msb > 128;
    if (negative) {
      msb -= 128;
    }
    var value = msb*256 + lsb;
    if (negative) {
      value = 0 - value;
    }
    return value;
  }

Приведены необработанные данные о столкновениях, подобные следующим:

{"SOP1":255,"SOP2":254,"ID_CODE":7,"DLEN":17,"DATA":[18,31,255,104,0,0,1,0,67,0,6,0,0,9,1,95],"CHK":156}

Затем я пытаюсь преобразовать свойство DATA в более читаемый объект, используя это:

  function convertCollisionData(data) {
    var obj = {};
    obj.xPower = convertToSignedInt(data[0], data[1]);
    obj.yPower = convertToSignedInt(data[2], data[3]);
    obj.zPower = convertToSignedInt(data[4], data[5]);
    obj.impactAxis = data[6];
    obj.xImpact = convertToSignedInt(data[7], data[8]);
    obj.yImpact = convertToSignedInt(data[9], data[10]);
    obj.speed = data[11];

    return obj;
  }

Чтобы придумать это:

{"xPower":4639,"yPower":-32616,"zPower":0
    ,"impactAxis":1,"xImpact":67,"yImpact":6,"speed":0}

Очевидно, что yPower совершенно не прав, поскольку это было правостороннее (положительное X) столкновение. Поскольку значения xImpact и yImpact положительны, они, по-видимому, преобразуются правильно.

Итак, короткая версия вопроса: как правильно преобразовать два байта в целое число со знаком?

0 ответов

Другие вопросы по тегам