| /****************************************************************************** | |
| * | |
| * Copyright (C) 2018 ST Microelectronics S.A. | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at: | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| * | |
| * | |
| ******************************************************************************/ | |
| #ifndef TPDU_H_ | |
| #define TPDU_H_ | |
| //*********************************** Includes ********************************* | |
| #include <stdbool.h> | |
| #include <stdint.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include "Atp.h" | |
| //************************************ Defines ********************************* | |
| #define NAD_OFFSET_IN_TPDU 0 | |
| #define PCB_OFFSET_IN_TPDU 1 | |
| #define LEN_OFFSET_IN_TPDU 2 | |
| #define DATA_OFFSET_IN_TPDU 3 | |
| #define TPDU_MAX_LENGTH 259 | |
| #define TPDU_PROLOGUE_LENGTH 3 | |
| #define TPDU_MAX_DATA_LENGTH 254 | |
| #define TPDU_CRC_LENGTH 2 | |
| #define TPDU_LRC_LENGTH 1 | |
| //************************************ Structs ********************************* | |
| typedef struct { | |
| uint8_t nad; | |
| uint8_t pcb; | |
| uint8_t len; | |
| uint8_t *data; | |
| uint16_t checksum; | |
| } Tpdu; | |
| typedef enum { IBlock, RBlock, SBlock } TpduType; | |
| typedef enum { ErrorFree, ChecksumError, OtherErrors } RBlockType; | |
| //************************************ Functions ******************************* | |
| /** | |
| * Forms a byte array representing the given TPDU. | |
| * | |
| * @param structTpdu The TPDU struct to be converted to byte array. | |
| * @param baTpdu The memory position where to store the formed byte array. | |
| * | |
| * @return The length of the formed array | |
| */ | |
| uint16_t Tpdu_toByteArray(Tpdu *structTpdu, uint8_t *baTpdu); | |
| /** | |
| * Checks that the checksum in the TPDU is as expected. | |
| * | |
| * @param tpdu The TPDU whose checksum needs to be checked. | |
| * | |
| * @return true if checksum is ok, false otherwise. | |
| */ | |
| bool Tpdu_isChecksumOk(Tpdu *tpdu); | |
| /** | |
| * Forms a TPDU with the specified fields. | |
| * | |
| * @param nad The NAD byte of the TPDU. | |
| * @param pac The PCB byte of the TPDU. | |
| * @param len The length of the data. | |
| * @param data The data of the TPDU. | |
| * @pram tpdu The memory position where the formed TPDU will be stored. | |
| * | |
| * @return 0 if everything went ok, -1 otherwise. | |
| */ | |
| int Tpdu_formTpdu(uint8_t nad, uint8_t pcb, uint8_t len, uint8_t *data, | |
| Tpdu *tpdu); | |
| /** | |
| * Returns the checksum value in the form of a byte array. | |
| * | |
| * @param tpdu The TPDU struct from where to get the checksum value. | |
| * @param checksumBytes The memory position where to store the result. | |
| */ | |
| void Tpdu_getChecksumBytes(Tpdu *tpdu, uint8_t *checksumBytes); | |
| /** | |
| * Gets the value of the checksum stored in the array. | |
| * | |
| * @param array The array that contains the checksum. | |
| * @param checksumStartPosition The position where the checksum starts in array. | |
| * | |
| * @return The value of the checksum. | |
| */ | |
| uint16_t Tpdu_getChecksumValue(uint8_t *array, int checksumStartPosition, | |
| ChecksumType checksumType); | |
| /** | |
| * Returns the type of the TPDU. | |
| * | |
| * @param the tpdu the type has to be get. | |
| * | |
| * @return The TPDU type of the tpdu. | |
| */ | |
| TpduType Tpdu_getType(Tpdu *tpdu); | |
| /** | |
| * Copy Tpdu Struct. | |
| * | |
| * @param dest | |
| * src | |
| * | |
| * @return void | |
| */ | |
| void Tpdu_copy(Tpdu *dest, Tpdu *src); | |
| /** | |
| * Converts a TPDU into a hex string. | |
| * | |
| * @param tpdu The TPDU to be converted to a string. | |
| * @param hexStringBuffer The output buffer. | |
| */ | |
| void Tpdu_toHexString(Tpdu *tpdu, uint8_t *hexStringBuffer); | |
| #endif /* TPDU_H_ */ |