@aircast-4g/mavlink
Version:
TypeScript type generator for MAVLink dialects
2 lines (1 loc) • 1.61 kB
JavaScript
import{createFrame as e}from"./frame.js";import{encodePayload as s,sortFieldsByWireOrder as o,getFieldDefaultValue as t}from"./codec.js";class a{constructor(e){this.registry=e}serializeMessage(o){const t=this.registry.getMessageDefinitionByName(o.message_name);if(!t)throw new Error(`Unknown message type: ${o.message_name}`);const a=this.extractMessageFields(o),r=this.completeMessageWithDefaults(a,t.fields),n=s(r,t.fields),i="number"==typeof o.system_id?o.system_id:1,m="number"==typeof o.component_id?o.component_id:1,d="number"==typeof o.sequence?o.sequence:0,c=this.registry.getCrcExtra(t.id);if(void 0===c)throw new Error(`No CRC_EXTRA defined for message ID ${t.id}`);const f=t.id>255,p=("number"==typeof o.protocol_version?o.protocol_version:void 0)??(f?2:1);return e(t.id,n,i,m,d,c,p)}completeMessage(e){const s=this.registry.getMessageDefinitionByName(e.message_name);if(!s)throw new Error(`Unknown message type: ${e.message_name}`);if(!e.payload||"object"!=typeof e.payload)throw new Error("Message must have a 'payload' object containing the message fields.");const a=e.payload,r=o(s.fields),n={...a};for(const e of r)void 0===n[e.name]&&(n[e.name]=t(e));return{...e,payload:n}}extractMessageFields(e){if(!e.payload||"object"!=typeof e.payload)throw new Error("Message must have a 'payload' object containing the message fields. Expected format: { message_name: '...', system_id: 1, component_id: 1, sequence: 0, payload: { ...fields } }");return e.payload}completeMessageWithDefaults(e,s){const o={...e};for(const e of s)void 0===o[e.name]&&(o[e.name]=t(e));return o}}export{a as MessageSerializer};