You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
4.2 KiB
140 lines
4.2 KiB
7 months ago
|
/******************************************************************************
|
||
|
*
|
||
|
* 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.
|
||
|
*
|
||
|
*
|
||
|
******************************************************************************/
|
||
|
#define LOG_TAG "Atp"
|
||
|
#include "Atp.h"
|
||
|
#include "Iso13239CRC.h"
|
||
|
#include "android_logmsg.h"
|
||
|
|
||
|
Atp ATP = {.bwt = 0x0690, .checksumType = CRC, .ifsc = 0xFE};
|
||
|
|
||
|
uint8_t gATP[ATP_MAX_ALLOWED_LENGTH];
|
||
|
//************************************ Functions *******************************
|
||
|
|
||
|
/*******************************************************************************
|
||
|
**
|
||
|
** Function Atp_getChecksumValue
|
||
|
**
|
||
|
** Description Gets the value of the checksum stored in the array.
|
||
|
**
|
||
|
** Parameters array - array that contains the checksum.
|
||
|
** checksumStartPosition - checksum start position in array.
|
||
|
**
|
||
|
** Returns checksum value
|
||
|
**
|
||
|
*******************************************************************************/
|
||
|
uint16_t Atp_getChecksumValue(uint8_t *array, int checksumStartPosition) {
|
||
|
return (uint16_t)((uint8_t)array[checksumStartPosition + 1] << 8) |
|
||
|
(uint8_t)array[checksumStartPosition];
|
||
|
}
|
||
|
|
||
|
/*******************************************************************************
|
||
|
**
|
||
|
** Function Atp_setAtp
|
||
|
**
|
||
|
** Description Sets the ATP struct available for the whole system.
|
||
|
**
|
||
|
** Parameters baAtp - ATP as a byte array.
|
||
|
**
|
||
|
** Returns 0 If everything is Ok, -1 otherwise.
|
||
|
**
|
||
|
*******************************************************************************/
|
||
|
int Atp_setAtp(uint8_t *baAtp) {
|
||
|
uint8_t i;
|
||
|
Atp tmpAtp;
|
||
|
|
||
|
// Length
|
||
|
tmpAtp.len = (uint8_t)baAtp[LEN_OFFSET_IN_ATP];
|
||
|
|
||
|
if (tmpAtp.len > ATP_MAX_ALLOWED_LENGTH) {
|
||
|
return -1;
|
||
|
}
|
||
|
memcpy(gATP, baAtp, tmpAtp.len);
|
||
|
tmpAtp.checksum = Atp_getChecksumValue(baAtp, CHECKSUM_OFFSET_IN_ATP);
|
||
|
|
||
|
// Check CRC
|
||
|
if (computeCrc(baAtp, LEN_LENGTH_IN_ATP + tmpAtp.len - CRC_LENGTH_IN_ATP) !=
|
||
|
tmpAtp.checksum) {
|
||
|
STLOG_HAL_E("Error computing CRC");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
// CHECKSUM TYPE
|
||
|
if (baAtp[CHECKSUM_TYPE_OFFSET_IN_ATP] == 0) {
|
||
|
tmpAtp.checksumType = LRC;
|
||
|
} else if (baAtp[CHECKSUM_TYPE_OFFSET_IN_ATP] == 1) {
|
||
|
tmpAtp.checksumType = CRC;
|
||
|
} else {
|
||
|
// Unexpected value.
|
||
|
STLOG_HAL_E("Unexpected value of checksum type.");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
// Vendor ID
|
||
|
for (i = 0; i < VENDOR_ID_LENGTH_IN_ATP; i++) {
|
||
|
tmpAtp.vendorID[i] = baAtp[VENDOR_ID_OFFSET_IN_ATP + i];
|
||
|
}
|
||
|
|
||
|
// BWT
|
||
|
tmpAtp.bwt = 0;
|
||
|
for (i = 0; i < BWT_LENGTH_IN_ATP; i++) {
|
||
|
tmpAtp.bwt =
|
||
|
(uint16_t)(tmpAtp.bwt << 8) + (uint8_t)baAtp[BWT_OFFSET_IN_ATP + i];
|
||
|
}
|
||
|
|
||
|
// CWT
|
||
|
tmpAtp.cwt = (uint8_t)baAtp[CWT_OFFSET_IN_ATP];
|
||
|
|
||
|
// PWT
|
||
|
tmpAtp.pwt = (uint8_t)baAtp[PWT_OFFSET_IN_ATP];
|
||
|
|
||
|
// MSF
|
||
|
STLOG_HAL_V("Configuring ATP %i", tmpAtp.msf);
|
||
|
tmpAtp.msf = 0;
|
||
|
for (i = 0; i < MSF_LENGTH_IN_ATP; i++) {
|
||
|
tmpAtp.msf =
|
||
|
(uint16_t)(tmpAtp.msf << 8) + (uint8_t)baAtp[MSF_OFFSET_IN_ATP + i];
|
||
|
STLOG_HAL_V("Loop ATP %i", baAtp[MSF_OFFSET_IN_ATP + i]);
|
||
|
}
|
||
|
|
||
|
// IFSC
|
||
|
tmpAtp.ifsc = (uint8_t)baAtp[IFSC_OFFSET_IN_ATP];
|
||
|
|
||
|
// HISTORICAL CHARACTER
|
||
|
for (i = 0; i < HISTORICAL_CHARACTER_LENGTH_IN_ATP; i++) {
|
||
|
tmpAtp.historicalCharacter[i] =
|
||
|
baAtp[HISTORICAL_CHARACTER_OFFSET_IN_ATP + i];
|
||
|
}
|
||
|
|
||
|
// Set the actual ATP and return with no error.
|
||
|
ATP = tmpAtp;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************************
|
||
|
**
|
||
|
** Function Atp_getAtp
|
||
|
**
|
||
|
** Description Gets the ATP stored.
|
||
|
**
|
||
|
**
|
||
|
** Returns pointer to the ATP array
|
||
|
**
|
||
|
*******************************************************************************/
|
||
|
uint8_t *Atp_getAtp() { return &gATP[0]; }
|