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.
84 lines
2.4 KiB
84 lines
2.4 KiB
/** |
|
* @copyright Copyright (c) 2021 Sagetech, Inc. All rights reserved. |
|
* |
|
* @file sgDecodeInstall.c |
|
* @author Jacob.Garrison |
|
* |
|
* @date Mar 9, 2021 |
|
* |
|
*/ |
|
|
|
#include <string.h> |
|
#include <stdbool.h> |
|
|
|
#include "sg.h" |
|
#include "sgUtil.h" |
|
|
|
#define SG_REG_LEN 7 // The number of bytes in the registration field |
|
|
|
#define SG_STL_ANTENNA 0x03 |
|
#define SG_STL_ALT_RES 0x08 |
|
#define SG_STL_HDG_TYPE 0x10 |
|
#define SG_STL_SPD_TYPE 0x20 |
|
#define SG_STL_HEATER 0x40 |
|
#define SG_STL_WOW 0x80 |
|
|
|
typedef struct __attribute__((packed)) |
|
{ |
|
uint8_t start; |
|
uint8_t type; |
|
uint8_t id; |
|
uint8_t payloadLen; |
|
uint8_t icao[3]; |
|
char registration[SG_REG_LEN]; |
|
uint8_t rsvd1[2]; |
|
uint8_t com0; |
|
uint8_t com1; |
|
uint8_t ipAddress[4]; |
|
uint8_t subnetMask[4]; |
|
uint8_t port[2]; |
|
uint8_t gpsIntegrity; |
|
uint8_t emitterSet; |
|
uint8_t emitterType; |
|
uint8_t size; |
|
uint8_t maxSpeed; |
|
uint8_t altOffset[2]; |
|
uint8_t rsvd2[2]; |
|
uint8_t config; |
|
uint8_t rsvd3[2]; |
|
uint8_t checksum; |
|
} stl_t; |
|
|
|
/* |
|
* Documented in the header file. |
|
*/ |
|
bool sgDecodeInstall(uint8_t *buffer, sg_install_t *stl) |
|
{ |
|
memset(&stl->reg[0], '\0', sizeof(stl->reg)); // Ensure registration is null-terminated |
|
|
|
stl_t sgStl; |
|
memcpy(&sgStl, buffer, sizeof(stl_t)); |
|
|
|
stl->icao = toIcao(sgStl.icao); |
|
strcpy(stl->reg, sgStl.registration); |
|
memset(&stl->reg[SG_REG_LEN], 0, 1); // Ensure registration is null-terminated |
|
stl->com0 = (sg_baud_t)(sgStl.com0); |
|
stl->com1 = (sg_baud_t)(sgStl.com1); |
|
stl->eth.ipAddress = toUint32(sgStl.ipAddress); |
|
stl->eth.subnetMask = toUint32(sgStl.subnetMask); |
|
stl->eth.portNumber = toUint16(sgStl.port); |
|
stl->sil = (sg_sil_t)(sgStl.gpsIntegrity >> 4); |
|
stl->sda = (sg_sda_t)(sgStl.gpsIntegrity & 0x0F); |
|
stl->emitter = (sg_emitter_t)(0x10 * sgStl.emitterSet + sgStl.emitterType); |
|
stl->size = (sg_size_t)sgStl.size; |
|
stl->maxSpeed = (sg_airspeed_t)sgStl.maxSpeed; |
|
stl->altOffset = toUint16(sgStl.altOffset); |
|
stl->antenna = (sg_antenna_t)sgStl.config & SG_STL_ANTENNA; |
|
stl->altRes100 = sgStl.config & SG_STL_ALT_RES; |
|
stl->hdgTrueNorth = sgStl.config & SG_STL_HDG_TYPE; |
|
stl->airspeedTrue = sgStl.config & SG_STL_SPD_TYPE; |
|
stl->heater = sgStl.config & SG_STL_HEATER; |
|
stl->wowConnected = sgStl.config & SG_STL_WOW; |
|
|
|
return true; |
|
}
|
|
|