you can grab the code from multiwii , look at serializeN() function
$M<[payloadlenght][mspId][payload][cheksum]
payloadlenght = payload / 8
cheksum = for (char c :payload){ checksum ^= int(c); }
ex : with mspId = MSP_SET_RC_TUNING the payload lenght is 7
here is java implementation that i use in my
MultiWiiConf.pde, a liitle readable than the previous checksum calculation
Code: Select all
// MSP_SET_RC_TUNING
payload = new ArrayList<Character>();
payload.add(char( round(confRC_RATE.value()*100)) );
payload.add(char( round(confRC_EXPO.value()*100)) );
payload.add(char( round(rollPitchRate.value()*100)) );
payload.add(char( round(yawRate.value()*100)) );
payload.add(char( round(dynamic_THR_PID.value()*100)) );
payload.add(char( round(throttle_MID.value()*100)) );
payload.add(char( round(throttle_EXPO.value()*100)) );
requestMSP(MSP_SET_RC_TUNING,payload.toArray( new Character[payload.size()]) );
Code: Select all
//send with/without payload
void requestMSP(int msp, Character[] payload) {
if(msp < 0) {
return;
}
StringBuffer bf = new StringBuffer().append(MSP_HEADER);
if (payload != null){
bf.append(char(payload.length)).append(char(msp));
byte checksum=0;
for (char c :payload){
bf.append(c);
checksum ^= int(c);
}
bf.append(char(int(checksum)));
}else{
bf.append(char(msp));
}