blob: be2e70c8ad3a65ad61b61e400737ca61b47a5c6e [file] [log] [blame]
/******************************************************************************
*
* 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_ */