315 lines
7.3 KiB
C
315 lines
7.3 KiB
C
/*
|
|
* egts.c
|
|
*
|
|
* Created on: Jun 4, 2021
|
|
* Author: zemon
|
|
*/
|
|
|
|
|
|
#include "egts.h"
|
|
#include "egts_crc.h"
|
|
#include "string.h"
|
|
#include "stdint.h"
|
|
#include "math.h"
|
|
#include "egtsWorker.h"
|
|
|
|
#define ADD_TO_RESULT(DATA, LEN) memcpy(out + offset, (uint8_t * ) & DATA, LEN); offset+=LEN;
|
|
|
|
|
|
//flags
|
|
const uint8_t flags = 0b10000001;
|
|
//const uint16_t SPD = 50;
|
|
const uint8_t DIR = 0;
|
|
const uint32_t ODR = 0x000000;
|
|
const uint8_t DIN = 0;
|
|
const uint8_t SRC = 16;
|
|
const uint32_t ALT = 0x00;
|
|
|
|
//uint16_t vEgtsPackPosDataGen(uint8_t *out, void *args) {
|
|
// tEgtsPosDataArgs *posDataArgs = (tEgtsPosDataArgs *) args;
|
|
// return vEgtsPackPosData(out, posDataArgs);
|
|
//}
|
|
|
|
uint16_t vEgtsPackPosData(uint8_t *out, tEgtsPosDataArgs *args) {
|
|
|
|
uint32_t NTM = toEgtsTimestamp(args->epochTimestamp);
|
|
|
|
double lat = (fabs(args->latitude) / 90) * 0xFFFFFFFF;
|
|
double lon = (fabs(args->longitude) / 180) * 0xFFFFFFFF;
|
|
uint32_t LAT = (uint32_t) lat;
|
|
uint32_t LONG = (uint32_t) lon;
|
|
|
|
uint16_t offset = 0;
|
|
|
|
|
|
ADD_TO_RESULT(NTM, 4);
|
|
ADD_TO_RESULT(LAT, 4);
|
|
ADD_TO_RESULT(LONG, 4);
|
|
ADD_TO_RESULT(flags, 1);
|
|
ADD_TO_RESULT(args->velocity, 2);
|
|
ADD_TO_RESULT(DIR, 1);
|
|
ADD_TO_RESULT(ODR, 3);
|
|
ADD_TO_RESULT(DIN, 1);
|
|
ADD_TO_RESULT(SRC, 1);
|
|
ADD_TO_RESULT(ALT, 3);
|
|
|
|
return offset;
|
|
|
|
}
|
|
|
|
uint16_t vEgtsPackSensorsData(uint8_t *out, tEgtsSensorsDataArgs *args) {
|
|
|
|
uint16_t offset = 0;
|
|
|
|
ADD_TO_RESULT(args->digitalInPresent, 1);
|
|
ADD_TO_RESULT(args->digitalOutPresent, 1);
|
|
ADD_TO_RESULT(args->analogInPresent, 1);
|
|
|
|
for (uint16_t i = 0; i < 8; ++i) {
|
|
uint8_t mask = 0x1 << i;
|
|
if (args->digitalInPresent & mask) {
|
|
ADD_TO_RESULT(args->digitalIn[i], 1);
|
|
}
|
|
}
|
|
|
|
for (uint16_t i = 0; i < 8; ++i) {
|
|
uint8_t mask = 0x1 << i;
|
|
if (args->analogInPresent & mask) {
|
|
ADD_TO_RESULT(args->analogIn[i], 3);
|
|
}
|
|
}
|
|
return offset;
|
|
|
|
}
|
|
|
|
//uint32_t TID = 4168809385;
|
|
uint8_t TermIdentityFlags = 0b01000010;
|
|
//unit16_t TermIdentityHDID = ;
|
|
//unit32_t TermIdentityNID = ;
|
|
uint16_t TermIdentityBS = 512;
|
|
|
|
|
|
//uint16_t vEgtsPackTermIdentityGen(uint8_t *out, void *args) {
|
|
// tEgtsTermIdentityArgs *termIdentityArgs = (tEgtsTermIdentityArgs *) args;
|
|
// return vEgtsPackTermIdentity(out, termIdentityArgs);
|
|
//}
|
|
|
|
uint16_t vEgtsPackTermIdentity(uint8_t *out, tEgtsTermIdentityArgs *args) {
|
|
|
|
uint16_t offset = 0;
|
|
|
|
ADD_TO_RESULT(args->TerminalID, 4);
|
|
ADD_TO_RESULT(TermIdentityFlags, 1);
|
|
ADD_TO_RESULT((*args->IMEI), args->IMEI_len);
|
|
ADD_TO_RESULT(TermIdentityBS, 2);
|
|
|
|
return offset;
|
|
|
|
}
|
|
|
|
uint16_t vEgtsPackResponse(uint8_t *out, tEgtsRecordResponseData *args) {
|
|
|
|
uint16_t offset = 0;
|
|
|
|
ADD_TO_RESULT(args->CRN, 2);
|
|
ADD_TO_RESULT(args->RST, 1);
|
|
|
|
return offset;
|
|
|
|
}
|
|
|
|
uint16_t vEgtsPacSrCommandDataResponse(uint8_t *out, tEgtsSrCmdConfirmation *args) {
|
|
|
|
uint16_t offset = 0;
|
|
|
|
uint8_t flag = (args->CT << 0x4) | (args->CCT & 0xF);
|
|
ADD_TO_RESULT(flag, 1);
|
|
|
|
ADD_TO_RESULT(args->CID, 4);
|
|
ADD_TO_RESULT(args->SID, 4);
|
|
|
|
uint8_t hasFlags = (args->ACFE << 0x1) | (args->CHSFE & 0x1);
|
|
ADD_TO_RESULT(hasFlags, 1);
|
|
|
|
if (args->CHSFE) {
|
|
ADD_TO_RESULT(args->CHS, 1);
|
|
}
|
|
if (args->ACFE) {
|
|
ADD_TO_RESULT(args->ACL, 1);
|
|
ADD_TO_RESULT(args->AC, 4);
|
|
}
|
|
|
|
if ((args->CT == CT_COMCONF) && (args->CCT == CC_OK)) {
|
|
ADD_TO_RESULT(args->CmdData.ADR, 2);
|
|
uint8_t flagComData = (args->CmdData.SZ << 0x4) | (args->CmdData.ACT & 0xF);
|
|
ADD_TO_RESULT(flagComData, 1);
|
|
ADD_TO_RESULT(args->CmdData.CCD, 2);
|
|
}
|
|
if (args->CmdData.DT) {
|
|
//todo?
|
|
}
|
|
|
|
return offset;
|
|
}
|
|
|
|
uint16_t vEgtsPackTeledataTransport(
|
|
uint16_t packetId,
|
|
uint8_t *out,
|
|
double latitude,
|
|
double longitude,
|
|
uint16_t velocity,
|
|
uint32_t epochTimestamp
|
|
) {
|
|
tEgtsPosDataArgs args = {
|
|
.longitude = longitude,
|
|
.latitude = latitude,
|
|
.velocity = velocity,
|
|
.epochTimestamp = epochTimestamp,
|
|
};
|
|
|
|
return vEgtsPackTransport(
|
|
0,
|
|
packetId,
|
|
out,
|
|
EGTS_SERVICE_FLAGS_POS,
|
|
EGTS_PT_APPDATA,
|
|
EGTS_TELEDATA_SERVICE,
|
|
EGTS_TELEDATA_SERVICE,
|
|
epochTimestamp,
|
|
EGTS_SR_POS_DATA,
|
|
vEgtsPackPosDataGen,
|
|
&args
|
|
);
|
|
|
|
// return vEgtsPackPosData(out, &args);
|
|
}
|
|
|
|
|
|
uint16_t vEgtsPackSensorsTransport(
|
|
uint16_t packetId,
|
|
uint8_t *out,
|
|
uint32_t epochTimestamp,
|
|
tEgtsSensorsDataArgs *sensors
|
|
) {
|
|
return vEgtsPackTransport(
|
|
0,
|
|
packetId,
|
|
out,
|
|
EGTS_SERVICE_FLAGS_POS,
|
|
EGTS_PT_APPDATA,
|
|
EGTS_TELEDATA_SERVICE,
|
|
EGTS_TELEDATA_SERVICE,
|
|
epochTimestamp,
|
|
EGTS_SR_AD_SENSORS_DATA,
|
|
vEgtsPackSensorsDataGen,
|
|
sensors
|
|
);
|
|
|
|
// return vEgtsPackPosData(out, &args);
|
|
}
|
|
|
|
uint16_t vEgtsPackTermIdentityTransport(
|
|
uint16_t packetId,
|
|
uint8_t *out,
|
|
uint8_t *IMEI,
|
|
uint8_t IMEI_len,
|
|
uint32_t TerminalID,
|
|
uint32_t epochTimestamp
|
|
) {
|
|
tEgtsTermIdentityArgs args = {
|
|
.IMEI = IMEI,
|
|
.IMEI_len = IMEI_len,
|
|
.TerminalID = TerminalID,
|
|
// .epochTimestamp = epochTimestamp,
|
|
};
|
|
|
|
return vEgtsPackTransport(
|
|
0,
|
|
packetId,
|
|
out,
|
|
EGTS_SERVICE_FLAGS_AUTH,
|
|
EGTS_PT_APPDATA,
|
|
EGTS_AUTH_SERVICE,
|
|
EGTS_AUTH_SERVICE,
|
|
epochTimestamp,
|
|
EGTS_SR_TERM_IDENTITY,
|
|
vEgtsPackTermIdentityGen,
|
|
&args
|
|
);
|
|
|
|
// return vEgtsPackPosData(out, &args);
|
|
}
|
|
|
|
uint16_t
|
|
vEgtsPackEgtsResponse(uint16_t packetId, uint8_t *out, uint8_t rst, uint16_t crn, uint16_t cid, uint32_t timestamp) {
|
|
|
|
tEgtsRecordResponseData args = {
|
|
.CRN = crn,
|
|
.RST = rst,
|
|
};
|
|
|
|
return vEgtsPackTransport(
|
|
cid,
|
|
packetId,
|
|
out,
|
|
EGTS_SERVICE_FLAGS_POS,
|
|
EGTS_PT_RESPONSE,
|
|
EGTS_ECALL_SERVICE,
|
|
EGTS_ECALL_SERVICE,
|
|
timestamp,
|
|
EGTS_SR_RECORD_RESPONSE,
|
|
vEgtsPackResponseGen,
|
|
&args
|
|
);
|
|
}
|
|
|
|
uint16_t vEgtsPackSrCmdConfirmation(
|
|
uint8_t *out,
|
|
uint16_t packetId,
|
|
uint16_t cmdType,
|
|
uint16_t cmdConfirType,
|
|
uint16_t cid,
|
|
uint16_t sid,
|
|
uint16_t acfe,
|
|
uint16_t chsfe,
|
|
uint16_t adr,
|
|
uint8_t sz,
|
|
uint8_t act,
|
|
uint16_t ccd,
|
|
uint32_t dt
|
|
) {
|
|
|
|
bool authCodeExist = false;
|
|
bool charsetExist = false;
|
|
|
|
tEgtsSrCmdConfirmation args = {
|
|
.CT = cmdType,
|
|
.CCT = cmdConfirType,
|
|
.CID = cid,
|
|
.SID = sid,
|
|
.ACFE = acfe,
|
|
.CHSFE = chsfe,
|
|
.CmdData.ADR = adr,
|
|
.CmdData.SZ = sz,
|
|
.CmdData.ACT = act,
|
|
.CmdData.CCD = ccd,
|
|
.CmdData.DT = dt,
|
|
};
|
|
|
|
return vEgtsPackTransport(
|
|
0,
|
|
packetId,
|
|
out,
|
|
EGTS_SERVICE_FLAGS_POS,
|
|
EGTS_PT_APPDATA,
|
|
EGTS_COMMANDS_SERVICE,
|
|
EGTS_COMMANDS_SERVICE,
|
|
0,
|
|
EGTS_SR_COMMAND_DATA,
|
|
vEgtsPacSrCommandDataResponseGen,
|
|
&args
|
|
);
|
|
}
|
|
|
|
|