XfcTransportProtocol/Src/XfcProtEncoder.c

41 lines
1.4 KiB
C

//
// Created by CFIF 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;
}