@aircast-4g/mavlink
Version:
TypeScript type generator for MAVLink dialects
2 lines (1 loc) • 5.16 kB
JavaScript
function t(t){switch(t){case"uint8_t":case"int8_t":case"char":default:return 1;case"uint16_t":case"int16_t":return 2;case"uint32_t":case"int32_t":case"float":return 4;case"uint64_t":case"int64_t":case"double":return 8}}function e(t){return t.includes("[")&&t.includes("]")?t.substring(0,t.indexOf("[")):t}function n(n){const r=n.type,s=n.arrayLength;if(s&&s>1)return t(e(r))*s;if(r.includes("[")&&r.includes("]")){const n=e(r),s=parseInt(r.substring(r.indexOf("[")+1,r.indexOf("]")));return t(n)*s}return t(r)}function r(n){return t(e(n.type))}function s(t){const e=[],n=[];return t.forEach((t,r)=>{t.extension?n.push(t):e.push({field:t,originalIndex:r})}),e.sort((t,e)=>{const n=r(t.field),s=r(e.field);return s!==n?s-n:t.originalIndex-e.originalIndex}),[...e.map(t=>t.field),...n]}function a(t){switch(t){case"uint64_t":case"int64_t":return 0n;default:return 0}}function i(t){if(void 0!==t.arrayLength&&t.arrayLength>1)return[];switch(e(t.type)){case"uint64_t":case"int64_t":return 0n;case"char":return t.type.includes("[")?"":"\0";default:return 0}}function u(t,n,r){try{switch(r){case"uint8_t":return{value:t.getUint8(n),bytesRead:1};case"int8_t":return{value:t.getInt8(n),bytesRead:1};case"uint16_t":return{value:t.getUint16(n,!0),bytesRead:2};case"int16_t":return{value:t.getInt16(n,!0),bytesRead:2};case"uint32_t":return{value:t.getUint32(n,!0),bytesRead:4};case"int32_t":return{value:t.getInt32(n,!0),bytesRead:4};case"uint64_t":return{value:t.getBigUint64(n,!0),bytesRead:8};case"int64_t":return{value:t.getBigInt64(n,!0),bytesRead:8};case"float":return{value:t.getFloat32(n,!0),bytesRead:4};case"double":return{value:t.getFloat64(n,!0),bytesRead:8};case"char":{const e=t.getUint8(n);return{value:0===e?"\0":String.fromCharCode(e),bytesRead:1}}default:if(r.startsWith("char[")&&r.endsWith("]")){const e=parseInt(r.slice(5,-1)),s=[];for(let r=0;r<e&&n+r<t.byteLength;r++){const e=t.getUint8(n+r);if(0===e)break;s.push(String.fromCharCode(e))}return{value:s.join(""),bytesRead:e}}if(r.includes("[")&&r.includes("]")){const s=e(r),a=parseInt(r.substring(r.indexOf("[")+1,r.indexOf("]"))),i=[];let c=0;for(let e=0;e<a&&!(n+c>=t.byteLength);e++){const{value:e,bytesRead:r}=u(t,n+c,s);"string"!=typeof e&&"number"!=typeof e&&"bigint"!=typeof e&&"boolean"!=typeof e||i.push(e),c+=r}return{value:i,bytesRead:c}}return{value:t.getUint8(n),bytesRead:1}}}catch{return{value:0,bytesRead:1}}}function c(t,n,r){const s=void 0!==r.arrayLength,a=r.arrayLength||1;if(s&&a>1){const s=e(r.type);if("char"===s){const e=[];let r=0;for(let s=0;s<a&&!(n+r>=t.byteLength);s++){const s=t.getUint8(n+r);if(0===s)break;e.push(String.fromCharCode(s)),r+=1}return{value:e.join(""),bytesRead:a}}const i=[];let c=0;for(let e=0;e<a&&!(n+c>=t.byteLength);e++){const{value:e,bytesRead:r}=u(t,n+c,s);"string"!=typeof e&&"number"!=typeof e&&"bigint"!=typeof e&&"boolean"!=typeof e||i.push(e),c+=r}return{value:i,bytesRead:c}}return u(t,n,r.type)}function o(t,e){const n={},r=new DataView(t.buffer,t.byteOffset,t.byteLength);let a=0;const u=s(e);for(const e of u)if(a>=t.length)n[e.name]=i(e);else{const{value:t,bytesRead:s}=c(r,a,e);n[e.name]=t,a+=s}return n}function f(t,e,n,r){const s=r??a(n);switch(n){case"uint8_t":return t.setUint8(e,Number(s)),1;case"int8_t":return t.setInt8(e,Number(s)),1;case"uint16_t":return t.setUint16(e,Number(s),!0),2;case"int16_t":return t.setInt16(e,Number(s),!0),2;case"uint32_t":return t.setUint32(e,Number(s),!0),4;case"int32_t":return t.setInt32(e,Number(s),!0),4;case"uint64_t":return t.setBigUint64(e,"bigint"==typeof s?s:BigInt(Number(s)||0),!0),8;case"int64_t":return t.setBigInt64(e,"bigint"==typeof s?s:BigInt(Number(s)||0),!0),8;case"float":return t.setFloat32(e,Number(s),!0),4;case"double":return t.setFloat64(e,Number(s),!0),8;case"char":return t.setUint8(e,"string"==typeof s?s.charCodeAt(0):Number(s)),1;default:if(n.startsWith("char[")&&n.endsWith("]")){const r=parseInt(n.slice(5,-1)),a=String(s);for(let n=0;n<r;n++){const r=n<a.length?a.charCodeAt(n):0;t.setUint8(e+n,r)}return r}return t.setUint8(e,Number(s)),1}}function l(t,n,r,s){const i=void 0!==r.arrayLength,u=r.arrayLength||1;if(i&&u>1){let i=0;const c=e(r.type);if("char"===c&&"string"==typeof s){const e=s;for(let r=0;r<u;r++){const s=r<e.length?e.charCodeAt(r):0;t.setUint8(n+i,s),i+=1}return i}const o=Array.isArray(s)?s:[s];for(let e=0;e<u;e++)i+=f(t,n+i,c,e<o.length?o[e]:a(c));return i}return f(t,n,r.type,s)}function g(t,e){const r=s(e);let a=0;for(const t of r)a+=n(t);const i=new ArrayBuffer(a),u=new DataView(i);let c=0;for(const e of r)c+=l(u,c,e,t[e.name]);const o=new Uint8Array(i);let f=0,g=0,d=!1;for(const t of r){const e=n(t);!0===t.extension?d||(g=f,d=!0):f+=e}if(!d)return o;let y=o.length;if(d&&g<o.length){let t=!1;for(let e=g;e<o.length;e++)if(0!==o[e]){t=!0;break}if(t){for(let t=o.length-1;t>=g;t--)if(0!==o[t]){y=t+1;break}}else y=f}return y<f&&(y=f),y<o.length?o.slice(0,y):o}export{c as decodeField,o as decodePayload,u as decodeSingleValue,l as encodeField,g as encodePayload,f as encodeSingleValue,e as getBaseType,a as getDefaultValue,i as getFieldDefaultValue,n as getFieldSize,r as getFieldTypeSize,t as getTypeSize,s as sortFieldsByWireOrder};