/****************************************************************************** * * 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]; }