// // Created by xemon on 05.05.2022. // #include "XfcProtEncoder.h" #include "XfcProtCrc.h" #include "XfcProtCommon.h" ////private uint16_t XfcTransPackEncoderGetDataSegmentLength(tXfcProtEncoder *env) { return *((uint16_t *) (env->buffer->data + XFC_TRANSPORT_DATA_LEN_OFFSET)); } ////public tXfcArray XfcTransPackEncoderGetDataSegmentAsArray(tXfcProtEncoder *env) { return (tXfcArray) { .data = env->buffer->data + XFC_TRANSPORT_HEADER_LEN, .begin = 0, .end = 0, .limit = env->buffer->limit - XFC_TRANSPORT_HEADER_LEN + XFC_TRANSPORT_CRC_LEN, }; } void XfcTransPackEncoderSetId(tXfcProtEncoder *env, uint16_t id) { *((env->buffer->data + XFC_TRANSPORT_COMMAND_ID_OFFSET)) = id; } void XfcTransPackEncoderSetDataSegmentLength(tXfcProtEncoder *env, uint16_t dataSegmentLength) { *((uint16_t *) (env->buffer->data + XFC_TRANSPORT_DATA_LEN_OFFSET)) = dataSegmentLength; } void XfcTransPackEncoderFinalizeAndSignCrc(tXfcProtEncoder *env) { env->buffer->data[0] = env->magic; uint16_t dataLen = XfcTransPackEncoderGetDataSegmentLength(env); uint16_t crc = XfcProtCrc(env->buffer->data, dataLen + XFC_TRANSPORT_HEADER_LEN); *((uint16_t *) (env->buffer->data + XFC_TRANSPORT_HEADER_LEN + dataLen)) = crc; env->buffer->end = env->buffer->begin + dataLen + XFC_TRANSPORT_HEADER_LEN + XFC_TRANSPORT_CRC_LEN; }