Cylon.jsと Node.js を使用して Sphero を操作していますが、衝突イベントから返されたデータから 16 ビット値を再構築する方法がわかりません。
ドキュメントは、それらが符号付きの 16 ビット整数である必要があり、数値が (MSB、LSB) バイト順であることを暗示していますが、2 バイトを負の電力定格 (インパクトなど) に変換しようとすると、奇妙な値が得られます。後ろまたは左から)。
2 バイトの Sphero 値を変換するために使用している Javascript コードは次のとおりです。
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}
これは右側 (正の X) 衝突だったので、yPower が完全に間違っていることは明らかです。xImpact と yImpact の値は正であるため、正しく変換されているように見えます。
質問の短いバージョンは、2 バイトを符号付き整数に変換する適切な方法は何ですか?