Initial version.
This commit is contained in:
@@ -0,0 +1,327 @@
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* Description: Functions for framing operations.
|
||||
*
|
||||
* Date: 2022-07-16 14:17
|
||||
* LastEditors: Fan Hao
|
||||
* LastEditTime: 2022-07-16 17:11
|
||||
* Revisions: Rev x.x
|
||||
* History:
|
||||
* [YYYY-MM-DD]: Description of modification.
|
||||
*
|
||||
* Copyright(c) 2022 Beijing Institute of Technology.
|
||||
* Lab of Communication and Networking
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/***************************** Include Files *********************************/
|
||||
#include <stdint.h>
|
||||
#include "linklayer814.h"
|
||||
#include "msg_def.h"
|
||||
#include "../error.h"
|
||||
#include "../common.h"
|
||||
#include "../bit_array/bit_array.h"
|
||||
|
||||
/************************** Constant Definitions *****************************/
|
||||
// Definition of each slot content
|
||||
L2_MSG_TYPE intraBmFrameMsgs[1] = {
|
||||
L2_MSG_BM
|
||||
};
|
||||
L2_MSG_TYPE intraW2AcqFrameMsgs[6] = {
|
||||
L2_MSG_SCAN_INIT,
|
||||
L2_MSG_SCAN_CONT_1,
|
||||
L2_MSG_SCAN_CONT_2,
|
||||
L2_MSG_SCAN_CONT_3,
|
||||
L2_MSG_SCAN_CONT_4,
|
||||
L2_MSG_SCAN_CONT_5
|
||||
};
|
||||
|
||||
L2_MSG_TYPE intraMgmtFrameMsgs[6] = {
|
||||
L2_MSG_TK_INIT,
|
||||
L2_MSG_TK_EXTD,
|
||||
L2_MSG_TK_CONT_1,
|
||||
L2_MSG_TK_CONT_2,
|
||||
L2_MSG_TK_CONT_3,
|
||||
L2_MSG_NQT_INIT
|
||||
};
|
||||
|
||||
L2_MSG_TYPE taFrameMsgs[4] = {
|
||||
L2_MSG_TA_INIT,
|
||||
L2_MSG_TA_EXTD,
|
||||
L2_MSG_TA_CONT_1,
|
||||
L2_MSG_TA_CONT_2
|
||||
};
|
||||
|
||||
L2_MSG_TYPE interSvcFrameMsgs[2] = {
|
||||
L2_MSG_LINK_INIT,
|
||||
L2_MSG_LINK_CONT_1
|
||||
};
|
||||
|
||||
L2_MSG_TYPE rttReqFrameMsgs[3] = {
|
||||
L2_MSG_RTT_REQ_INIT,
|
||||
L2_MSG_RTT_REQ_EXTD,
|
||||
L2_MSG_RTT_REQ_CONT
|
||||
};
|
||||
|
||||
L2_MSG_TYPE rttRspFrameMsgs[3] = {
|
||||
L2_MSG_RTT_RSP_INIT,
|
||||
L2_MSG_RTT_RSP_EXTD,
|
||||
L2_MSG_RTT_RSP_CONT
|
||||
};
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Insert a data chunk to a bit array.
|
||||
*
|
||||
* @param bitarr pointer to target bit array.
|
||||
* offset offset of insert start position.
|
||||
* numBit number of insert bits
|
||||
* chunk 64 bit data chunk, contains the data should be stored
|
||||
* in LSB style.
|
||||
*
|
||||
* @return FAILURE insert operation exceed bit array size.
|
||||
* SUCCESS
|
||||
*
|
||||
******************************************************************************/
|
||||
void FrameInsertChunk(BIT_ARRAY* bitarr, uint32_t offset, uint32_t numBit, uint64_t chunk){
|
||||
ASSERT(bitarr != NULL);
|
||||
ASSERT(bitarr->num_of_bits >= offset+numBit && numBit <= 64);
|
||||
#ifdef CHUNK_FILL_STYLE_XJY
|
||||
int32_t bitRmn = numBit;
|
||||
uint64_t dataWr = 0;
|
||||
uint32_t bitOff = 0;
|
||||
uint32_t byteOff = 0;
|
||||
uint32_t bitWr = 0;
|
||||
uint32_t bitWrCnt = 0;
|
||||
while (bitRmn > 0){
|
||||
bitOff = offset%8;
|
||||
byteOff = offset/8;
|
||||
bitWr = (bitRmn > (8-bitOff)) ? (8-bitOff) : bitRmn;
|
||||
dataWr = chunk>>(numBit-(bitWr + bitWrCnt));
|
||||
bit_array_set_wordn(bitarr, byteOff*8 + (8-bitOff-bitWr), dataWr, bitWr);
|
||||
bitWrCnt += bitWr;
|
||||
bitRmn -= bitWr;
|
||||
offset += bitWr;
|
||||
}
|
||||
#else
|
||||
bit_array_set_wordn(bitarr, offset, chunk, numBit);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Get a data chunk to a bit array.
|
||||
*
|
||||
* @param bitarr pointer to target bit array.
|
||||
* offset offset of data chunk start position.
|
||||
* numBit number of data chunk
|
||||
* chunk pointer to a 64 bit data chunk container, data will be stored
|
||||
* in LSB style.
|
||||
*
|
||||
* @return FAILURE read operation exceed bit array size.
|
||||
* SUCCESS
|
||||
*
|
||||
******************************************************************************/
|
||||
void FrameGetChunk(BIT_ARRAY* bitarr, uint32_t offset, uint32_t numBit, uint64_t* chunk){
|
||||
ASSERT(bitarr != NULL);
|
||||
ASSERT(bitarr->num_of_bits >= offset+numBit && numBit <= 64);
|
||||
|
||||
#ifdef CHUNK_FILL_STYLE_XJY
|
||||
int32_t bitRmn = numBit;
|
||||
uint64_t dataRd = 0;
|
||||
uint32_t bitOff = offset%8;
|
||||
uint32_t byteOff = offset/8;
|
||||
uint32_t bitRd = (bitRmn > (8-bitOff)) ? (8-bitOff) : bitRmn;
|
||||
uint32_t bitRdCnt = 0;
|
||||
while (bitRmn > 0){
|
||||
dataRd |= bit_array_get_wordn(bitarr, byteOff*8 + (8-bitOff-bitRd), bitRd);
|
||||
bitRdCnt += bitRd;
|
||||
bitRmn -= bitRd;
|
||||
offset += bitRd;
|
||||
bitOff = offset%8;
|
||||
byteOff = offset/8;
|
||||
bitRd = (bitRmn > (8-bitOff)) ? (8-bitOff) : bitRmn;
|
||||
dataRd = dataRd<<bitRd;
|
||||
}
|
||||
*chunk = dataRd;
|
||||
return SUCCESS;
|
||||
#else
|
||||
*chunk = bit_array_get_wordn(bitarr, offset, numBit);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Generate crc of specified data.
|
||||
*
|
||||
* @param dataBuff pointer to data buffer.
|
||||
* dataLen length of specified data.
|
||||
* crcType type of crc
|
||||
* crc a pointer to 32 bit crc container.
|
||||
*
|
||||
* @return FAILURE crc type not support.
|
||||
* SUCCESS
|
||||
*
|
||||
******************************************************************************/
|
||||
static int32_t L2_CrcGen(uint8_t* dataBuff, uint32_t dataLen, L2_CRC_TYPE crcType, uint32_t* crc){
|
||||
// ASSERT(dataBuff != NULL);
|
||||
int32_t Status = SUCCESS;
|
||||
uint32_t crcVal = 0;
|
||||
switch (crcType){
|
||||
case L2_CRC16_1021:
|
||||
Status = crc16_gen(dataBuff, dataLen, 0x1021, (uint16_t*)&crcVal);
|
||||
break;
|
||||
case L2_CRC16_8005:
|
||||
Status = crc16_gen(dataBuff, dataLen, 0x8005, (uint16_t*)&crcVal);
|
||||
break;
|
||||
case L2_CRC8_31:
|
||||
Status = crc8_gen(dataBuff, dataLen, 0x31, (uint8_t*)&crcVal);
|
||||
break;
|
||||
default:
|
||||
Status = EPARAM;
|
||||
break;
|
||||
}
|
||||
if(Status == SUCCESS){
|
||||
*crc = crcVal;
|
||||
}
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Append a crc of specified data, to a specified position.
|
||||
*
|
||||
* @param dataBuff pointer to data buffer.
|
||||
* dataLen length of specified data.
|
||||
* crcPos position of crc insert position
|
||||
* crcType type of crc
|
||||
*
|
||||
* @return FAILURE crc type not support.
|
||||
* SUCCESS
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t L2_CrcAppend(uint8_t* dataBuff, uint32_t dataLen, uint32_t crcPos, L2_CRC_TYPE crcType){
|
||||
// ASSERT(dataBuff != NULL);
|
||||
int32_t Status = SUCCESS;
|
||||
uint32_t crcVal = 0;
|
||||
uint8_t* crcPtr = dataBuff+crcPos;
|
||||
Status = L2_CrcGen(dataBuff,dataLen, crcType, &crcVal);
|
||||
if(Status != SUCCESS){
|
||||
return Status;
|
||||
}
|
||||
#ifdef CHUNK_FILL_STYLE_XJY
|
||||
switch (crcType){
|
||||
case L2_CRC16_1021:
|
||||
*crcPtr = (uint8_t)(crcVal>>8);
|
||||
*(crcPtr+1) = (uint8_t)(crcVal);
|
||||
break;
|
||||
case L2_CRC16_8005:
|
||||
*crcPtr = (uint8_t)(crcVal>>8);
|
||||
*(crcPtr+1) = (uint8_t)(crcVal);
|
||||
break;
|
||||
case L2_CRC8_31:
|
||||
*crcPtr = (uint8_t)crcVal;
|
||||
break;
|
||||
default:
|
||||
Status = EPARAM;
|
||||
break;
|
||||
}
|
||||
#else
|
||||
switch (crcType){
|
||||
case L2_CRC16_1021:
|
||||
*(crcPtr+1) = (uint8_t)(crcVal>>8);
|
||||
*crcPtr = (uint8_t)(crcVal);
|
||||
break;
|
||||
case L2_CRC16_8005:
|
||||
*(crcPtr+1) = (uint8_t)(crcVal>>8);
|
||||
*crcPtr = (uint8_t)(crcVal);
|
||||
break;
|
||||
case L2_CRC8_31:
|
||||
*crcPtr = (uint8_t)crcVal;
|
||||
break;
|
||||
default:
|
||||
Status = EPARAM;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Check data validation by crc.
|
||||
*
|
||||
* @param dataBuff pointer to data buffer.
|
||||
* dataLen length of specified data.
|
||||
* crcPos position of crc insert position
|
||||
* crcType type of crc
|
||||
*
|
||||
* @return FAILURE crc type not support.
|
||||
* SUCCESS
|
||||
*
|
||||
******************************************************************************/
|
||||
bool L2_CrcCheck(uint8_t* dataBuff, uint32_t dataLen, uint32_t crcPos, L2_CRC_TYPE crcType){
|
||||
ASSERT(dataBuff != NULL);
|
||||
|
||||
int32_t Status = SUCCESS;
|
||||
uint32_t crcVal = 0;
|
||||
uint32_t crcComp = 0;
|
||||
uint8_t* crcPtr = dataBuff+crcPos;
|
||||
Status = L2_CrcGen(dataBuff,dataLen, crcType, &crcVal);
|
||||
if(Status != SUCCESS){
|
||||
return false;
|
||||
}
|
||||
#ifdef CHUNK_FILL_STYLE_XJY
|
||||
switch (crcType){
|
||||
case L2_CRC16_1021:
|
||||
crcComp = ((uint32_t)(*crcPtr)) << 8;
|
||||
crcComp |= (uint32_t)(*(crcPtr+1));
|
||||
break;
|
||||
case L2_CRC16_8005:
|
||||
crcComp = ((uint32_t)(*crcPtr)) << 8;
|
||||
crcComp |= (uint32_t)(*(crcPtr+1));
|
||||
break;
|
||||
case L2_CRC8_31:
|
||||
crcComp = (uint32_t)(*crcPtr);
|
||||
break;
|
||||
default:
|
||||
Status = EPARAM;
|
||||
break;
|
||||
}
|
||||
#else
|
||||
switch (crcType){
|
||||
case L2_CRC16_1021:
|
||||
crcComp = ((uint32_t)(*(crcPtr+1))) << 8;
|
||||
crcComp |= (uint32_t)(*crcPtr);
|
||||
break;
|
||||
case L2_CRC16_8005:
|
||||
crcComp = ((uint32_t)(*(crcPtr+1))) << 8;
|
||||
crcComp |= (uint32_t)(*crcPtr);
|
||||
break;
|
||||
case L2_CRC8_31:
|
||||
crcComp = (uint32_t)(*crcPtr);
|
||||
break;
|
||||
default:
|
||||
Status = EPARAM;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
if(Status == SUCCESS){
|
||||
// if ( crcVal == 0 )
|
||||
// {
|
||||
// return false ;
|
||||
// }
|
||||
// else
|
||||
if(crcComp == crcVal){
|
||||
return true;
|
||||
}
|
||||
else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else{
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,195 @@
|
||||
//
|
||||
// Copyright (C) 2020 OpenSim Ltd.
|
||||
//
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
//
|
||||
|
||||
#include <math.h>
|
||||
#include "coord.h"
|
||||
|
||||
|
||||
const COORD COORD_NIL = {NAN, NAN, NAN};
|
||||
const COORD COORD_ZERO = {0.0, 0.0, 0.0};
|
||||
const COORD COORD_ONE = {1.0, 1.0, 1.0};
|
||||
const COORD COORD_X_AXIS = {1.0, 0.0, 0.0};
|
||||
const COORD COORD_Y_AXIS = {0.0, 1.0, 0.0};
|
||||
const COORD COORD_Z_AXIS = {0.0, 0.0, 1.0};
|
||||
|
||||
/** @brief Subtracts two coordinate vectors. */
|
||||
COORD Coord_Sub(COORD a, COORD b) {
|
||||
COORD ret;
|
||||
ret.x = a.x - b.x;
|
||||
ret.y = a.y - b.y;
|
||||
ret.z = a.z - b.z;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** @brief Adds two coordinate vectors. */
|
||||
COORD Coord_Add(COORD a, COORD b) {
|
||||
COORD ret;
|
||||
ret.x = a.x + b.x;
|
||||
ret.y = a.y + b.y;
|
||||
ret.z = a.z + b.z;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** @brief Multiplies a coordinate vector by a real number. */
|
||||
void Coord_ScalarMult(COORD *a, double t) {
|
||||
a->x *= t;
|
||||
a->y *= t;
|
||||
a->z *= t;
|
||||
}
|
||||
|
||||
/** @brief Multiplies a coordinate vector by a real number. */
|
||||
COORD Coord_GetScalarMult(COORD a, double t) {
|
||||
COORD ret;
|
||||
ret.x = a.x * t;
|
||||
ret.y = a.y * t;
|
||||
ret.z = a.z * t;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** @brief Divides a coordinate vector by a real number. */
|
||||
void Coord_ScalarDiv(COORD *a, double t) {
|
||||
a->x /= t;
|
||||
a->y /= t;
|
||||
a->z /= t;
|
||||
}
|
||||
|
||||
/** @brief Divides a coordinate vector by a real number. */
|
||||
COORD Coord_GetScalarDiv(COORD a, double t) {
|
||||
COORD ret;
|
||||
ret.x = a.x / t;
|
||||
ret.y = a.y / t;
|
||||
ret.z = a.z / t;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** @brief Dot product. */
|
||||
inline double Coord_Dot(COORD a, COORD b) {
|
||||
return (a.x * b.x + a.y * b.y + a.z * b.z);
|
||||
}
|
||||
|
||||
/** @brief Cross product. */
|
||||
COORD Coord_Cross(COORD a, COORD b) {
|
||||
COORD ret;
|
||||
ret.x = a.y * b.z - a.z * b.y;
|
||||
ret.y = a.z * b.x - a.x * b.z;
|
||||
ret.z = a.x * b.y - a.y * b.x;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** @brief Multiplies two coordinate vector in elementwise. */
|
||||
COORD Coord_ElementwiseMult(COORD a, COORD b) {
|
||||
COORD ret;
|
||||
ret.x = a.x * b.x;
|
||||
ret.y = a.y * b.y;
|
||||
ret.z = a.z * b.z;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** @brief Divides two coordinate vector in elementwise. */
|
||||
COORD Coord_ElementwiseDiv(COORD a, COORD b) {
|
||||
COORD ret;
|
||||
ret.x = a.x / b.x;
|
||||
ret.y = a.y / b.y;
|
||||
ret.z = a.z / b.z;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** @brief Calculate a coordinate vector length^2 (omits calling square root). */
|
||||
double Coord_SquareLength(COORD a) {
|
||||
return (a.x*a.x + a.y*a.y + a.z*a.z);
|
||||
}
|
||||
|
||||
/** @brief Calculate a coordinate vector length. */
|
||||
double Coord_Length(COORD a) {
|
||||
return sqrt(Coord_SquareLength(a));
|
||||
}
|
||||
|
||||
/** @brief Calculate two coordinates' distance. */
|
||||
double Coord_Distance(COORD a, COORD b) {
|
||||
return Coord_Length(Coord_Sub(a, b));
|
||||
}
|
||||
|
||||
/** @brief Normalize coordinate vector. */
|
||||
void Coord_Normalize(COORD *a) {
|
||||
Coord_ScalarDiv(a, Coord_Length(*a));
|
||||
}
|
||||
|
||||
/** @brief Normalize coordinate vector. */
|
||||
COORD Coord_GetNormalized(COORD a) {
|
||||
Coord_Normalize(&a);
|
||||
return a;
|
||||
}
|
||||
|
||||
/** @brief Returns the angle between the two vectors. */
|
||||
double Coord_Angle(COORD a, COORD b) {
|
||||
Coord_Normalize(&a);
|
||||
Coord_Normalize(&b);
|
||||
return acos(Coord_Dot(a, b));
|
||||
}
|
||||
|
||||
|
||||
// Additional Coordinates convert
|
||||
// TODO: Confirm correctness
|
||||
/** @brief Convert coordinate from Launch coordinate system to ECEF. */
|
||||
COORD Coord_Launch2Ecef(COORD o, COORD p, double A, double B, double lambda) {
|
||||
COORD ret;
|
||||
double sinA,cosA, sinB, cosB, sinL, cosL;
|
||||
double S11, S12, S13, S21, S22, S23, S31, S32, S33;
|
||||
sinA = sin(A);
|
||||
cosA = cos(A);
|
||||
sinB = sin(B);
|
||||
cosB = cos(B);
|
||||
sinL = sin(lambda);
|
||||
cosL = cos(lambda);
|
||||
|
||||
S11 = -sinA*sinL - cosA*sinB*cosL;
|
||||
S12 = cosB*cosL;
|
||||
S13 = -cosA*sinL + sinA*sinB*cosL;
|
||||
|
||||
S21 = sinA*cosL - cosA*sinB*sinL;
|
||||
S22 = cosB*sinL;
|
||||
S23 = cosA*cosL + sinA*sinB*sinL;
|
||||
|
||||
S31 = cosA*cosB;
|
||||
S32 = sinB;
|
||||
S33 = -sinA*cosB;
|
||||
|
||||
ret.x = p.x*(S11 + S21 + S31) + o.x;
|
||||
ret.y = p.y*(S12 + S22 + S32) + o.y;
|
||||
ret.z = p.z*(S13 + S23 + S33) + o.z;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** @brief Convert coordinate from launch coordinate system to Inertia coordinate system. */
|
||||
COORD Coord_Launch2Inertia(COORD o, COORD p, double A, double B, double we, double t) {
|
||||
COORD ret;
|
||||
double OmgX, OmgY, OmgZ, sinwet, coswet;
|
||||
double M11, M12, M13, M21, M22, M23, M31, M32, M33;
|
||||
OmgX = cos(A)*cos(B);
|
||||
OmgY = sin(B);
|
||||
OmgZ = -sin(A)*cos(B);
|
||||
sinwet = sin(we*t);
|
||||
coswet = cos(we*t);
|
||||
|
||||
M11 = 1 - (1 - OmgX*OmgX)*(1-coswet);
|
||||
M12 = OmgX*OmgY*(1-coswet) + OmgZ*sinwet;
|
||||
M13 = OmgX*OmgZ*(1-coswet)-OmgY*sinwet;
|
||||
|
||||
M21 = OmgY*OmgX*(1-coswet) - OmgZ*sinwet;
|
||||
M22 = 1-(1-OmgY*OmgY)*(1-coswet);
|
||||
M23 = OmgY*OmgZ*(1-coswet) + OmgX*sinwet;
|
||||
|
||||
M31 = OmgZ*OmgX*(1-coswet) + OmgY*sinwet;
|
||||
M32 = OmgZ*OmgY*(1-coswet) - OmgX*sinwet;
|
||||
M33 = 1 - (1-OmgZ*OmgZ)*(1-coswet);
|
||||
|
||||
ret.x = p.x*(M11 + M21 + M31) + o.x;
|
||||
ret.y = p.y*(M12 + M22 + M32) + o.y;
|
||||
ret.z = p.z*(M13 + M23 + M33) + o.z;
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
//
|
||||
// Copyright (C) 2020 OpenSim Ltd.
|
||||
//
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
//
|
||||
|
||||
|
||||
#ifndef _COORD_H
|
||||
#define _COORD_H
|
||||
|
||||
/**
|
||||
* @brief Structure for storing 3D coordinates.
|
||||
*
|
||||
* Some comparison and basic arithmetic operators are implemented.
|
||||
*
|
||||
* @ingroup utils
|
||||
*/
|
||||
|
||||
typedef struct{
|
||||
double x;
|
||||
double y;
|
||||
double z;
|
||||
} COORD;
|
||||
|
||||
extern const COORD COORD_NIL;
|
||||
extern const COORD COORD_ZERO;
|
||||
extern const COORD COORD_ONE;
|
||||
extern const COORD COORD_X_AXIS;
|
||||
extern const COORD COORD_Y_AXIS;
|
||||
extern const COORD COORD_Z_AXIS;
|
||||
|
||||
/** @brief Subtracts two coordinate vectors. */
|
||||
COORD Coord_Sub(COORD a, COORD b);
|
||||
|
||||
/** @brief Adds two coordinate vectors. */
|
||||
COORD Coord_Add(COORD a, COORD b);
|
||||
|
||||
/** @brief Multiplies a coordinate vector by a real number. */
|
||||
void Coord_ScalarMult(COORD *a, double t);
|
||||
|
||||
/** @brief Multiplies a coordinate vector by a real number. */
|
||||
COORD Coord_GetScalarMult(COORD a, double t);
|
||||
|
||||
/** @brief Divides a coordinate vector by a real number. */
|
||||
void Coord_ScalarDiv(COORD *a, double t);
|
||||
|
||||
/** @brief Divides a coordinate vector by a real number. */
|
||||
COORD Coord_GetScalarDiv(COORD a, double t);
|
||||
|
||||
/** @brief Dot product. */
|
||||
double Coord_Dot(COORD a, COORD b);
|
||||
|
||||
/** @brief Cross product. */
|
||||
COORD Coord_Cross(COORD a, COORD b);
|
||||
|
||||
/** @brief Multiplies two coordinate vector in elementwise. */
|
||||
COORD Coord_ElementwiseMult(COORD a, COORD b);
|
||||
|
||||
/** @brief Divides two coordinate vector in elementwise. */
|
||||
COORD Coord_ElementwiseDiv(COORD a, COORD b);
|
||||
|
||||
/** @brief Calculate a coordinate vector length^2 (omits calling square root). */
|
||||
double Coord_SquareLength(COORD a);
|
||||
|
||||
/** @brief Calculate a coordinate vector length. */
|
||||
double Coord_Length(COORD a);
|
||||
|
||||
/** @brief Calculate two coordinates' distance. */
|
||||
double Coord_Distance(COORD a, COORD b);
|
||||
|
||||
/** @brief Normalize coordinate vector. */
|
||||
void Coord_Normalize(COORD *a);
|
||||
|
||||
/** @brief Normalize coordinate vector. */
|
||||
COORD Coord_GetNormalized(COORD a);
|
||||
|
||||
/** @brief Returns the angle between the two vectors. */
|
||||
double Coord_Angle(COORD a, COORD b);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
//
|
||||
// Copyright (C) 2020 OpenSim Ltd.
|
||||
//
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
//
|
||||
|
||||
#include <math.h>
|
||||
#include "eulerangles.h"
|
||||
|
||||
|
||||
const EULERANGLES EULERANGLES_NIL = {NAN, NAN, NAN};
|
||||
const EULERANGLES EULERANGLES_ZERO = {0.0, 0.0, 0.0};
|
||||
|
||||
|
||||
/** @brief Add two EulerAngles. */
|
||||
EULERANGLES EulerAngles_Add(EULERANGLES e1, EULERANGLES e2) {
|
||||
EULERANGLES ret;
|
||||
ret.alpha = e1.alpha + e2.alpha;
|
||||
ret.beta = e1.beta + e2.beta ;
|
||||
ret.gamma = e1.gamma + e2.gamma;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** @brief Subtracts two EulerAngles. */
|
||||
EULERANGLES EulerAngles_Sub(EULERANGLES e1, EULERANGLES e2) {
|
||||
EULERANGLES ret;
|
||||
ret.alpha = e1.alpha - e2.alpha;
|
||||
ret.beta = e1.beta - e2.beta ;
|
||||
ret.gamma = e1.gamma - e2.gamma;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** @brief Multiplies EulerAngles by a real number. */
|
||||
void EulerAngles_ScalarMult(EULERANGLES *e, double f) {
|
||||
e->alpha *= f;
|
||||
e->beta *= f;
|
||||
e->gamma *= f;
|
||||
}
|
||||
|
||||
/** @brief Multiplies EulerAngles by a real number. */
|
||||
EULERANGLES EulerAngles_GetScalarMult(EULERANGLES e, double f) {
|
||||
EulerAngles_ScalarMult(&e, f);
|
||||
return e;
|
||||
}
|
||||
|
||||
/** @brief Normalize EulerAngles. */
|
||||
void EulerAngles_Normalize(EULERANGLES *e) {
|
||||
e->alpha = fmod(e->alpha, 2*EUL_PI);
|
||||
e->beta = fmod(e->beta , 2*EUL_PI);
|
||||
e->gamma = fmod(e->gamma, 2*EUL_PI);
|
||||
}
|
||||
|
||||
/** @brief Normalize EulerAngles. */
|
||||
EULERANGLES EulerAngles_GetNormalize(EULERANGLES e) {
|
||||
EulerAngles_Normalize(&e);
|
||||
return e;
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
#ifndef __EULERANGLES_H
|
||||
#define __EULERANGLES_H
|
||||
|
||||
#define EUL_PI 3.14159265358979323846
|
||||
|
||||
#define DEG2RAD(d) ((EUL_PI/180.0)*d)
|
||||
#define RAD2DEG(r) ((180.0/EUL_PI)*r)
|
||||
|
||||
/**
|
||||
* Orientations are represented by 3D double precision Tait-Bryan (Euler) tuples
|
||||
* called EulerAngles. The angles are in Z, Y', X" order that is often called
|
||||
* intrinsic rotations, they are measured in radians. The default (unrotated)
|
||||
* orientation is along the X axis. Conceptually, the Z axis rotation is heading,
|
||||
* the Y' axis rotation is descending (negative elevation), the X" axis rotation is bank.
|
||||
* For example, positive rotation along the Z axis rotates X into Y (turns left), positive
|
||||
* rotation along the Y axis rotates Z into X (leans forward), positive rotation
|
||||
* along the X axis rotates Y into Z (leans right).
|
||||
*/
|
||||
typedef struct {
|
||||
double alpha; // unit rad
|
||||
double beta; // unit rad
|
||||
double gamma; // unit rad
|
||||
} EULERANGLES;
|
||||
|
||||
typedef enum {
|
||||
EULERANGLES_NONE = 0,
|
||||
EULERANGLES_ZYX = 1,
|
||||
EULERANGLES_ZYZ = 2,
|
||||
EULERANGLES_XYZ = 3,
|
||||
}EULERANGLES_TYPE;
|
||||
|
||||
extern const EULERANGLES EULERANGLES_ZERO;
|
||||
extern const EULERANGLES EULERANGLES_NIL;
|
||||
|
||||
/** @brief Add two EulerAngles. */
|
||||
EULERANGLES EulerAngles_Add(EULERANGLES e1, EULERANGLES e2);
|
||||
|
||||
/** @brief Subtracts two EulerAngles. */
|
||||
EULERANGLES EulerAngles_Sub(EULERANGLES e1, EULERANGLES e2);
|
||||
|
||||
/** @brief Multiplies EulerAngles by a real number. */
|
||||
void EulerAngles_ScalarMult(EULERANGLES *e, double f);
|
||||
|
||||
/** @brief Multiplies EulerAngles by a real number. */
|
||||
EULERANGLES EulerAngles_GetScalarMult(EULERANGLES e, double f);
|
||||
|
||||
/** @brief Normalize EulerAngles. */
|
||||
void EulerAngles_Normalize(EULERANGLES *e);
|
||||
|
||||
/** @brief Normalize EulerAngles. */
|
||||
EULERANGLES EulerAngles_GetNormalize(EULERANGLES e);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,413 @@
|
||||
//
|
||||
// Copyright (C) 2014 OpenSim Ltd.
|
||||
//
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
//
|
||||
|
||||
#include <math.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "coord.h"
|
||||
#include "eulerangles.h"
|
||||
#include "quaternion.h"
|
||||
|
||||
typedef union {
|
||||
float value;
|
||||
uint32_t raw;
|
||||
} SOFT_FLOAT;
|
||||
|
||||
typedef union {
|
||||
double value;
|
||||
uint64_t raw;
|
||||
} SOFT_DOUBLE;
|
||||
|
||||
const SOFT_FLOAT EPS_FLOAT = {.raw = 0x34000000};
|
||||
const SOFT_DOUBLE EPS_DOUBLE = {.raw = 0x3CB0000000000000};
|
||||
|
||||
const QUATERNION QUATERNION_IDENTITY = {1.0, 0.0, 0.0 ,0.0};
|
||||
const QUATERNION QUATERNION_NIL = {NAN, NAN, NAN, NAN};
|
||||
/** @brief Subtracts two quaternions. */
|
||||
QUATERNION Quaternion_Sub(QUATERNION q1, QUATERNION q2) {
|
||||
QUATERNION ret;
|
||||
ret.s = q1.s - q2.s;
|
||||
ret.i = q1.i - q2.i;
|
||||
ret.j = q1.j - q2.j;
|
||||
ret.k = q1.k - q2.k;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** @brief Adds two quaternions. */
|
||||
QUATERNION Quaternion_Add(QUATERNION q1, QUATERNION q2) {
|
||||
QUATERNION ret;
|
||||
ret.s = q1.s + q2.s;
|
||||
ret.i = q1.i + q2.i;
|
||||
ret.j = q1.j + q2.j;
|
||||
ret.k = q1.k + q2.k;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** @brief Multiplies a quaternion by a real number. */
|
||||
void Quaternion_ScalarMult(QUATERNION *q, double t) {
|
||||
q->s *= t;
|
||||
q->i *= t;
|
||||
q->j *= t;
|
||||
q->k *= t;
|
||||
}
|
||||
|
||||
/** @brief Multiplies a quaternion by a real number. */
|
||||
QUATERNION Quaternion_GetScalarMult(QUATERNION a, double t) {
|
||||
Quaternion_ScalarMult(&a, t);
|
||||
return a;
|
||||
}
|
||||
|
||||
/** @brief Divides a quaternion by a real number. */
|
||||
void Quaternion_ScalarDiv(QUATERNION *q, double t) {
|
||||
q->s /= t;
|
||||
q->i /= t;
|
||||
q->j /= t;
|
||||
q->k /= t;
|
||||
}
|
||||
|
||||
/** @brief Divides a quaternion by a real number. */
|
||||
QUATERNION Quaternion_GetScalarDiv(QUATERNION q, double t) {
|
||||
Quaternion_ScalarDiv(&q, t);
|
||||
return q;
|
||||
}
|
||||
|
||||
/** @brief Multiplies two quaternions. */
|
||||
QUATERNION Quaternion_Mult(QUATERNION q1, QUATERNION q2) {
|
||||
QUATERNION ret;
|
||||
ret.s = q1.s * q2.s - (q1.i*q2.i + q1.j*q2.j + q1.k*q2.k);
|
||||
ret.i = q1.j * q2.k - q1.k * q2.j + q1.s * q2.i + q1.i * q2.s;
|
||||
ret.j = q1.k * q2.i - q1.i * q2.k + q1.s * q2.j + q1.j * q2.s;
|
||||
ret.k = q1.i * q2.j - q1.j * q2.i + q1.s * q2.k + q1.k * q2.s;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** @brief Divides two quaternions. */
|
||||
QUATERNION Quaternion_Div(QUATERNION q1, QUATERNION q2) {
|
||||
Quaternion_Inverse(&q2);
|
||||
return Quaternion_Mult(q1, q2);
|
||||
}
|
||||
|
||||
/** @brief Dot product. */
|
||||
inline double Quaternion_Dot(QUATERNION q1, QUATERNION q2) {
|
||||
return (q1.s*q2.s + q1.i*q2.i + q1.j*q2.j + q1.k*q2.k);
|
||||
}
|
||||
|
||||
/** @brief Calculate a quaternion length^2 (omits calling square root). */
|
||||
inline double Quaternion_SquareLength(QUATERNION q) {
|
||||
return (q.s*q.s + q.i*q.i + q.j*q.j + q.k*q.k);
|
||||
}
|
||||
|
||||
/** @brief Calculate a quaternion length. */
|
||||
inline double Quaternion_Length(QUATERNION q) {
|
||||
return sqrt(Quaternion_SquareLength(q));
|
||||
}
|
||||
|
||||
/** @brief Normalize quaternion. */
|
||||
void Quaternion_Normalize(QUATERNION *q) {
|
||||
Quaternion_ScalarDiv(q, Quaternion_Length(*q));
|
||||
}
|
||||
|
||||
/** @brief Normalize quaternion. */
|
||||
QUATERNION Quaternion_GetNormalized(QUATERNION q) {
|
||||
Quaternion_Normalize(&q);
|
||||
return q;
|
||||
}
|
||||
|
||||
/** @brief Conjugated quaternion. */
|
||||
void Quaternion_Conjugated(QUATERNION *q) {
|
||||
q->i = -q->i;
|
||||
q->j = -q->j;
|
||||
q->k = -q->k;
|
||||
}
|
||||
|
||||
/** @brief Conjugated quaternion. */
|
||||
QUATERNION Quaternion_GetConjugated(QUATERNION q) {
|
||||
Quaternion_Conjugated(&q);
|
||||
return q;
|
||||
}
|
||||
|
||||
/** @brief Inverse quaternion. */
|
||||
void Quaternion_Inverse(QUATERNION *q) {
|
||||
Quaternion_Conjugated(q);
|
||||
Quaternion_ScalarDiv(q, Quaternion_SquareLength(*q));
|
||||
}
|
||||
|
||||
/** @brief Inverse quaternion. */
|
||||
QUATERNION Quaternion_GeInverse(QUATERNION q) {
|
||||
Quaternion_Inverse(&q);
|
||||
return q;
|
||||
}
|
||||
|
||||
inline double Quaternion_GetRotationAngle(QUATERNION q) {
|
||||
return (acos(q.s) * 2);
|
||||
}
|
||||
|
||||
|
||||
/** @brief Get axis of quaternion. */
|
||||
COORD Quaternion_GetRotationAxis(QUATERNION q) {
|
||||
double sin_theta_inv;
|
||||
COORD ret;
|
||||
sin_theta_inv = 1.0 / sin(acos(q.s));
|
||||
ret.x = q.i * sin_theta_inv;
|
||||
ret.y = q.j * sin_theta_inv;
|
||||
ret.z = q.k * sin_theta_inv;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** @brief Get the axis and rotate angle of a unit Quaternion */
|
||||
void Quaternion_GetRotationAxisAndAngle(QUATERNION q, COORD *axis, double *angle) {
|
||||
double sin_theta_inv;
|
||||
*angle = acos(q.s);
|
||||
|
||||
// pre-compute to save time
|
||||
sin_theta_inv = 1.0 / sin(*angle);
|
||||
|
||||
// now the vector
|
||||
axis->x = q.i * sin_theta_inv;
|
||||
axis->y = q.j * sin_theta_inv;
|
||||
axis->z = q.k * sin_theta_inv;
|
||||
*angle = (*angle) * 2;
|
||||
}
|
||||
|
||||
/** @brief Decompose the rotation on to 2 parts. */
|
||||
void Quaternion_GetSwingAndTwist(QUATERNION q, COORD axis, QUATERNION *swing, QUATERNION *twist) {
|
||||
double p;
|
||||
COORD v;
|
||||
v.x = q.i;
|
||||
v.y = q.j;
|
||||
v.z = q.k;
|
||||
// return projection v1 on to v2 (parallel component)
|
||||
p = Coord_Dot(v, axis);
|
||||
v = Coord_GetScalarMult(axis, p);
|
||||
twist->s = q.s;
|
||||
twist->i = v.x;
|
||||
twist->j = v.y;
|
||||
twist->k = v.z;
|
||||
Quaternion_Normalize(twist);
|
||||
*swing = Quaternion_Mult(q, Quaternion_GetConjugated(*twist));
|
||||
}
|
||||
|
||||
/** @brief rotates v by this quaternion (quaternion must be unit) */
|
||||
COORD Quaternion_Rotate(QUATERNION q, COORD v) {
|
||||
QUATERNION temp;
|
||||
COORD ret;
|
||||
temp.s = 0;
|
||||
temp.i = v.x;
|
||||
temp.j = v.y;
|
||||
temp.k = v.z;
|
||||
temp = Quaternion_Mult(q,temp);
|
||||
Quaternion_Conjugated(&q);
|
||||
temp = Quaternion_Mult(temp,q);
|
||||
ret.x = temp.i;
|
||||
ret.y = temp.j;
|
||||
ret.z = temp.k;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** @brief returns the euler angles from a rotation Quaternion */
|
||||
EULERANGLES Quaternion_ToEulerAngles(QUATERNION q, EULERANGLES_TYPE type) {
|
||||
EULERANGLES ret;
|
||||
switch (type) {
|
||||
case EULERANGLES_ZYX : {
|
||||
/* Covert form matlab 2023a */
|
||||
// Cap all inputs to asin to 1, since values >1 produce complex
|
||||
// results
|
||||
// Since the quaternion is of unit length, this should never happen,
|
||||
// but some code generation configuration seem to hit this edge case
|
||||
// under some circumstances.
|
||||
|
||||
double asinValue;
|
||||
bool mask1, mask2;
|
||||
|
||||
asinValue = -2.0 *(q.i*q.k - q.s*q.j);
|
||||
mask1 = asinValue >= 1.0 - 10*EPS_DOUBLE.value;
|
||||
mask2 = asinValue <= -1.0 + 10*EPS_DOUBLE.value;
|
||||
if (mask1)
|
||||
asinValue = 1;
|
||||
if (mask2)
|
||||
asinValue = -1;
|
||||
|
||||
if(mask1 || mask2) {
|
||||
ret.alpha = (asinValue > 0) ? (-2.0 * atan2(q.i, q.s)) : (2.0 * atan2(q.i, q.s));
|
||||
ret.gamma = 0;
|
||||
}
|
||||
else {
|
||||
ret.alpha = atan2(2.0*(q.i*q.j + q.s*q.k), q.s*q.s + q.i*q.i - q.j*q.j - q.k*q.k);
|
||||
ret.gamma = atan2(2.0*(q.j*q.k + q.s*q.i), q.s*q.s - q.i*q.i - q.j*q.j + q.k*q.k);
|
||||
}
|
||||
ret.beta = asin( asinValue );
|
||||
break;
|
||||
}
|
||||
|
||||
case EULERANGLES_ZYZ : {
|
||||
// TODO;
|
||||
ret = EULERANGLES_NIL;
|
||||
break;
|
||||
}
|
||||
|
||||
case EULERANGLES_XYZ : {
|
||||
/* Covert form matlab 2023a */
|
||||
// Prevent singularities as done in ZYX case
|
||||
// Alternative to rotm2eul(quat2rotm(q), 'XYZ') with fewer
|
||||
// operations
|
||||
// sin(y) = R13 = 2 * (qx*qz + qy*qw)
|
||||
// tan(x) = sin(x) / cos(x) = -R23 / R33
|
||||
// = -2 * (qy*qz - qx*qw) / (1 - 2*(qx^2 + qy^2))
|
||||
// = -2 * (qy*qz - qx*qw) / (qw^2 - qx^2 - qy^2 + qz^2)
|
||||
// tan(z) = sin(z) / cos(z) = -R12 / R11
|
||||
// = -2 * (qx*qy - qz*qw) / (1 - 2*(qy^2 + qz^2))
|
||||
// = -2 * (qy*qz - qx*qw) / (qw^2 + qx^2 - qy^2 - qz^2)
|
||||
|
||||
double asinValue;
|
||||
bool mask1, mask2;
|
||||
|
||||
asinValue = 2.0 *(q.i*q.k + q.s*q.j);
|
||||
mask1 = asinValue >= 1.0 - 10*EPS_DOUBLE.value;
|
||||
mask2 = asinValue <= -1.0 + 10*EPS_DOUBLE.value;
|
||||
if (mask1)
|
||||
asinValue = 1;
|
||||
if (mask2)
|
||||
asinValue = -1;
|
||||
if(mask1 || mask2) {
|
||||
ret.alpha = 0;
|
||||
ret.gamma = (asinValue > 0) ? (2.0 * atan2(q.i, q.s)) : (-2.0 * atan2(q.i, q.s));
|
||||
}
|
||||
else {
|
||||
ret.alpha = atan2(-2.0*(q.j*q.k - q.s*q.i), q.s*q.s - q.i*q.i - q.j*q.j + q.k*q.k);
|
||||
ret.gamma = atan2(-2.0*(q.i*q.j - q.s*q.k), q.s*q.s + q.i*q.i - q.j*q.j - q.k*q.k);
|
||||
}
|
||||
ret.beta = asin( asinValue );
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
default:
|
||||
ret = EULERANGLES_NIL;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** @brief returns the rotation Quaternion from a euler angles */
|
||||
QUATERNION Quaternion_FromeEulerAngles(EULERANGLES e, EULERANGLES_TYPE type) {
|
||||
QUATERNION ret;
|
||||
double cosx, sinx, cosy, siny, cosz, sinz;
|
||||
cosx = cos(e.alpha * 0.5);
|
||||
sinx = sin(e.alpha * 0.5);
|
||||
cosy = cos(e.beta * 0.5);
|
||||
siny = sin(e.beta * 0.5);
|
||||
cosz = cos(e.gamma * 0.5);
|
||||
sinz = sin(e.gamma * 0.5);
|
||||
switch (type) {
|
||||
case EULERANGLES_ZYX :
|
||||
ret.s = cosx * cosy * cosz + sinx * siny * sinz;
|
||||
ret.i = cosx * cosy * sinz - sinx * siny * cosz;
|
||||
ret.j = cosx * siny * cosz + sinx * cosy * sinz;
|
||||
ret.k = sinx * cosy * cosz - cosx * siny * sinz;
|
||||
break;
|
||||
case EULERANGLES_ZYZ :
|
||||
ret.s = cosx * cosy * cosz - sinx * cosy * sinz;
|
||||
ret.i = cosx * siny * sinz - sinx * siny * cosz;
|
||||
ret.j = cosx * siny * cosz + sinx * siny * sinz;
|
||||
ret.k = sinx * cosy * cosz + cosx * cosy * sinz;
|
||||
break;
|
||||
case EULERANGLES_XYZ :
|
||||
ret.s = cosx * cosy * cosz - sinx * siny * sinz;
|
||||
ret.i = sinx * cosy * cosz + cosx * siny * sinz;
|
||||
ret.j = -sinx * cosy * sinz + cosx * siny * cosz;
|
||||
ret.k = cosx * cosy * sinz + sinx * siny * cosz;
|
||||
break;
|
||||
default:
|
||||
ret = QUATERNION_NIL;
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** @brief adapted from https://svn.code.sf.net/p/irrlicht/code/trunk/include/quaternion.h */
|
||||
QUATERNION Quaternion_RotationFromTo(COORD from, COORD to)
|
||||
{
|
||||
// Based on Stan Melax's article in Game Programming Gems
|
||||
COORD axis;
|
||||
QUATERNION ret;
|
||||
double c, s;
|
||||
Coord_Normalize(&from);
|
||||
Coord_Normalize(&to);
|
||||
|
||||
c = Coord_Dot(from, to);
|
||||
|
||||
if (c >= 1.0) { // If dot == 1, vectors are the same
|
||||
return QUATERNION_IDENTITY; // identity
|
||||
}
|
||||
else if (c <= -1.0) { // exactly opposite
|
||||
axis = Coord_Cross(COORD_X_AXIS, from);
|
||||
|
||||
if (Coord_Length(axis) == 0)
|
||||
axis = Coord_Cross(COORD_Y_AXIS, from);
|
||||
|
||||
// same as fromAxisAngle(axis, PI).normalize();
|
||||
ret.s = 0;
|
||||
ret.i = axis.x;
|
||||
ret.j = axis.y;
|
||||
ret.k = axis.z;
|
||||
Quaternion_Normalize(&ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
s = sqrt((1 + c) * 2);
|
||||
axis = Coord_Cross(from, to);
|
||||
Coord_ScalarDiv(&axis, s);
|
||||
ret.s = s * 0.5;
|
||||
ret.i = axis.x;
|
||||
ret.j = axis.y;
|
||||
ret.k = axis.z;
|
||||
Quaternion_Normalize(&ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/** @brief linear quaternion interpolation */
|
||||
QUATERNION Quaternion_Lerp(QUATERNION q1, QUATERNION q2, double t) {
|
||||
QUATERNION ret;
|
||||
Quaternion_ScalarMult(&q1, 1 - t);
|
||||
Quaternion_ScalarMult(&q1, t);
|
||||
ret = Quaternion_Add(q1, q2);
|
||||
Quaternion_Normalize(&ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/** @brief spherical linear interpolation */
|
||||
QUATERNION Quaternion_Slerp(QUATERNION q1, QUATERNION q2, double t) {
|
||||
double dot;
|
||||
QUATERNION q3, ret;
|
||||
dot = Quaternion_Dot(q1, q2);
|
||||
/* dot = cos(theta)
|
||||
if (dot < 0), q1 and q2 are more than 90 degrees apart,
|
||||
so we can invert one to reduce spinning */
|
||||
if (dot < 0) {
|
||||
dot = -dot;
|
||||
q3.s = -q2.s;
|
||||
q3.i = -q2.i;
|
||||
q3.j = -q2.j;
|
||||
q3.k = -q2.k;
|
||||
}
|
||||
else {
|
||||
q3 = q2;
|
||||
}
|
||||
|
||||
if (dot < 0.95) {
|
||||
double angle = acos(dot);
|
||||
Quaternion_ScalarMult(&q1, sin(angle * (1 - t)));
|
||||
Quaternion_ScalarMult(&q3, sin(angle * t));
|
||||
ret = Quaternion_Add(q1, q3);
|
||||
Quaternion_ScalarDiv(&ret, sin(angle));
|
||||
return ret;
|
||||
}
|
||||
// if the angle is small, use linear interpolation
|
||||
else {
|
||||
return Quaternion_Lerp(q1, q3, t);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
|
||||
#ifndef __QUATERNION_H
|
||||
#define __QUATERNION_H
|
||||
|
||||
#include "coord.h"
|
||||
#include "eulerangles.h"
|
||||
|
||||
// borrowed and adapted from https://github.com/MegaManSE/willperone/blob/master/Math/quaternion.h
|
||||
typedef struct {
|
||||
double s;
|
||||
double i;
|
||||
double j;
|
||||
double k;
|
||||
} QUATERNION;
|
||||
|
||||
extern const QUATERNION QUATERNION_IDENTITY;
|
||||
extern const QUATERNION QUATERNION_NIL;
|
||||
|
||||
/** @brief Subtracts two quaternions. */
|
||||
QUATERNION Quaternion_Sub(QUATERNION q1, QUATERNION q2);
|
||||
|
||||
/** @brief Adds two quaternions. */
|
||||
QUATERNION Quaternion_Add(QUATERNION q1, QUATERNION q2);
|
||||
|
||||
/** @brief Multiplies a quaternion by a real number. */
|
||||
void Quaternion_ScalarMult(QUATERNION *q, double t);
|
||||
|
||||
/** @brief Multiplies a quaternion by a real number. */
|
||||
QUATERNION Quaternion_GetScalarMult(QUATERNION a, double t);
|
||||
|
||||
/** @brief Divides a quaternion by a real number. */
|
||||
void Quaternion_ScalarDiv(QUATERNION *q, double t);
|
||||
|
||||
/** @brief Divides a quaternion by a real number. */
|
||||
QUATERNION Quaternion_GetScalarDiv(QUATERNION a, double t);
|
||||
|
||||
/** @brief Multiplies two quaternions. */
|
||||
QUATERNION Quaternion_Mult(QUATERNION q1, QUATERNION q2);
|
||||
|
||||
/** @brief Divides two quaternions. */
|
||||
QUATERNION Quaternion_Div(QUATERNION q1, QUATERNION q2);
|
||||
|
||||
/** @brief Dot product. */
|
||||
double Quaternion_Dot(QUATERNION q1, QUATERNION q2);
|
||||
|
||||
/** @brief Calculate a quaternion length^2 (omits calling square root). */
|
||||
double Quaternion_SquareLength(QUATERNION q);
|
||||
|
||||
/** @brief Calculate a quaternion length. */
|
||||
double Quaternion_Length(QUATERNION q);
|
||||
|
||||
/** @brief Normalize quaternion. */
|
||||
void Quaternion_Normalize(QUATERNION *q);
|
||||
|
||||
/** @brief Normalize quaternion. */
|
||||
QUATERNION Quaternion_GetNormalized(QUATERNION q);
|
||||
|
||||
/** @brief Conjugated quaternion. */
|
||||
void Quaternion_Conjugated(QUATERNION *q);
|
||||
|
||||
/** @brief Conjugated quaternion. */
|
||||
QUATERNION Quaternion_GetConjugated(QUATERNION q);
|
||||
|
||||
/** @brief Inverse quaternion. */
|
||||
void Quaternion_Inverse(QUATERNION *q);
|
||||
|
||||
/** @brief Inverse quaternion. */
|
||||
QUATERNION Quaternion_GeInverse(QUATERNION q);
|
||||
|
||||
/** @brief Get rotate angle of quaternion. */
|
||||
double Quaternion_GetRotationAngle(QUATERNION q);
|
||||
|
||||
/** @brief Get axis of quaternion. */
|
||||
COORD Quaternion_GetRotationAxis(QUATERNION q);
|
||||
|
||||
/** @brief Get the axis and rotate angle of a unit Quaternion */
|
||||
void Quaternion_GetRotationAxisAndAngle(QUATERNION q, COORD *axis, double *angle);
|
||||
|
||||
/** @brief Decompose the rotation on to 2 parts.
|
||||
1. Twist - rotation around the "direction" vector
|
||||
2. Swing - rotation around axis that is perpendicular to "direction" vector
|
||||
The rotation can be composed back by rotation = swing * twist
|
||||
|
||||
has singularity in case of swing_rotation close to 180 degrees rotation.
|
||||
if the input quaternion is of non-unit length, the outputs are non-unit as well
|
||||
otherwise, outputs are both unit
|
||||
*/
|
||||
void Quaternion_GetSwingAndTwist(QUATERNION q, COORD axis, QUATERNION *swing, QUATERNION *twist);
|
||||
|
||||
/** @brief rotates v by this quaternion (quaternion must be unit) */
|
||||
COORD Quaternion_Rotate(QUATERNION q, COORD v);
|
||||
|
||||
/** @brief returns the euler angles from a rotation Quaternion */
|
||||
EULERANGLES Quaternion_ToEulerAngles(QUATERNION q, EULERANGLES_TYPE type);
|
||||
|
||||
/** @brief returns the rotation Quaternion from a euler angles */
|
||||
QUATERNION Quaternion_FromeEulerAngles(EULERANGLES e, EULERANGLES_TYPE type);
|
||||
|
||||
/** @brief adapted from https://svn.code.sf.net/p/irrlicht/code/trunk/include/quaternion.h */
|
||||
QUATERNION Quaternion_RotationFromTo(COORD from, COORD to);
|
||||
|
||||
/** @brief linear quaternion interpolation */
|
||||
QUATERNION Quaternion_Lerp(QUATERNION q1, QUATERNION q2, double t);
|
||||
|
||||
/** @brief spherical linear interpolation */
|
||||
QUATERNION Quaternion_Slerp(QUATERNION q1, QUATERNION q2, double t);
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,179 @@
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* Description: Header file for 814 linklayer functions
|
||||
*
|
||||
* Date: 2021-11-13 13:33
|
||||
* LastEditors: Fan Hao
|
||||
* LastEditTime: 2022-07-16 10:12
|
||||
* Revisions: Rev 0.1
|
||||
* History:
|
||||
* [2022-07-16]: New branch for DiJian.
|
||||
* [2021-11-23]: Initial version.
|
||||
*
|
||||
* Copyright(c) 2021 Beijing Institute of Technology.
|
||||
* Lab of Communication and Networking
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef LINKLAYER814_H_
|
||||
#define LINKLAYER814_H_
|
||||
|
||||
/***************************** Include Files *********************************/
|
||||
#include <stdint.h>
|
||||
#include "linklayer814_types.h"
|
||||
#include "node_list.h"
|
||||
#include "rtt.h"
|
||||
#include "../bit_array/bit_array.h"
|
||||
#include "../phy_ctrl/phy_ctrl.h"
|
||||
#include "../time_ctrl/time_ctrl.h"
|
||||
|
||||
|
||||
|
||||
/************************** Constant Definitions *****************************/
|
||||
#define DATA_STORE_INTERVAL 100 // 250ms
|
||||
|
||||
#define NET_INI_STAGE 0
|
||||
#define NET_NORMAL_STAGE 1
|
||||
#define NET_INTER_SEEK_STAGE 2
|
||||
#define NET_INTRA_SEEK_STAGE 3
|
||||
#define NET_SEEK_STAGE 4
|
||||
#define NET_ERROR_STAGE -1
|
||||
|
||||
#define L2_PACKET_LEN_MAX 1024 //bit
|
||||
/***************** Macros (Inline Functions) Definitions *********************/
|
||||
#define AssertL2Event(instPtr, event) Linklayer_EventHandler(instPtr, event)
|
||||
/**************************** Type Definitions *******************************/
|
||||
|
||||
typedef struct {
|
||||
L2_NODE_TYPE myType;
|
||||
bool isInterHead;
|
||||
uint8_t clustId;
|
||||
uint8_t myId;
|
||||
uint8_t headId;
|
||||
uint8_t bkpHeadId;
|
||||
uint8_t netScale;
|
||||
PHY_INST* phyInstPtr;
|
||||
TIMECTRL_INST* tmcInstPtr;
|
||||
} L2_CONFIG;
|
||||
|
||||
typedef struct {
|
||||
L2_CONFIG config;
|
||||
L2_NODE_INFO myInfo;
|
||||
NODE_LIST* nodeList;
|
||||
L2_SCHD_EVENT* l2SchdEventPool[L2_SCHD_EVENT_MAX];
|
||||
uint32_t schdEventCnt;
|
||||
uint32_t netStartTime;
|
||||
bool isEnable; // if the node is connected to the network
|
||||
bool dataAvail; // if there is a valid received frame data in rx buffer
|
||||
bool cxn2Net; // if the node is connected to the network
|
||||
L2_RCD frameNum; // stores the last current and next frame number.
|
||||
L2_RCD slotNum; // stores the last current and next slot number.
|
||||
L2_RCD frame; // stores the last current and next link layer frame type.
|
||||
L2_NODE_STATE mainState; // the main state of link layer state
|
||||
L2_NODE_STATE nextState; // next state of link layer state, which will be applied to mainState every second.
|
||||
L2_RTNE_CONFIG rtneConfig; // current routine table configuration and status.
|
||||
L2_SCAN_FSM* scanNetFSM; // FSM of scan net (link set up)
|
||||
L2_MGMT_FSM* mgmtNetFSM; // FSM of management net (link management and time sync)
|
||||
L2_SVC_FSM* serviceNetFSM; // FSM of service net (data service)
|
||||
L2_RTT_FSM* rttFSM; // FSM for RTT (time sync algorithm)
|
||||
uint8_t* sendPktData;
|
||||
uint8_t* recvPktData;
|
||||
// for MPC
|
||||
uint8_t buffSwitch;
|
||||
uint8_t mgmtMsgRecvCnt0;
|
||||
uint8_t svcMsgRecvCnt0;
|
||||
uint8_t* mgmtMsgRecvBuff0; // mgmtMsg receive data buffer
|
||||
uint8_t* svcMsgRecvBuff0; // svc receive data buffer
|
||||
uint8_t mgmtMsgRecvCnt1;
|
||||
uint8_t svcMsgRecvCnt1;
|
||||
uint8_t* mgmtMsgRecvBuff1; // mgmtMsg receive data buffer
|
||||
uint8_t* svcMsgRecvBuff1; // svc receive data buffer
|
||||
} L2_INST;
|
||||
|
||||
/************************** Variable Definitions *****************************/
|
||||
extern L2_RTNE_TABLE_ENTRY* initTable[L2_INIT_RTNE_PERIOD];
|
||||
extern L2_RTNE_TABLE_ENTRY* seekTable[L2_SEEK_RTNE_PERIOD];
|
||||
extern L2_RTNE_TABLE_ENTRY* interSeekTable[L2_NORMAL_RTNE_PERIOD];
|
||||
extern L2_RTNE_TABLE_ENTRY* intraSeekTable[L2_NORMAL_RTNE_PERIOD];
|
||||
extern L2_RTNE_TABLE_ENTRY* normalTable[L2_NORMAL_RTNE_PERIOD];
|
||||
/************************** Function Prototypes ******************************/
|
||||
// Main
|
||||
int32_t Linklayer_Init(L2_INST** instPtr, const L2_CONFIG *config);
|
||||
int32_t Linklayer_Reconfig(L2_INST* instPtr, const L2_CONFIG *config);
|
||||
void Linklayer_Destroy(L2_INST* instPtr);
|
||||
int32_t Linklayer_Start(L2_INST* instPtr);
|
||||
int32_t Linklayer_Halt(L2_INST* instPtr);
|
||||
int32_t Linklayer_Proc(L2_INST* instPtr);
|
||||
int32_t Linklayer_EventHandler(L2_INST* instPtr, const L2_EVENT* l2Event);
|
||||
int32_t Linklayer_PktHandler(L2_INST* instPtr, L2_FRAME_TYPE frameType);
|
||||
int32_t L2_SetupNextSlot(L2_INST* instPtr, L2_TOR_TYPE txrxMode, L2_FRAME_TYPE frameType);
|
||||
|
||||
// Event
|
||||
bool L2_isEventScheduled(L2_SCHD_EVENT* schdEvent);
|
||||
int32_t L2_CancelEvent(L2_SCHD_EVENT* schdEvent);
|
||||
int32_t L2_SchdEventAppendMsg(L2_SCHD_EVENT* schdEvent, void* msg);
|
||||
L2_SCHD_EVENT* L2_CreatNewSchdEvent(L2_INST* instPtr, L2_EVENT_TYPE event);
|
||||
int32_t L2_DeletSchdEvent(L2_INST* instPtr, int32_t eventId);
|
||||
void L2_ClearSchdEvent(L2_INST* instPtr);
|
||||
int32_t L2_ScheduleEventAt(L2_INST* instPtr, L2_SCHD_EVENT* schdEvent, uint32_t frameNo, uint32_t slotNo);
|
||||
int32_t L2_ScheduleEventAfter(L2_INST* instPtr, L2_SCHD_EVENT* schdEvent, uint32_t numSlots);
|
||||
int32_t L2_RecheduleEventAt(L2_INST* instPtr, L2_SCHD_EVENT* schdEvent, uint32_t frameNo, uint32_t slotNo);
|
||||
int32_t L2_RecheduleEventAfter(L2_INST* instPtr, L2_SCHD_EVENT* schdEvent, uint32_t numSlots);
|
||||
|
||||
// Framing
|
||||
void L2_FrameStateUpdate(L2_INST* instPtr);
|
||||
L2_FRAME_TYPE L2_GetLastRcvFrameType(L2_INST* instPtr);
|
||||
L1_FRAME_TYPE L2_L2frame2L1frame(L2_FRAME_TYPE l2Frame);
|
||||
void FrameGetChunk(BIT_ARRAY* bitarr, uint32_t offset, uint32_t numBit, uint64_t* chunk);
|
||||
void FrameInsertChunk(BIT_ARRAY* bitarr, uint32_t offset, uint32_t numBit, uint64_t chunck);
|
||||
int32_t L2_CrcAppend(uint8_t* dataBuff, uint32_t dataLen, uint32_t crcPos, L2_CRC_TYPE crcType);
|
||||
bool L2_CrcCheck(uint8_t* dataBuff, uint32_t dataLen, uint32_t crcPos, L2_CRC_TYPE crcType);
|
||||
|
||||
// Scan Net
|
||||
int32_t ScanNet_Init(L2_SCAN_FSM** scanFSMPtr);
|
||||
void ScanNet_Reset(L2_SCAN_FSM* scanFSMPtr);
|
||||
void ScanNet_Destroy(L2_SCAN_FSM* scanFSMPtr);
|
||||
int32_t ScanNet_Proc(L2_INST* instPtr);
|
||||
int32_t ScanNet_PktHandler(L2_INST* instPtr);
|
||||
int32_t ScanNet_Routine(L2_INST* instPtr, const L2_RTNE_TABLE_ENTRY* rtneEntry);
|
||||
|
||||
// Management Net
|
||||
int32_t MgmtNet_Init(L2_MGMT_FSM** mgmtFSM);
|
||||
void MgmtNet_Reset(L2_MGMT_FSM* mgmtFSM);
|
||||
void MgmtNet_Destroy(L2_MGMT_FSM* mgmtFSM);
|
||||
int32_t MgmtNet_PktHandler(L2_INST* instPtr);
|
||||
int32_t MgmtNet_Routine(L2_INST* instPtr, const L2_RTNE_TABLE_ENTRY* rtneEntry);
|
||||
|
||||
|
||||
// Service net
|
||||
int32_t ServiceNet_Init(L2_SVC_FSM** serviceFSM);
|
||||
void ServiceNet_Reset(L2_SVC_FSM* serviceFSM);
|
||||
void ServiceNet_Destroy(L2_SVC_FSM* serviceFSM);
|
||||
int32_t ServiceNet_PktHandler(L2_INST* instPtr);
|
||||
int32_t ServiceNet_Routine(L2_INST* instPtr, const L2_RTNE_TABLE_ENTRY* schedEntry);
|
||||
|
||||
// Miscellaneous
|
||||
L2_NODE_STATE L2_GetMainState(L2_INST* instPtr);
|
||||
L2_RTT_FSM* L2_GetRttDesc(L2_INST* instPtr);
|
||||
bool L2_isDataAvail(L2_INST* instPtr);
|
||||
bool L2_isCxn2Net(L2_INST* instPtr);
|
||||
void L2_RcdShift(L2_RCD* rcd, int32_t netxVal);
|
||||
uint32_t L2_GetFrameLen(L2_FRAME_TYPE l2FrameType);
|
||||
uint32_t L2_GetLastFrameNum(L2_INST* instPtr);
|
||||
uint32_t L2_GetLastSlotNum(L2_INST* instPtr);
|
||||
uint32_t L2_GetCurrentFrameNum(L2_INST* instPtr);
|
||||
uint32_t L2_GetCurrentSlotNum(L2_INST* instPtr);
|
||||
uint32_t L2_GetNextFrameNum(L2_INST* instPtr);
|
||||
uint32_t L2_GetNextSlotNum(L2_INST* instPtr);
|
||||
|
||||
// Time syncronization
|
||||
int32_t L2_TimeAlign(L2_INST* instPtr, uint32_t frameNum, uint32_t slotNum);
|
||||
|
||||
// RTT
|
||||
int32_t RTT_Init(L2_RTT_FSM** rttFsmPtr);
|
||||
void RTT_Reset(L2_RTT_FSM* rttFsmPtr);
|
||||
void RTT_Destroy(L2_RTT_FSM* rttFsmPtr);
|
||||
int32_t RTT_Proc(L2_INST* instPtr);
|
||||
|
||||
|
||||
#endif /* LINKLAYER814_H_ */
|
||||
@@ -0,0 +1,324 @@
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* Description: A brief description of this file
|
||||
*
|
||||
* Date: 2022-08-28 22:53
|
||||
* LastEditors: Fan Hao
|
||||
* LastEditTime: 2022-08-29 00:45
|
||||
* Revisions: Rev x.x
|
||||
* History:
|
||||
* [YYYY-MM-DD]: Description of modification.
|
||||
*
|
||||
* Copyright(c) 2022 Beijing Institute of Technology.
|
||||
* Lab of Communication and Networking
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef LINKLAYER814_DEF_H_
|
||||
#define LINKLAYER814_DEF_H_
|
||||
|
||||
/***************************** Include Files *********************************/
|
||||
#include <stdbool.h>
|
||||
#include <inttypes.h>
|
||||
#include "geometry/coord.h"
|
||||
#include "../phy_ctrl/phy_ctrl.h"
|
||||
/************************** Constant Definitions *****************************/
|
||||
// Common node ID definition
|
||||
#define BROADCAST_ID 0x1F
|
||||
#define NONE_ID BROADCAST_ID
|
||||
|
||||
// for MPC Configure
|
||||
#define MSG_STROAGE_BUFF_MAX 16384 // 16K Bytes
|
||||
|
||||
// Routine configure
|
||||
#define L2_INIT_RTNE_PERIOD 24
|
||||
#define L2_NORMAL_RTNE_PERIOD 60
|
||||
#define L2_SEEK_RTNE_PERIOD 60
|
||||
#define L2_INTER_SEEK_RTNE_PERIOD 60
|
||||
#define L2_INTRA_SEEK_RTNE_PERIOD 60
|
||||
|
||||
// Common slot number definition
|
||||
#define L2_SLOTNO_NONE 0
|
||||
#define L2_FRAMENO_NONE 0
|
||||
|
||||
// Common number of slots definition
|
||||
#define L2_SLOTS_PER_FRAME 200
|
||||
#define L2_SLOTS_PER_SUBFRAME 20
|
||||
|
||||
#define NUM_SLOTS_NONE UINT32_MAX
|
||||
#define NUM_SLOTS_20MS 4
|
||||
#define NUM_SLOTS_10MS 2
|
||||
#define NUM_SLOTS_5MS 1
|
||||
#define NUM_SLOTS_SKIP 0
|
||||
|
||||
// Common schedule event definition
|
||||
#define L2_SCHD_EVENT_MAX 16
|
||||
|
||||
/**************************** Type Definitions *******************************/
|
||||
|
||||
typedef struct {
|
||||
uint32_t last;
|
||||
uint32_t curr;
|
||||
uint32_t next;
|
||||
} L2_RCD;
|
||||
|
||||
/** @name Tx/Rx mode code
|
||||
*/
|
||||
typedef enum {
|
||||
L2_TOR_SUSPEND = 0,
|
||||
L2_TOR_TX = 1,
|
||||
L2_TOR_RX = 2
|
||||
} L2_TOR_TYPE;
|
||||
|
||||
/** @name Prior information type definition
|
||||
*/
|
||||
typedef enum {
|
||||
NONE_TYPE = 0,
|
||||
HEAD_NODE = 1,
|
||||
MEMBER_NODE = 2,
|
||||
BACKUP_HEAD = 3
|
||||
} L2_NODE_TYPE;
|
||||
|
||||
/** @name Node state type definition
|
||||
*/
|
||||
typedef enum {
|
||||
NONE_STATE = 0,
|
||||
INIT_STATE = 1,
|
||||
NORMAL_STATE = 2,
|
||||
INTRA_SEEK_STATE = 3,
|
||||
INTER_SEEK_STATE = 4,
|
||||
SEEK_STATE = 5
|
||||
} L2_NODE_STATE;
|
||||
|
||||
typedef struct {
|
||||
uint8_t nodeId;
|
||||
uint8_t clustId;
|
||||
L2_NODE_TYPE nodeType;
|
||||
uint8_t beamNo;
|
||||
COORD pos;
|
||||
COORD speed;
|
||||
} L2_NODE_INFO;
|
||||
|
||||
/** @name L2 event enum
|
||||
* A enum of L2 event types.
|
||||
*/
|
||||
typedef enum {
|
||||
L2_EV_NONE = 0,
|
||||
L2_EV_SCAN_PROC_DONE = 1,
|
||||
L2_EV_MGMT_PROC_DONE = 2,
|
||||
L2_EV_NET_SETUP_DONE = 3,
|
||||
L2_EV_TIME_SYNC = 4,
|
||||
L2_EV_LINK_SET_REQ = 6,
|
||||
L2_EV_LOST_CXN = 7,
|
||||
L2_EV_LOST_NODE = 8,
|
||||
L2_EV_SET_FRAME_NUM = 9,
|
||||
L2_EV_SET_SLOT_NUM = 10,
|
||||
L2_EV_MAIN_STATE_UPDATE = 11,
|
||||
L2_ROUTINE_FINISH = 12,
|
||||
L2_ROUTINE_UPDATE = 13
|
||||
} L2_EVENT_TYPE;
|
||||
|
||||
/** @name L2 event
|
||||
* A definition of L2 event instance.
|
||||
*/
|
||||
typedef struct {
|
||||
L2_EVENT_TYPE event;
|
||||
void* msg;
|
||||
} L2_EVENT;
|
||||
|
||||
/** @name L2 event
|
||||
* A definition of L2 event instance.
|
||||
*/
|
||||
typedef struct {
|
||||
uint8_t eventId;
|
||||
bool isSchd;
|
||||
L2_EVENT l2Event;
|
||||
uint32_t schdFrame;
|
||||
uint32_t schdSlot;
|
||||
} L2_SCHD_EVENT;
|
||||
|
||||
/** @name Slot types
|
||||
* A definition of different slots.
|
||||
*/
|
||||
typedef enum {
|
||||
SLOT_NONE = 0,
|
||||
SLOT_IDLE = 1,
|
||||
SLOT_INTER_SCAN_ACQ = 2,
|
||||
SLOT_INTRA_SCAN_ACQ = 3,
|
||||
SLOT_INTER_SCAN_BM = 4,
|
||||
SLOT_INTRA_SCAN_BM = 5,
|
||||
SLOT_INTER_SCAN_2W = 6,
|
||||
SLOT_INTRA_SCAN_2W = 7,
|
||||
SLOT_INTER_SVC = 8,
|
||||
SLOT_INTRA_SVC = 9,
|
||||
SLOT_INTER_MGMT = 10,
|
||||
SLOT_INTRA_MGMT = 11,
|
||||
SLOT_INTER_TSYNC = 12,
|
||||
SLOT_INTRA_TSYNC = 13,
|
||||
} L2_SLOT_TYPE;
|
||||
|
||||
/** @name Frame types
|
||||
* A definition of different frame types.
|
||||
*/
|
||||
typedef enum {
|
||||
L2_CRC_NONE = 0,
|
||||
L2_CRC16_1021 = 1,
|
||||
L2_CRC16_8005 = 2,
|
||||
L2_CRC8_31 = 3
|
||||
} L2_CRC_TYPE;
|
||||
|
||||
/** @name Frame types
|
||||
* A definition of different frame types.
|
||||
*/
|
||||
typedef enum {
|
||||
L2_NONE_FRAME = 0,
|
||||
L2_INTER_SCAN_FRAME = 1,
|
||||
L2_INTRA_SCAN_FRAME = 2,
|
||||
L2_INTER_BM_FRAME = 3,
|
||||
L2_INTRA_BM_FRAME = 4,
|
||||
L2_INTER_W2_ACQ_FRAME = 5,
|
||||
L2_INTRA_W2_ACQ_FRAME = 6,
|
||||
L2_INTER_MGMT_FRAME = 7,
|
||||
L2_INTRA_MGMT_FRAME = 8,
|
||||
L2_INTER_TSYNC_FRAME = 9,
|
||||
L2_INTRA_TSYNC_FRAME = 10,
|
||||
L2_INTER_SVC_FRAME = 11,
|
||||
L2_INTRA_SVC_FRAME = 12
|
||||
} L2_FRAME_TYPE;
|
||||
|
||||
/** @name Schedule subtable entry
|
||||
* A definition of Schedule subtable entry.
|
||||
*/
|
||||
typedef struct {
|
||||
L2_SLOT_TYPE slotType : 8;
|
||||
uint8_t slotSeq;
|
||||
uint8_t src0;
|
||||
uint8_t dst0;
|
||||
uint8_t src1;
|
||||
uint8_t dst1;
|
||||
} L2_RTNE_TABLE_ENTRY;
|
||||
|
||||
|
||||
|
||||
// Scan net
|
||||
typedef struct {
|
||||
uint8_t NodeId;
|
||||
uint8_t ClusterId;
|
||||
uint32_t frameNum;
|
||||
uint32_t slotNum;
|
||||
uint16_t EastSpeed;
|
||||
uint16_t NorthSpeed;
|
||||
uint16_t UpperSpeed;
|
||||
uint32_t Height;
|
||||
uint32_t Longitude;
|
||||
uint32_t Latitude;
|
||||
} L2_BM_LOG;
|
||||
|
||||
typedef struct {
|
||||
uint8_t NodeId;
|
||||
uint8_t ClusterId;
|
||||
uint16_t EastSpeed;
|
||||
uint16_t NorthSpeed;
|
||||
uint16_t UpperSpeed;
|
||||
uint32_t Height;
|
||||
uint32_t Longitude;
|
||||
uint32_t Latitude;
|
||||
L2_NODE_STATE NetStage;
|
||||
uint32_t NetScanTime;
|
||||
} L2_W2ACQ_LOG;
|
||||
|
||||
typedef enum {
|
||||
NONE_STAGE = 0,
|
||||
INIT_SCAN_STAGE = 1,
|
||||
BM_ADVT_STAGE = 2, // Benchmark advertisement
|
||||
WAY2_ACQ_STAGE = 3
|
||||
} SCAN_STAGE;
|
||||
|
||||
typedef enum {
|
||||
NONE_MODE = 0,
|
||||
INTRA_CLUSTER_MODE = 1,
|
||||
INTER_CLUSTER_MODE = 2
|
||||
} SCAN_MODE;
|
||||
|
||||
typedef struct {
|
||||
bool isLocked; // init acq done.
|
||||
bool isBmRcved;// bm received.
|
||||
bool isAcked; // 2way acq done.
|
||||
uint32_t bmTimeout;
|
||||
uint32_t w2acqTimeout;
|
||||
SCAN_STAGE scanStage; // only for member node
|
||||
SCAN_MODE scanMode; // inter sanc or intra scan
|
||||
L2_BM_LOG BMrcvLog;
|
||||
L2_W2ACQ_LOG W2ACQrcvLog;
|
||||
} L2_SCAN_FSM;
|
||||
|
||||
// Service Net
|
||||
typedef struct {
|
||||
bool isBisar;
|
||||
bool isBisarEven; // Send frame at even slot at bisar mode.
|
||||
uint8_t bisarDst;
|
||||
uint32_t bisarEndframe;
|
||||
} L2_SVC_FSM;
|
||||
|
||||
|
||||
// Management net
|
||||
typedef struct {
|
||||
uint8_t wordTag ;
|
||||
uint8_t msgTag ;
|
||||
uint8_t msgSubTag;
|
||||
uint8_t srcNodeId ;
|
||||
uint8_t quitNodeId ;
|
||||
uint8_t quitCtrlWord ;
|
||||
uint8_t nextNetState;
|
||||
uint16_t EastSpeed ;
|
||||
uint16_t NorthSpeed;
|
||||
uint16_t UpperSpeed;
|
||||
uint32_t Height ;
|
||||
uint32_t Longitude ;
|
||||
uint32_t Latitude ;
|
||||
bool isValid;
|
||||
} MGMT_MSG_RECORD;
|
||||
|
||||
typedef struct {
|
||||
uint16_t wordTag;
|
||||
uint16_t msgTag;
|
||||
uint16_t msgSubTag;
|
||||
uint16_t msgLen;
|
||||
uint16_t srcAddr;
|
||||
uint16_t dstAddr;
|
||||
uint32_t timeWordL;
|
||||
uint32_t timeWordH;
|
||||
int32_t doppler;
|
||||
} RTT_MSG_RECORD;
|
||||
|
||||
typedef struct {
|
||||
uint32_t timeH;
|
||||
uint32_t timeL;
|
||||
} L2_TIME_WORD;
|
||||
|
||||
typedef struct {
|
||||
L2_TIME_WORD rttTime;
|
||||
uint32_t rttDoppler;
|
||||
} RTT_DATA;
|
||||
|
||||
typedef struct {
|
||||
bool isBisarProc;
|
||||
bool isPendTimeAlloc;
|
||||
bool isPendSlotAlloc;
|
||||
MGMT_MSG_RECORD mgmtMsgLog;
|
||||
RTT_MSG_RECORD rttMsgRspLog;
|
||||
RTT_MSG_RECORD rttMsgReqLog;
|
||||
RTT_DATA rttData;
|
||||
} L2_MGMT_FSM;
|
||||
|
||||
|
||||
typedef struct{
|
||||
L2_RTNE_TABLE_ENTRY** rtneTable;
|
||||
uint32_t rtnePrd;
|
||||
L2_RTNE_TABLE_ENTRY* last;
|
||||
L2_RTNE_TABLE_ENTRY* curr;
|
||||
L2_RTNE_TABLE_ENTRY* next;
|
||||
}L2_RTNE_CONFIG;
|
||||
|
||||
/************************** Variable Definitions *****************************/
|
||||
#endif /* LINKLAYER814_H_ */
|
||||
@@ -0,0 +1,791 @@
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* Description: Time allocations for 814 datalink,
|
||||
* Date: 2022-07-16 17:05
|
||||
* LastEditors: Fan Hao
|
||||
* LastEditTime: 2022-07-16 17:05
|
||||
* Revisions: Rev 0.1
|
||||
* History:
|
||||
* [2021-11-13]: Initial version.
|
||||
*
|
||||
* Copyright(c) 2021 Beijing Institute of Technology.
|
||||
* Lab of Communication and Networking
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "linklayer814_types.h"
|
||||
|
||||
L2_RTNE_TABLE_ENTRY normalSubT_0[L2_SLOTS_PER_FRAME] = {
|
||||
// Frame 1
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
|
||||
// Frame 2
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
|
||||
// Frame 3
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
|
||||
// Frame 4
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
|
||||
// Frame 5
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
|
||||
// Frame 6
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
|
||||
// Frame 7
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
|
||||
// Frame 8
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
|
||||
// Frame 9
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
|
||||
// Frame 10
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00}
|
||||
};
|
||||
|
||||
|
||||
|
||||
L2_RTNE_TABLE_ENTRY normalSubT_1[L2_SLOTS_PER_FRAME] = {
|
||||
// Frame 1
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
|
||||
// Frame 2
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
|
||||
// Frame 3
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
|
||||
// Frame 4
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
|
||||
// Frame 5
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
|
||||
// Frame 6
|
||||
{SLOT_INTRA_TSYNC,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
|
||||
// Frame 7
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_TSYNC,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_TSYNC,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
|
||||
// Frame 8
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_TSYNC,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
|
||||
// Frame 9
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
|
||||
// Frame 10
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00}, {SLOT_INTRA_SVC ,0x00,0x02,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_MGMT ,0x00,0x01,0x02,0x00,0x00}, {SLOT_INTRA_MGMT ,0x00,0x02,0x01,0x00,0x00}
|
||||
};
|
||||
|
||||
// L2_RTNE_TABLE_ENTRY interScanSubT_0[L2_SLOTS_PER_FRAME] = {
|
||||
// // Frame 1
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// // Frame 2
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// // Frame 3
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// // Frame 4
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// // Frame 5
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// // Frame 6
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// // Frame 7
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// // Frame 8
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_ACQ,0x00,0x02,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_ACQ,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_BM,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_BM,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_BM,0x02,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_BM,0x03,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_BM,0x04,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_BM,0x05,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_BM,0x06,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_BM,0x07,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_BM,0x08,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_BM,0x09,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_BM,0x0A,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_BM,0x0B,0x01,0x1F,0x00,0x00},
|
||||
// // Frame 9
|
||||
// {SLOT_INTER_SCAN_BM,0x0C,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_BM,0x0D,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_BM,0x0E,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_BM,0x0F,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_BM,0x10,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_BM,0x11,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_BM,0x12,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_BM,0x13,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_2W,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_2W,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTER_SCAN_2W,0x01,0x1F,0x01,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTER_SCAN_2W,0x01,0x1F,0x01,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_2W,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_2W,0x01,0x01,0x1F,0x00,0x00},
|
||||
// // Frame 10
|
||||
// {SLOT_INTER_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTER_SCAN_2W,0x01,0x1F,0x01,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTER_SCAN_2W,0x01,0x1F,0x01,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_2W,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_2W,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTER_SCAN_2W,0x01,0x1F,0x01,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTER_SCAN_2W,0x01,0x1F,0x01,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_2W,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTER_SCAN_2W,0x01,0x01,0x1F,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTER_SCAN_2W,0x01,0x1F,0x01,0x00,0x00},
|
||||
// {SLOT_INTER_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTER_SCAN_2W,0x01,0x1F,0x01,0x00,0x00}
|
||||
// };
|
||||
|
||||
|
||||
L2_RTNE_TABLE_ENTRY interScanSubT_0[L2_SLOTS_PER_FRAME] = {
|
||||
// Frame 1
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
// Frame 2
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
// Frame 3
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
// Frame 4
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
// Frame 5
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
// Frame 6
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
// Frame 7
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
// Frame 8
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
// Frame 9
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
// Frame 10
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}
|
||||
};
|
||||
|
||||
L2_RTNE_TABLE_ENTRY interScanSubT_1[L2_SLOTS_PER_FRAME] = {
|
||||
// Frame 1
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
// Frame 2
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
// Frame 3
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
// Frame 4
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
// Frame 5
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
// Frame 6
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
// Frame 7
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
// Frame 8
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
// Frame 9
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
// Frame 10
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
};
|
||||
|
||||
L2_RTNE_TABLE_ENTRY intraScanSubT[L2_SLOTS_PER_FRAME] = {
|
||||
// Frame 1
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// Frame 2
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// Frame 3
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
// Frame 4
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_ACQ,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_ACQ,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_BM,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_BM,0x01,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_BM,0x02,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_BM,0x03,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_IDLE,0x00,0x00,0x00,0x00,0x00}, {SLOT_IDLE,0x00,0x00,0x00,0x00,0x00},
|
||||
// Frame 5
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
// Frame 6
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
// Frame 7
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
// Frame 8
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
// Frame 9
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
// Frame 10
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x01,0x1F,0x00,0x00},
|
||||
{SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}, {SLOT_INTRA_SCAN_2W,0x00,0x1F,0x01,0x00,0x00}
|
||||
};
|
||||
|
||||
|
||||
L2_RTNE_TABLE_ENTRY* initTable[L2_INIT_RTNE_PERIOD] = {
|
||||
interScanSubT_0, interScanSubT_1, interScanSubT_0, interScanSubT_1, interScanSubT_0, interScanSubT_1,
|
||||
interScanSubT_0, interScanSubT_1, interScanSubT_0, interScanSubT_1, interScanSubT_0, interScanSubT_1,
|
||||
intraScanSubT, intraScanSubT, intraScanSubT, intraScanSubT, intraScanSubT, intraScanSubT,
|
||||
intraScanSubT, intraScanSubT, intraScanSubT, intraScanSubT, intraScanSubT, intraScanSubT
|
||||
};
|
||||
|
||||
|
||||
L2_RTNE_TABLE_ENTRY* seekTable[L2_SEEK_RTNE_PERIOD] = {
|
||||
interScanSubT_0, interScanSubT_1, interScanSubT_0, interScanSubT_1, interScanSubT_0, interScanSubT_1,
|
||||
interScanSubT_0, interScanSubT_1, interScanSubT_0, interScanSubT_1, interScanSubT_0, interScanSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
intraScanSubT, intraScanSubT, intraScanSubT, intraScanSubT, intraScanSubT, intraScanSubT,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1
|
||||
};
|
||||
|
||||
// L2_RTNE_TABLE_ENTRY* seekTable[L2_SEEK_RTNE_PERIOD] = {
|
||||
// normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
// normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
// normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
// normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
// normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
// intraScanSubT, intraScanSubT, intraScanSubT, intraScanSubT, intraScanSubT, intraScanSubT,
|
||||
// normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
// normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
// normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
// normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1
|
||||
// };
|
||||
|
||||
L2_RTNE_TABLE_ENTRY* interSeekTable[L2_INTER_SEEK_RTNE_PERIOD] = {
|
||||
interScanSubT_0, interScanSubT_1, interScanSubT_0, interScanSubT_1, interScanSubT_0, interScanSubT_1,
|
||||
interScanSubT_0, interScanSubT_1, interScanSubT_0, interScanSubT_1, interScanSubT_0, interScanSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1
|
||||
};
|
||||
|
||||
L2_RTNE_TABLE_ENTRY* intraSeekTable[L2_INTRA_SEEK_RTNE_PERIOD] = {
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
intraScanSubT, intraScanSubT, intraScanSubT, intraScanSubT, intraScanSubT, intraScanSubT,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1
|
||||
};
|
||||
|
||||
L2_RTNE_TABLE_ENTRY* normalTable[L2_NORMAL_RTNE_PERIOD] = {
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1,
|
||||
normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1, normalSubT_1
|
||||
};
|
||||
@@ -0,0 +1,614 @@
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* Description: Header of 814 linklayer messages
|
||||
*
|
||||
* Date: 2022-07-14 00:08
|
||||
* LastEditors: Fan Hao
|
||||
* LastEditTime: 2022-07-14 22:52
|
||||
* Revisions: Rev 0.0
|
||||
* History:
|
||||
* [2022-07-14]: Initial version.
|
||||
*
|
||||
* Copyright(c) 2021 Beijing Institute of Technology.
|
||||
* Lab of Communication and Networking
|
||||
*
|
||||
******************************************************************************/
|
||||
#ifndef MSG_DEF_H_
|
||||
#define MSG_DEF_H_
|
||||
|
||||
#define L2_MSG_LEN 72 // bit
|
||||
#define L2_MSG_MAX 512 // bit
|
||||
#define PDU_CRC_LEN 16
|
||||
// ** 77 Basic Header 1 Format ** //
|
||||
#define PDUH0_LEN 112
|
||||
#define PDUH0_TYPE_LEN 1
|
||||
#define PDUH0_TYPE_OFFSET 0
|
||||
#define PDUH0_RESV_LEN 7
|
||||
#define PDUH0_RESV_OFFSET 1
|
||||
#define PDUH0_LENGTH_LEN 16
|
||||
#define PDUH0_LENGTH_OFFSET 8
|
||||
#define PDUH0_SRC_ADDR_LEN 10
|
||||
#define PDUH0_SRC_ADDR_OFFSET 24
|
||||
#define PDUH0_DST_ADDR_LEN 10
|
||||
#define PDUH0_DST_ADDR_OFFSET 34
|
||||
#define PDUH0_SEQ_NUM_LEN 16
|
||||
#define PDUH0_SEQ_NUM_OFFSET 44
|
||||
#define PDUH0_RESV_1_LEN 44
|
||||
#define PDUH0_RESV_1_OFFSET 60
|
||||
#define PDUH0_HEADER_CRC_LEN 8
|
||||
#define PDUH0_HEADER_CRC_OFFSET 104
|
||||
|
||||
// ** 78 Message Key Format ** //
|
||||
#define MSG_KEY_LENGTH_LEN 88
|
||||
|
||||
// ** 79 Basic Header 2 Format ** //
|
||||
#define PDUH1_LEN 48
|
||||
#define PDUH1_TYPE_LEN 1
|
||||
#define PDUH1_TYPE_OFFSET 0
|
||||
#define PDUH1_LENGTH_LEN 8
|
||||
#define PDUH1_LENGTH_OFFSET 1
|
||||
#define PDUH1_SRC_ADDR_LEN 10
|
||||
#define PDUH1_SRC_ADDR_OFFSET 9
|
||||
#define PDUH1_DST_ADDR_LEN 10
|
||||
#define PDUH1_DST_ADDR_OFFSET 19
|
||||
#define PDUH1_SLICEH_TAGE_LEN 1
|
||||
#define PDUH1_SLICEH_TAGE_OFFSET 29
|
||||
#define PDUH1_SLICET_TAGE_LEN 1
|
||||
#define PDUH1_SLICET_TAGE_OFFSET 30
|
||||
#define PDUH1_RESV_LEN 1
|
||||
#define PDUH1_RESV_OFFSET 31
|
||||
#define PDUH1_HEADER_CRC_LEN 8
|
||||
#define PDUH1_HEADER_CRC_OFFSET 32
|
||||
|
||||
// ** 74 Assembling Header Format ** //
|
||||
#define UDUH_LEN 64
|
||||
#define UDUH_PRI_LEN 3
|
||||
#define UDUH_PRI_OFFSET 0
|
||||
#define UDUH_RESERV_LEN 1
|
||||
#define UDUH_RESERV_OFFSET 3
|
||||
#define UDUH_MSG_TYPE_LEN 4
|
||||
#define UDUH_MSG_TYPE_OFFSET 4
|
||||
#define UDUH_LENGTH_LEN 16
|
||||
#define UDUH_LENGTH_OFFSET 8
|
||||
#define UDUH_SRC_ADDR_LEN 10
|
||||
#define UDUH_SRC_ADDR_OFFSET 24
|
||||
#define UDUH_DST_ADDR_LEN 10
|
||||
#define UDUH_DST_ADDR_OFFSET 34
|
||||
#define UDUH_UDU_SEQ_NUM_LEN 10
|
||||
#define UDUH_UDU_SEQ_NUM_OFFSET 44
|
||||
#define UDUH_RETRANS_NUM_LEN 2
|
||||
#define UDUH_RETRANS_NUM_OFFSET 54
|
||||
#define UDUH_NUM_SLICE_LEN 4
|
||||
#define UDUH_NUM_SLICE_OFFSET 56
|
||||
#define UDUH_SLICE_ID_LEN 4
|
||||
#define UDUH_SLICE_ID_OFFSET 60
|
||||
|
||||
// ** 88 Benchmark Message ** //
|
||||
#define BM_MSG_LEN 232 // bit
|
||||
#define BM_MSG_TYPE_LEN 3
|
||||
#define BM_MSG_TYPE_OFFSET 0
|
||||
#define BM_MSG_SRC_ADDR_LEN 10
|
||||
#define BM_MSG_SRC_ADDR_OFFSET 3
|
||||
#define BM_MSG_NETMG_ADDR_LEN 10
|
||||
#define BM_MSG_NETMG_ADDR_OFFSET 13
|
||||
#define BM_MSG_TUNIT_NUM_LEN 17
|
||||
#define BM_MSG_TUNIT_NUM_OFFSET 23
|
||||
#define BM_MSG_TFRAME_NUM_LEN 4
|
||||
#define BM_MSG_TFRAME_NUM_OFFSET 40
|
||||
#define BM_MSG_TSLOT_NUM_LEN 6
|
||||
#define BM_MSG_TSLOT_NUM_OFFSET 44
|
||||
#define BM_MSG_LAG_TIME_TAG_LEN 6
|
||||
#define BM_MSG_LAG_TIME_TAG_OFFSET 50
|
||||
#define BM_MSG_LONGITUDE_LEN 21
|
||||
#define BM_MSG_LONGITUDE_OFFSET 56
|
||||
#define BM_MSG_LATITUDE_LEN 20
|
||||
#define BM_MSG_LATITUDE_OFFSET 77
|
||||
#define BM_MSG_HEIGHT_LEN 15
|
||||
#define BM_MSG_HEIGHT_OFFSET 97
|
||||
#define BM_MSG_EAST_SPEED_LEN 8
|
||||
#define BM_MSG_EAST_SPEED_OFFSET 112
|
||||
#define BM_MSG_NORTH_SPEED_LEN 8
|
||||
#define BM_MSG_NORTH_SPEED_OFFSET 120
|
||||
#define BM_MSG_UPPER_SPEED_LEN 8
|
||||
#define BM_MSG_UPPER_SPEED_OFFSET 128
|
||||
#define BM_MSG_CRC_LEN 8
|
||||
#define BM_MSG_CRC_OFFSET 136
|
||||
#define BM_MSG_KEY_LEN 88
|
||||
#define BM_MSG_KEY_OFFSET 144
|
||||
|
||||
// ** 82 Net Scan Message - INI ** //
|
||||
#define NS_MSG_LEN 72
|
||||
#define NS_MSG_INI_SER_TAG_LEN 2
|
||||
#define NS_MSG_INI_SER_TAG_OFFSET 0
|
||||
#define NS_MSG_INI_WTAG_LEN 2
|
||||
#define NS_MSG_INI_WTAG_OFFSET 2
|
||||
#define NS_MSG_INI_MTAG_LEN 5
|
||||
#define NS_MSG_INI_MTAG_OFFSET 4
|
||||
#define NS_MSG_INI_STAG_LEN 3
|
||||
#define NS_MSG_INI_STAG_OFFSET 9
|
||||
#define NS_MSG_INI_LEN_LEN 3
|
||||
#define NS_MSG_INI_LEN_OFFSET 12
|
||||
#define NS_MSG_INI_TYPE_LEN 1
|
||||
#define NS_MSG_INI_TYPE_OFFSET 15
|
||||
#define NS_MSG_INI_SRC_ADDR_LEN 10
|
||||
#define NS_MSG_INI_SRC_ADDR_OFFSET 16
|
||||
#define NS_MSG_INI_DEST_ADDR_LEN 10
|
||||
#define NS_MSG_INI_DEST_ADDR_OFFSET 26
|
||||
#define NS_MSG_INI_NET_STAGE_LEN 4
|
||||
#define NS_MSG_INI_NET_STAGE_OFFSET 36
|
||||
#define NS_MSG_INI_SCAN_TIME_LEN 32
|
||||
#define NS_MSG_INI_SCAN_TIME_OFFSET 40
|
||||
|
||||
// ** 83 Net Scan Message - Continue 1 ** //
|
||||
#define NS_MSG_CONT_1_RESV_LEN 2
|
||||
#define NS_MSG_CONT_1_RESV_OFFSET 0
|
||||
#define NS_MSG_CONT_1_WTAG_LEN 2
|
||||
#define NS_MSG_CONT_1_WTAG_OFFSET 2
|
||||
#define NS_MSG_CONT_1_CONTID_LEN 4
|
||||
#define NS_MSG_CONT_1_CONTID_OFFSET 4
|
||||
#define NS_MSG_CONT_1_TIME_TAG_LEN 48
|
||||
#define NS_MSG_CONT_1_TIME_TAG_OFFSET 8
|
||||
#define NS_MSG_CONT_1_EAST_SPEED_LEN 16
|
||||
#define NS_MSG_CONT_1_EAST_SPEED_OFFSET 56
|
||||
|
||||
// ** 84 Net Scan Message - Continue 2 ** //
|
||||
#define NS_MSG_CONT_2_RESV_1_LEN 2
|
||||
#define NS_MSG_CONT_2_RESV_1_OFFSET 0
|
||||
#define NS_MSG_CONT_2_WTAG_LEN 2
|
||||
#define NS_MSG_CONT_2_WTAG_OFFSET 2
|
||||
#define NS_MSG_CONT_2_CONTID_LEN 4
|
||||
#define NS_MSG_CONT_2_CONTID_OFFSET 4
|
||||
#define NS_MSG_CONT_2_NORTH_SPEED_LEN 16
|
||||
#define NS_MSG_CONT_2_NORTH_SPEED_OFFSET 8
|
||||
#define NS_MSG_CONT_2_UPPER_SPEED_LEN 16
|
||||
#define NS_MSG_CONT_2_UPPER_SPEED_OFFSET 24
|
||||
#define NS_MSG_CONT_2_HEIGHT_LEN 24
|
||||
#define NS_MSG_CONT_2_HEIGHT_OFFSET 40
|
||||
#define NS_MSG_CONT_2_RESV_2_LEN 8
|
||||
#define NS_MSG_CONT_2_RESV_2_OFFSET 64
|
||||
|
||||
// ** 85 Net Scan Message - Continue 3 ** //
|
||||
#define NS_MSG_CONT_3_RESV_LEN 2
|
||||
#define NS_MSG_CONT_3_RESV_OFFSET 0
|
||||
#define NS_MSG_CONT_3_WTAG_LEN 2
|
||||
#define NS_MSG_CONT_3_WTAG_OFFSET 2
|
||||
#define NS_MSG_CONT_3_CONTID_LEN 4
|
||||
#define NS_MSG_CONT_3_CONTID_OFFSET 4
|
||||
#define NS_MSG_CONT_3_LONGITUDE_LEN 32
|
||||
#define NS_MSG_CONT_3_LONGITUDE_OFFSET 8
|
||||
#define NS_MSG_CONT_3_LATITUDE_LEN 32
|
||||
#define NS_MSG_CONT_3_LATITUDE_OFFSET 40
|
||||
|
||||
// ** 86 Net Scan Message - Continue 4 ** //
|
||||
#define NS_MSG_CONT_4_RESV_LEN 2
|
||||
#define NS_MSG_CONT_4_RESV_OFFSET 0
|
||||
#define NS_MSG_CONT_4_WTAG_LEN 2
|
||||
#define NS_MSG_CONT_4_WTAG_OFFSET 2
|
||||
#define NS_MSG_CONT_4_CONTID_LEN 4
|
||||
#define NS_MSG_CONT_4_CONTID_OFFSET 4
|
||||
#define NS_MSG_CONT_4_CRC_LEN 16
|
||||
#define NS_MSG_CONT_4_CRC_OFFSET 8
|
||||
#define NS_MSG_CONT_4_KEY_LEN 48
|
||||
#define NS_MSG_CONT_4_KEY_OFFSET 24
|
||||
|
||||
// ** 87 Net Scan Message - Continue 5 ** //
|
||||
#define NS_MSG_CONT_5_RESV_1_LEN 2
|
||||
#define NS_MSG_CONT_5_RESV_1_OFFSET 0
|
||||
#define NS_MSG_CONT_5_WTAG_LEN 2
|
||||
#define NS_MSG_CONT_5_WTAG_OFFSET 2
|
||||
#define NS_MSG_CONT_5_CONTID_LEN 4
|
||||
#define NS_MSG_CONT_5_CONTID_OFFSET 4
|
||||
#define NS_MSG_CONT_5_KEY_LEN 40
|
||||
#define NS_MSG_CONT_5_KEY_OFFSET 8
|
||||
#define NS_MSG_CONT_5_RESV_2_LEN 24
|
||||
#define NS_MSG_CONT_5_RESV_2_OFFSET 48
|
||||
|
||||
#define MGMT_MSG_LEN 72
|
||||
// ** 89 Tracking Message INI ** //
|
||||
#define TK_MSG_INI_SER_TAG_LEN 2
|
||||
#define TK_MSG_INI_SER_TAG_OFFSET 0
|
||||
#define TK_MSG_INI_WTAG_LEN 2
|
||||
#define TK_MSG_INI_WTAG_OFFSET 2
|
||||
#define TK_MSG_INI_TAG_LEN 5
|
||||
#define TK_MSG_INI_TAG_OFFSET 4
|
||||
#define TK_MSG_INI_STAG_LEN 3
|
||||
#define TK_MSG_INI_STAG_OFFSET 9
|
||||
#define TK_MSG_INI_LEN 3
|
||||
#define TK_MSG_INI_OFFSET 12
|
||||
#define TK_MSG_INI_TK_TAG_LEN 4
|
||||
#define TK_MSG_INI_TK_TAG_OFFSET 15
|
||||
#define TK_MSG_INI_TQLT_LEN 4
|
||||
#define TK_MSG_INI_TQLT_OFFSET 19
|
||||
#define TK_MSG_INI_TBASE_ID_INDICATE_LEN 1
|
||||
#define TK_MSG_INI_TBASE_ID_INDICATE_OFFSET 23
|
||||
#define TK_MSG_INI_CSCALE_NUM_LEN 4
|
||||
#define TK_MSG_INI_CSCALE_NUM_OFFSET 24
|
||||
#define TK_MSG_INI_MEMBER_NUM_LEN 4
|
||||
#define TK_MSG_INI_MEMBER_NUM_OFFSET 28
|
||||
#define TK_MSG_INI_MUTE_TAG_LEN 1
|
||||
#define TK_MSG_INI_MUTE_TAG_OFFSET 32
|
||||
#define TK_MSG_INI_NET_STATE_LEN 4
|
||||
#define TK_MSG_INI_NET_STATE_OFFSET 33
|
||||
#define TK_MSG_INI_RESV_LEN 35
|
||||
#define TK_MSG_INI_RESV_OFFSET 37
|
||||
|
||||
// ** 90 Tracking Message Extend ** //
|
||||
#define TK_MSG_EXTEND_RESV_1_LEN 2
|
||||
#define TK_MSG_EXTEND_RESV_1_OFFSET 0
|
||||
#define TK_MSG_EXTEND_WTAG_LEN 2
|
||||
#define TK_MSG_EXTEND_WTAG_OFFSET 2
|
||||
#define TK_MSG_EXTEND_TIME_TAG_LEN 48
|
||||
#define TK_MSG_EXTEND_TIME_TAG_OFFSET 4
|
||||
#define TK_MSG_EXTEND_EAST_SPEED_LEN 16
|
||||
#define TK_MSG_EXTEND_EAST_SPEED_OFFSET 52
|
||||
#define TK_MSG_EXTEND_RESV_2_LEN 4
|
||||
#define TK_MSG_EXTEND_RESV_2_OFFSET 68
|
||||
|
||||
// ** 91 Tracking Message Continue 1 ** //
|
||||
#define TK_MSG_CONT_1_RESV_1_LEN 2
|
||||
#define TK_MSG_CONT_1_RESV_1_OFFSET 0
|
||||
#define TK_MSG_CONT_1_WTAG_LEN 2
|
||||
#define TK_MSG_CONT_1_WTAG_OFFSET 2
|
||||
#define TK_MSG_CONT_1_CONTID_LEN 4
|
||||
#define TK_MSG_CONT_1_CONTID_OFFSET 4
|
||||
#define TK_MSG_CONT_1_NORTH_SPEED_LEN 16
|
||||
#define TK_MSG_CONT_1_NORTH_SPEED_OFFSET 8
|
||||
#define TK_MSG_CONT_1_UPPER_SPEED_LEN 16
|
||||
#define TK_MSG_CONT_1_UPPER_SPEED_OFFSET 24
|
||||
#define TK_MSG_CONT_1_HEIGHT_LEN 24
|
||||
#define TK_MSG_CONT_1_HEIGHT_OFFSET 40
|
||||
#define TK_MSG_CONT_1_RESV_2_LEN 8
|
||||
#define TK_MSG_CONT_1_RESV_2_OFFSET 64
|
||||
|
||||
// ** 92 Tracking Message Continue 2 ** //
|
||||
#define TK_MSG_CONT_2_RESV_1_LEN 2
|
||||
#define TK_MSG_CONT_2_RESV_1_OFFSET 0
|
||||
#define TK_MSG_CONT_2_WTAG_LEN 2
|
||||
#define TK_MSG_CONT_2_WTAG_OFFSET 2
|
||||
#define TK_MSG_CONT_2_CONTID_LEN 4
|
||||
#define TK_MSG_CONT_2_CONTID_OFFSET 4
|
||||
#define TK_MSG_CONT_2_LONGITUDE_LEN 32
|
||||
#define TK_MSG_CONT_2_LONGITUDE_OFFSET 8
|
||||
#define TK_MSG_CONT_2_LATITUDE_LEN 32
|
||||
#define TK_MSG_CONT_2_LATITUDE_OFFSET 40
|
||||
|
||||
// ** 93 Tracking Message Continue 3 ** //
|
||||
#define TK_MSG_CONT_3_RESV_1_LEN 2
|
||||
#define TK_MSG_CONT_3_RESV_1_OFFSET 0
|
||||
#define TK_MSG_CONT_3_WTAG_LEN 2
|
||||
#define TK_MSG_CONT_3_WTAG_OFFSET 2
|
||||
#define TK_MSG_CONT_3_CONTID_LEN 4
|
||||
#define TK_MSG_CONT_3_CONTID_OFFSET 4
|
||||
#define TK_MSG_CONT_3_MEMBER_ADDR_LEN 10
|
||||
#define TK_MSG_CONT_3_MEMBER_ADDR_OFFSET 8
|
||||
#define TK_MSG_CONT_3_RESV_2_LEN 6
|
||||
#define TK_MSG_CONT_3_RESV_2_OFFSET 18
|
||||
#define TK_MSG_CONT_3_EAST_ACC_LEN 16
|
||||
#define TK_MSG_CONT_3_EAST_ACC_OFFSET 24
|
||||
#define TK_MSG_CONT_3_NORTH_ACC_LEN 16
|
||||
#define TK_MSG_CONT_3_NORTH_ACC_OFFSET 40
|
||||
#define TK_MSG_CONT_3_UPPER_ACC_LEN 16
|
||||
#define TK_MSG_CONT_3_UPPER_ACC_OFFSET 56
|
||||
|
||||
|
||||
// ** 94 Time Announcements Initial ** //
|
||||
#define TA_MSG_SER_TAG_LEN 2
|
||||
#define TA_MSG_SER_TAG_OFFSET 0
|
||||
#define TA_MSG_WTAG_LEN 2
|
||||
#define TA_MSG_WTAG_OFFSET 2
|
||||
#define TA_MSG_MSG_TAG_LEN 5
|
||||
#define TA_MSG_MSG_TAG_OFFSET 4
|
||||
#define TA_MSG_MSG_STAG_LEN 3
|
||||
#define TA_MSG_MSG_STAG_OFFSET 9
|
||||
#define TA_MSG_MSG_LEN 3
|
||||
#define TA_MSG_MSG_OFFSET 12
|
||||
#define TA_MSG_RESV_LEN 2
|
||||
#define TA_MSG_RESV_OFFSET 14
|
||||
#define TA_MSG_SRC_ADDR_LEN 10
|
||||
#define TA_MSG_SRC_ADDR_OFFSET 16
|
||||
#define TA_MSG_CURR_TUNIT_NUM_LEN 17
|
||||
#define TA_MSG_CURR_TUNIT_NUM_OFFSET 26
|
||||
#define TA_MSG_CURR_TFRAME_NUM_LEN 4
|
||||
#define TA_MSG_CURR_TFRAME_NUM_OFFSET 43
|
||||
#define TA_MSG_HEIGHT_LEN 24
|
||||
#define TA_MSG_HEIGHT_OFFSET 46
|
||||
|
||||
// ** 95 Time Announcements Extend ** //
|
||||
#define TA_MSG_EX_RESV0_LEN 2
|
||||
#define TA_MSG_EX_RESV0_OFFSET 0
|
||||
#define TA_MSG_EX_WTAG_LEN 2
|
||||
#define TA_MSG_EX_WTAG_OFFSET 2
|
||||
#define TA_MSG_EX_LONGITUDE_LEN 32
|
||||
#define TA_MSG_EX_LONGITUDE_OFFSET 4
|
||||
#define TA_MSG_EX_LATITUDE_LEN 32
|
||||
#define TA_MSG_EX_LATITUDE_OFFSET 36
|
||||
#define TA_MSG_EX_RESV1_LEN 4
|
||||
#define TA_MSG_EX_RESV1_OFFSET 68
|
||||
|
||||
// ** 96 Time Announcements Continue 1 ** //
|
||||
#define TA_MSG_CONT_1_RESV0_LEN 2
|
||||
#define TA_MSG_CONT_1_RESV0_OFFSET 0
|
||||
#define TA_MSG_CONT_1_WTAG_LEN 2
|
||||
#define TA_MSG_CONT_1_WTAG_OFFSET 2
|
||||
#define TA_MSG_CONT_1_TAG_LEN 4
|
||||
#define TA_MSG_CONT_1_TAG_OFFSET 4
|
||||
#define TA_MSG_CONT_1_TIME_TAG_LEN 48
|
||||
#define TA_MSG_CONT_1_TIME_TAG_OFFSET 8
|
||||
#define TA_MSG_CONT_1_TSLOT_LEN 6
|
||||
#define TA_MSG_CONT_1_TSLOT_OFFSET 56
|
||||
#define TA_MSG_CONT_1_RESV1_LEN 10
|
||||
#define TA_MSG_CONT_1_RESV1_OFFSET 62
|
||||
|
||||
|
||||
// ** 97 Time Announcements Continue 2 ** //
|
||||
#define TA_MSG_CONT_2_RESV0_LEN 2
|
||||
#define TA_MSG_CONT_2_RESV0_OFFSET 0
|
||||
#define TA_MSG_CONT_2_WTAG_LEN 2
|
||||
#define TA_MSG_CONT_2_WTAG_OFFSET 2
|
||||
#define TA_MSG_CONT_2_TAG_LEN 4
|
||||
#define TA_MSG_CONT_2_TAG_OFFSET 4
|
||||
#define TA_MSG_CONT_2_EAST_LEN 16
|
||||
#define TA_MSG_CONT_2_EAST_OFFSET 8
|
||||
#define TA_MSG_CONT_2_NORTH_LEN 16
|
||||
#define TA_MSG_CONT_2_NORTH_OFFSET 24
|
||||
#define TA_MSG_CONT_2_UPPER_LEN 16
|
||||
#define TA_MSG_CONT_2_UPPER_OFFSET 40
|
||||
#define TA_MSG_CONT_2_RESV1_LEN 16
|
||||
#define TA_MSG_CONT_2_RESV1_OFFSET 56
|
||||
|
||||
// ** 98 Mission Network Adjustment Notification Message Initial Word ** //
|
||||
#define MADJ_MSG_INI_SER_TAG_LEN 2
|
||||
#define MADJ_MSG_INI_SER_TAG_OFFSET 0
|
||||
#define MADJ_MSG_INI_WTAG_LEN 2
|
||||
#define MADJ_MSG_INI_WTAG_OFFSET 2
|
||||
#define MADJ_MSG_INI_MSG_TAG_LEN 5
|
||||
#define MADJ_MSG_INI_MSG_TAG_OFFSET 4
|
||||
#define MADJ_MSG_INI_MSG_STAG_LEN 3
|
||||
#define MADJ_MSG_INI_MSG_STAG_OFFSET 9
|
||||
#define MADJ_MSG_INI_MSG_LEN 3
|
||||
#define MADJ_MSG_INI_MSG_OFFSET 12
|
||||
#define MADJ_MSG_INI_CTRL_CODE_LEN 4
|
||||
#define MADJ_MSG_INI_CTRL_CODE_OFFSET 15
|
||||
#define MADJ_MSG_INI_TCHIP_LEN 8
|
||||
#define MADJ_MSG_INI_TCHIP_OFFSET 19
|
||||
#define MADJ_MSG_INI_ADJ_TUNIT_NUM_LEN 17
|
||||
#define MADJ_MSG_INI_ADJ_TUNIT_NUM_OFFSET 27
|
||||
#define MADJ_MSG_INI_ADJ_TFRAME_NUM_LEN 4
|
||||
#define MADJ_MSG_INI_ADJ_TFRAME_NUM_OFFSET 44
|
||||
#define MADJ_MSG_INI_ADJ_ANNED_NODE_ADDR_LEN 10
|
||||
#define MADJ_MSG_INI_ADJ_ANNED_NODE_ADDR_OFFSET 48
|
||||
#define MADJ_MSG_INI_ADJ_RESV_LEN 14
|
||||
#define MADJ_MSG_INI_ADJ_RESV_OFFSET 58
|
||||
|
||||
// ** 99 Mission Network Adjustment Notification Message Extend Word ** //
|
||||
#define MADJ_MSG_EX_RESV_1_LEN 2
|
||||
#define MADJ_MSG_EX_RESV_1_OFFSET 0
|
||||
#define MADJ_MSG_EX_WTAG_LEN 2
|
||||
#define MADJ_MSG_EX_WTAG_OFFSET 2
|
||||
#define MADJ_MSG_EX_PNODE_ADDR_1_LEN 10
|
||||
#define MADJ_MSG_EX_PNODE_ADDR_1_OFFSET 4
|
||||
#define MADJ_MSG_EX_PNODE_ADDR_2_LEN 10
|
||||
#define MADJ_MSG_EX_PNODE_ADDR_2_OFFSET 14
|
||||
#define MADJ_MSG_EX_PNODE_ADDR_3_LEN 10
|
||||
#define MADJ_MSG_EX_PNODE_ADDR_3_OFFSET 24
|
||||
#define MADJ_MSG_EX_PNODE_ADDR_4_LEN 10
|
||||
#define MADJ_MSG_EX_PNODE_ADDR_4_OFFSET 34
|
||||
#define MADJ_MSG_EX_PNODE_ADDR_5_LEN 10
|
||||
#define MADJ_MSG_EX_PNODE_ADDR_5_OFFSET 44
|
||||
#define MADJ_MSG_EX_PNODE_ADDR_6_LEN 10
|
||||
#define MADJ_MSG_EX_PNODE_ADDR_6_OFFSET 54
|
||||
#define MADJ_MSG_EX_RESV_2_LEN 8
|
||||
#define MADJ_MSG_EX_RESV_2_OFFSET 64
|
||||
|
||||
// ** 100 RTT Inquiry Initial Word ** //
|
||||
#define RTT_MSG_LEN 72
|
||||
#define RTT_REQ_SER_TAG_LEN 2
|
||||
#define RTT_REQ_SER_TAG_OFFSET 0
|
||||
#define RTT_REQ_WTAG_LEN 2
|
||||
#define RTT_REQ_WTAG_OFFSET 2
|
||||
#define RTT_REQ_MSG_TAG_LEN 5
|
||||
#define RTT_REQ_MSG_TAG_OFFSET 4
|
||||
#define RTT_REQ_MSG_STAG_LEN 3
|
||||
#define RTT_REQ_MSG_STAG_OFFSET 9
|
||||
#define RTT_REQ_MSG_LEN 3
|
||||
#define RTT_REQ_MSG_OFFSET 12
|
||||
#define RTT_REQ_SRC_ADDR_LEN 10
|
||||
#define RTT_REQ_SRC_ADDR_OFFSET 15
|
||||
#define RTT_REQ_DST_ADDR_LEN 10
|
||||
#define RTT_REQ_DST_ADDR_OFFSET 25
|
||||
#define RTT_REQ_RESV_LEN 37
|
||||
#define RTT_REQ_RESV_OFFSET 35
|
||||
|
||||
// ** RTT Inquiry Extend Word ** //
|
||||
#define RTT_REQ_EX_RESV0_LEN 2
|
||||
#define RTT_REQ_EX_RESV0_OFFSET 0
|
||||
#define RTT_REQ_EX_WTAG_LEN 2
|
||||
#define RTT_REQ_EX_WTAG_OFFSET 2
|
||||
#define RTT_REQ_EX_TTAGL_LEN 32
|
||||
#define RTT_REQ_EX_TTAGL_OFFSET 4
|
||||
#define RTT_REQ_EX_TTAGH_LEN 32
|
||||
#define RTT_REQ_EX_TTAGH_OFFSET 36
|
||||
#define RTT_REQ_EX_RESV1_LEN 4
|
||||
#define RTT_REQ_EX_RESV1_OFFSET 68
|
||||
|
||||
// ** RTT Inquiry Continue Word ** //
|
||||
#define RTT_REQ_CONT_RESV0_LEN 2
|
||||
#define RTT_REQ_CONT_RESV0_OFFSET 0
|
||||
#define RTT_REQ_CONT_WTAG_LEN 2
|
||||
#define RTT_REQ_CONT_WTAG_OFFSET 2
|
||||
#define RTT_REQ_CONT_TAG_LEN 4
|
||||
#define RTT_REQ_CONT_TAG_OFFSET 4
|
||||
#define RTT_REQ_CONT_DOP_LEN 24
|
||||
#define RTT_REQ_CONT_DOP_OFFSET 8
|
||||
#define RTT_REQ_CONT_RESV1_LEN 40
|
||||
#define RTT_REQ_CONT_RESV1_OFFSET 32
|
||||
|
||||
|
||||
// ** 101 RTT Response Initial Word ** //
|
||||
#define RTT_RSP_SER_TAG_LEN 2
|
||||
#define RTT_RSP_SER_TAG_OFFSET 0
|
||||
#define RTT_RSP_WTAG_LEN 2
|
||||
#define RTT_RSP_WTAG_OFFSET 2
|
||||
#define RTT_RSP_MSG_TAG_LEN 5
|
||||
#define RTT_RSP_MSG_TAG_OFFSET 4
|
||||
#define RTT_RSP_MSG_STAG_LEN 3
|
||||
#define RTT_RSP_MSG_STAG_OFFSET 9
|
||||
#define RTT_RSP_MSG_LEN 3
|
||||
#define RTT_RSP_MSG_OFFSET 12
|
||||
#define RTT_RSP_SRC_ADDR_LEN 10
|
||||
#define RTT_RSP_SRC_ADDR_OFFSET 15
|
||||
#define RTT_RSP_DST_ADDR_LEN 10
|
||||
#define RTT_RSP_DST_ADDR_OFFSET 25
|
||||
#define RTT_RSP_ARV_TIME_LEN 25
|
||||
#define RTT_RSP_ARV_TIME_OFFSET 35
|
||||
#define RTT_RSP_RESV_LEN 12
|
||||
#define RTT_RSP_RESV_OFFSET 60
|
||||
|
||||
// ** RTT Response Extend Word ** //
|
||||
#define RTT_RSP_EX_RESV0_LEN 2
|
||||
#define RTT_RSP_EX_RESV0_OFFSET 0
|
||||
#define RTT_RSP_EX_WTAG_LEN 2
|
||||
#define RTT_RSP_EX_WTAG_OFFSET 2
|
||||
#define RTT_RSP_EX_TTAGL_LEN 32
|
||||
#define RTT_RSP_EX_TTAGL_OFFSET 4
|
||||
#define RTT_RSP_EX_TTAGH_LEN 32
|
||||
#define RTT_RSP_EX_TTAGH_OFFSET 36
|
||||
#define RTT_RSP_EX_RESV1_LEN 4
|
||||
#define RTT_RSP_EX_RESV1_OFFSET 68
|
||||
|
||||
// ** RTT Response Continue Word ** //
|
||||
#define RTT_RSP_CONT_RESV0_LEN 2
|
||||
#define RTT_RSP_CONT_RESV0_OFFSET 0
|
||||
#define RTT_RSP_CONT_WTAG_LEN 2
|
||||
#define RTT_RSP_CONT_WTAG_OFFSET 2
|
||||
#define RTT_RSP_CONT_TAG_LEN 4
|
||||
#define RTT_RSP_CONT_TAG_OFFSET 4
|
||||
#define RTT_RSP_CONT_DOP_LEN 24
|
||||
#define RTT_RSP_CONT_DOP_OFFSET 8
|
||||
#define RTT_RSP_CONT_RESV1_LEN 40
|
||||
#define RTT_RSP_CONT_RESV1_OFFSET 32
|
||||
|
||||
// ** 102 Network Exit Initial Word ** //
|
||||
#define NQT_MSG_SER_TAG_LEN 2
|
||||
#define NQT_MSG_SER_TAG_OFFSET 0
|
||||
#define NQT_MSG_WTAG_LEN 2
|
||||
#define NQT_MSG_WTAG_OFFSET 2
|
||||
#define NQT_MSG_MSG_TAG_LEN 5
|
||||
#define NQT_MSG_MSG_TAG_OFFSET 4
|
||||
#define NQT_MSG_MSG_STAG_LEN 3
|
||||
#define NQT_MSG_MSG_STAG_OFFSET 9
|
||||
#define NQT_MSG_MSG_LEN 3
|
||||
#define NQT_MSG_MSG_OFFSET 12
|
||||
#define NQT_MSG_CTRL_MUTE_LEN 7
|
||||
#define NQT_MSG_CTRL_MUTE_OFFSET 15
|
||||
#define NQT_MSG_OBJ_LEN 10
|
||||
#define NQT_MSG_OBJ_OFFSET 22
|
||||
#define NQT_MSG_RESV_LEN 40
|
||||
#define NQT_MSG_RESV_OFFSET 32
|
||||
|
||||
// ** 103 Cluster Merge Message Initial Word ** //
|
||||
#define CMG_MSG_SER_TAG_LEN 2
|
||||
#define CMG_MSG_SER_TAG_OFFSET 0
|
||||
#define CMG_MSG_WTAG_LEN 2
|
||||
#define CMG_MSG_WTAG_OFFSET 2
|
||||
#define CMG_MSG_MSG_TAG_LEN 5
|
||||
#define CMG_MSG_MSG_TAG_OFFSET 4
|
||||
#define CMG_MSG_MSG_STAG_LEN 3
|
||||
#define CMG_MSG_MSG_STAG_OFFSET 9
|
||||
#define CMG_MSG_MSG_LEN 3
|
||||
#define CMG_MSG_MSG_OFFSET 12
|
||||
#define CMG_MSG_CTRL_MUTE_LEN 7
|
||||
#define CMG_MSG_CTRL_MUTE_OFFSET 15
|
||||
#define CMG_MSG_NEW_CLR_ADDR_LEN 10
|
||||
#define CMG_MSG_NEW_CLR_ADDR_OFFSET 22
|
||||
#define CMG_MSG_RESV_LEN 40
|
||||
#define CMG_MSG_RESV_OFFSET 32
|
||||
|
||||
// ** 104 Backup Cluster Head Upgrade Message Initial Word ** //
|
||||
#define BCU_MSG_SER_TAG_LEN 2
|
||||
#define BCU_MSG_SER_TAG_OFFSET 0
|
||||
#define BCU_MSG_WTAG_LEN 2
|
||||
#define BCU_MSG_WTAG_OFFSET 2
|
||||
#define BCU_MSG_MSG_TAG_LEN 5
|
||||
#define BCU_MSG_MSG_TAG_OFFSET 4
|
||||
#define BCU_MSG_MSG_STAG_LEN 3
|
||||
#define BCU_MSG_MSG_STAG_OFFSET 9
|
||||
#define BCU_MSG_MSG_LEN 3
|
||||
#define BCU_MSG_MSG_OFFSET 12
|
||||
#define BCU_MSG_CTRL_MUTE_LEN 7
|
||||
#define BCU_MSG_CTRL_MUTE_OFFSET 15
|
||||
#define BCU_MSG_NEW_CLR_ADDR_LEN 10
|
||||
#define BCU_MSG_NEW_CLR_ADDR_OFFSET 22
|
||||
#define BCU_MSG_BEGIN_TUNIT_NUM_LEN 17
|
||||
#define BCU_MSG_BEGIN_TUNIT_NUM_OFFSET 32
|
||||
#define BCU_MSG_BEGIN_TFRANE_NUM_LEN 4
|
||||
#define BCU_MSG_BEGIN_TFRANE_NUM_OFFSET 49
|
||||
#define BCU_MSG_RESV_LEN 19
|
||||
#define BCU_MSG_RESV_OFFSET 53
|
||||
|
||||
typedef enum{
|
||||
L2_MSG_NONE = 0,
|
||||
L2_MSG_BM = 1,
|
||||
L2_MSG_SCAN_INIT = 2,
|
||||
L2_MSG_SCAN_CONT_1 = 3,
|
||||
L2_MSG_SCAN_CONT_2 = 4,
|
||||
L2_MSG_SCAN_CONT_3 = 5,
|
||||
L2_MSG_SCAN_CONT_4 = 6,
|
||||
L2_MSG_SCAN_CONT_5 = 7,
|
||||
L2_MSG_TK_INIT = 8,
|
||||
L2_MSG_TK_EXTD = 9,
|
||||
L2_MSG_TK_CONT_1 = 10,
|
||||
L2_MSG_TK_CONT_2 = 11,
|
||||
L2_MSG_TK_CONT_3 = 12,
|
||||
L2_MSG_TA_INIT = 13,
|
||||
L2_MSG_TA_EXTD = 14,
|
||||
L2_MSG_TA_CONT_1 = 15,
|
||||
L2_MSG_TA_CONT_2 = 16,
|
||||
L2_MSG_MADJ_INIT = 17,
|
||||
L2_MSG_MADJ_EXTD = 18,
|
||||
L2_MSG_RTT_REQ_INIT = 19,
|
||||
L2_MSG_RTT_REQ_EXTD = 20,
|
||||
L2_MSG_RTT_REQ_CONT = 21,
|
||||
L2_MSG_RTT_RSP_INIT = 22,
|
||||
L2_MSG_RTT_RSP_EXTD = 23,
|
||||
L2_MSG_RTT_RSP_CONT = 24,
|
||||
L2_MSG_NQT_INIT = 25,
|
||||
L2_MSG_CMG_INIT = 26,
|
||||
L2_MSG_BCU_INIT = 27,
|
||||
L2_MSG_LINK_INIT = 28,
|
||||
L2_MSG_LINK_CONT_1 = 29
|
||||
}L2_MSG_TYPE;
|
||||
|
||||
typedef enum{
|
||||
L2_PDU_HEADER_NONE = 0,
|
||||
L2_PDU_HEADER_0 = 1,
|
||||
L2_PDU_HEADER_1 = 2
|
||||
}L2_PDU_HEADER_TYPE;
|
||||
|
||||
// Intra-cluster frames
|
||||
#define INTRA_BM_FRAME_LENGTH_MAX (232/8) // byte
|
||||
#define INTRA_W2ACQ_FRAME_LENGTH_MAX (2040/8) // byte
|
||||
#define INTRA_MGMT_FRAME_LENGTH_MAX (2040/8) // byte
|
||||
#define INTRA_TA_FRAME_LENGTH_MAX (2040/8) // byte
|
||||
#define INTRA_SVC_FRAME_LENGTH_MAX (2040/8) // byte
|
||||
#define INTRA_RTT_FRAME_LENGTH_MAX (2040/8) // byte
|
||||
|
||||
// Inter-cluster frames
|
||||
#define INTER_BM_FRAME_LENGTH_MAX (312/8) // byte
|
||||
#define INTER_W2ACQ_FRAME_LENGTH_MAX (712/8) // byte
|
||||
#define W2ACQ_FRAME_CRC_DLEN ((NS_MSG_LEN*4)/8) //byte
|
||||
#define W2ACQ_FRAME_CRC_POS ((NS_MSG_LEN*4 + NS_MSG_CONT_4_CRC_OFFSET)/8)// byte
|
||||
|
||||
#define INTER_MGMT_FRAME_LENGTH_MAX (2152/8) // byte
|
||||
#define INTER_TA_FRAME_LENGTH_MAX (2152/8) // byte
|
||||
#define INTER_SVC_FRAME_LENGTH_MAX (2152/8) // byte
|
||||
#define INTER_RTT_FRAME_LENGTH_MAX (2152/8) // byte
|
||||
|
||||
extern L2_MSG_TYPE intraBmFrameMsgs[1];
|
||||
extern L2_MSG_TYPE intraW2AcqFrameMsgs[6];
|
||||
extern L2_MSG_TYPE intraMgmtFrameMsgs[6];
|
||||
extern L2_MSG_TYPE taFrameMsgs[4];
|
||||
extern L2_MSG_TYPE interSvcFrameMsgs[2];
|
||||
extern L2_MSG_TYPE rttReqFrameMsgs[3];
|
||||
extern L2_MSG_TYPE rttRspFrameMsgs[3];
|
||||
#endif //MSG_DEF_H_
|
||||
@@ -0,0 +1,991 @@
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* Description: Implementations of 814 linklayer management net.
|
||||
*
|
||||
* Date: 2021-11-18 17:27
|
||||
* LastEditors: Fan Hao
|
||||
* LastEditTime: 2022-01-16 15:52
|
||||
* Revisions: Rev 0.1
|
||||
* History:
|
||||
* [2022-07-16]: New branch for DiJian.
|
||||
* [2021-11-18]: Initial version.
|
||||
*
|
||||
* Copyright(c) 2022 Beijing Institute of Technology.
|
||||
* Lab of Communication and Networking
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/***************************** Include Files *********************************/
|
||||
#include <string.h>
|
||||
#include "linklayer814.h"
|
||||
#include "linklayer814_types.h"
|
||||
#include "msg_def.h"
|
||||
#include "rtt.h"
|
||||
#include "../error.h"
|
||||
#include "../common.h"
|
||||
#include "node_list.h"
|
||||
/************************** Constant Definitions *****************************/
|
||||
#define SQUENCE_MGMT_SLOTS 0
|
||||
#define INTER_MGMT_SLOTS 2
|
||||
#define INTRA_MGMT_SLOTS 1
|
||||
#define NONE_MGMT_SLOTS -1
|
||||
#define CONN_LOST_TH 10 // 10 count of mgmt msg no response to delete
|
||||
#define TIME2QUIT 80 // time to send quit message
|
||||
|
||||
#define SENDRTT 0
|
||||
#define RCVDRTT 1
|
||||
|
||||
/***************** Macros (Inline Functions) Definitions *********************/
|
||||
|
||||
/**************************** Type Definitions *******************************/
|
||||
typedef enum {
|
||||
MGMTPKT_NONE = 0,
|
||||
MGMTPKT_INTER_MGMT = 1,
|
||||
MGMTPKT_INTRA_MGMT = 2,
|
||||
MGMTPKT_INTER_RTTREQ = 3,
|
||||
MGMTPKT_INTER_RTTRSP = 4,
|
||||
MGMTPKT_INTRA_RTTREQ = 5,
|
||||
MGMTPKT_INTRA_RTTRSP = 6
|
||||
} MGMTPKT_TYPE;
|
||||
/************************** Variable Definitions *****************************/
|
||||
|
||||
/************************** Function Prototypes ******************************/
|
||||
static int32_t MgmtMsg_Packing(L2_INST* instPtr, BIT_ARRAY* bitarr, L2_MSG_TYPE msgType);
|
||||
static int32_t MgmtPkt_Packing(L2_INST* instPtr, MGMTPKT_TYPE pktType);
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Packing management message to a bit array.
|
||||
*
|
||||
* @param bitarr pointer to bit array buffer.
|
||||
* msgType message type.
|
||||
*
|
||||
* @return EPARAM
|
||||
* SUCCESS
|
||||
*
|
||||
******************************************************************************/
|
||||
static int32_t MgmtMsg_Packing(L2_INST* instPtr, BIT_ARRAY* bitarr, L2_MSG_TYPE msgType) {
|
||||
ASSERT(instPtr != NULL);
|
||||
ASSERT(bitarr != NULL);
|
||||
if (bitarr->num_of_bits < MGMT_MSG_LEN || msgType < L2_MSG_TK_INIT
|
||||
|| msgType > L2_MSG_BCU_INIT) {
|
||||
return EPARAM;
|
||||
}
|
||||
uint64_t dataChunk = 0;
|
||||
memset(bitarr->words, 0x99, (size_t) (MGMT_MSG_LEN / 8));
|
||||
switch (msgType) {
|
||||
case L2_MSG_TK_INIT:
|
||||
if (bitarr->num_of_bits < MGMT_MSG_LEN) {
|
||||
return EPARAM;
|
||||
}
|
||||
// Series tag
|
||||
dataChunk = 0;
|
||||
FrameInsertChunk(bitarr, TK_MSG_INI_SER_TAG_OFFSET, TK_MSG_INI_SER_TAG_LEN, dataChunk);
|
||||
|
||||
// word tag
|
||||
dataChunk = 3;
|
||||
FrameInsertChunk(bitarr, TK_MSG_INI_WTAG_OFFSET, TK_MSG_INI_WTAG_LEN, dataChunk);
|
||||
|
||||
// message tag
|
||||
dataChunk = 28;
|
||||
FrameInsertChunk(bitarr, TK_MSG_INI_TAG_OFFSET, TK_MSG_INI_TAG_LEN, dataChunk);
|
||||
|
||||
// message sub tag
|
||||
dataChunk = 1;
|
||||
FrameInsertChunk(bitarr, TK_MSG_INI_STAG_OFFSET, TK_MSG_INI_STAG_LEN, dataChunk);
|
||||
|
||||
// message length tag
|
||||
dataChunk = 4;
|
||||
FrameInsertChunk(bitarr, TK_MSG_INI_OFFSET, TK_MSG_INI_LEN, dataChunk);
|
||||
|
||||
// Next net stage
|
||||
if (instPtr->myInfo.nodeType == HEAD_NODE) {
|
||||
switch (instPtr->nextState) {
|
||||
case INIT_STATE:
|
||||
dataChunk = NET_INI_STAGE;
|
||||
break;
|
||||
case NORMAL_STATE:
|
||||
dataChunk = NET_NORMAL_STAGE;
|
||||
break;
|
||||
case INTRA_SEEK_STATE:
|
||||
dataChunk = NET_INTRA_SEEK_STAGE;
|
||||
break;
|
||||
case INTER_SEEK_STATE:
|
||||
dataChunk = NET_INTER_SEEK_STAGE;
|
||||
break;
|
||||
case SEEK_STATE:
|
||||
dataChunk = NET_SEEK_STAGE;
|
||||
break;
|
||||
default:
|
||||
dataChunk = NET_ERROR_STAGE;
|
||||
break;
|
||||
}
|
||||
FrameInsertChunk(bitarr, TK_MSG_INI_NET_STATE_OFFSET, TK_MSG_INI_NET_STATE_LEN, dataChunk);
|
||||
}
|
||||
break;
|
||||
case L2_MSG_TK_EXTD:
|
||||
if (bitarr->num_of_bits < MGMT_MSG_LEN) {
|
||||
return EPARAM;
|
||||
}
|
||||
// Word tag
|
||||
dataChunk = 1;
|
||||
FrameInsertChunk(bitarr, TK_MSG_EXTEND_WTAG_OFFSET, TK_MSG_EXTEND_WTAG_LEN, dataChunk);
|
||||
|
||||
// Time tag
|
||||
dataChunk = 0xAAAAAAAAAAAA;
|
||||
FrameInsertChunk(bitarr, TK_MSG_EXTEND_TIME_TAG_OFFSET, TK_MSG_EXTEND_TIME_TAG_LEN, dataChunk);
|
||||
|
||||
// East speed
|
||||
dataChunk = 0xBBBB;
|
||||
FrameInsertChunk(bitarr, TK_MSG_EXTEND_EAST_SPEED_OFFSET, TK_MSG_EXTEND_EAST_SPEED_LEN, dataChunk);
|
||||
break;
|
||||
case L2_MSG_TK_CONT_1:
|
||||
// Word tag
|
||||
dataChunk = 2;
|
||||
FrameInsertChunk(bitarr, TK_MSG_CONT_1_WTAG_OFFSET, TK_MSG_CONT_1_WTAG_LEN, dataChunk);
|
||||
|
||||
// Continue word identification.
|
||||
dataChunk = 1;
|
||||
FrameInsertChunk(bitarr, TK_MSG_CONT_1_CONTID_OFFSET, TK_MSG_CONT_1_CONTID_LEN, dataChunk);
|
||||
|
||||
// North speed
|
||||
dataChunk = 0xCCCC;
|
||||
FrameInsertChunk(bitarr, TK_MSG_CONT_1_NORTH_SPEED_OFFSET, TK_MSG_CONT_1_NORTH_SPEED_LEN, dataChunk);
|
||||
|
||||
// Upper speed
|
||||
dataChunk = 0xDDDD;
|
||||
FrameInsertChunk(bitarr, TK_MSG_CONT_1_UPPER_SPEED_OFFSET,
|
||||
TK_MSG_CONT_1_UPPER_SPEED_LEN, dataChunk);
|
||||
|
||||
// Height
|
||||
dataChunk = 0xEEEEEE;
|
||||
FrameInsertChunk(bitarr, TK_MSG_CONT_1_HEIGHT_OFFSET, TK_MSG_CONT_1_HEIGHT_LEN, dataChunk);
|
||||
break;
|
||||
|
||||
case L2_MSG_TK_CONT_2:
|
||||
// Word tag
|
||||
dataChunk = 2;
|
||||
FrameInsertChunk(bitarr, TK_MSG_CONT_2_WTAG_OFFSET, TK_MSG_CONT_2_WTAG_LEN, dataChunk);
|
||||
|
||||
// Continue word identification.
|
||||
dataChunk = 2;
|
||||
FrameInsertChunk(bitarr, TK_MSG_CONT_2_CONTID_OFFSET, TK_MSG_CONT_2_CONTID_LEN, dataChunk);
|
||||
|
||||
// Longitude
|
||||
dataChunk = 0xAAAAAAAA;
|
||||
FrameInsertChunk(bitarr, TK_MSG_CONT_2_LONGITUDE_OFFSET, TK_MSG_CONT_2_LONGITUDE_LEN, dataChunk);
|
||||
|
||||
// Latitude
|
||||
dataChunk = 0xBBBBBBBB;
|
||||
FrameInsertChunk(bitarr, TK_MSG_CONT_2_LATITUDE_OFFSET, TK_MSG_CONT_2_LATITUDE_LEN, dataChunk);
|
||||
break;
|
||||
case L2_MSG_TK_CONT_3:
|
||||
|
||||
// Word tag
|
||||
dataChunk = 2;
|
||||
FrameInsertChunk(bitarr, TK_MSG_CONT_3_WTAG_OFFSET, TK_MSG_CONT_3_WTAG_LEN, dataChunk);
|
||||
|
||||
// Continue word identification.
|
||||
dataChunk = 3;
|
||||
FrameInsertChunk(bitarr, TK_MSG_CONT_3_CONTID_OFFSET, TK_MSG_CONT_3_CONTID_LEN, dataChunk);
|
||||
|
||||
// source node id
|
||||
dataChunk = (instPtr->myInfo.nodeId & 0x1F)
|
||||
| (((uint16_t) (instPtr->myInfo.clustId & 0x1F)) << 5);
|
||||
FrameInsertChunk(bitarr, TK_MSG_CONT_3_MEMBER_ADDR_OFFSET, TK_MSG_CONT_3_MEMBER_ADDR_LEN, dataChunk);
|
||||
|
||||
// East speed
|
||||
dataChunk = 0xBBBB;
|
||||
FrameInsertChunk(bitarr, TK_MSG_CONT_3_EAST_ACC_OFFSET, TK_MSG_CONT_3_EAST_ACC_LEN, dataChunk);
|
||||
|
||||
// North speed
|
||||
dataChunk = 0xCCCC;
|
||||
FrameInsertChunk(bitarr, TK_MSG_CONT_3_NORTH_ACC_OFFSET, TK_MSG_CONT_3_NORTH_ACC_LEN, dataChunk);
|
||||
|
||||
// Upper speed
|
||||
dataChunk = 0xDDDD;
|
||||
FrameInsertChunk(bitarr, TK_MSG_CONT_3_UPPER_ACC_OFFSET, TK_MSG_CONT_3_UPPER_ACC_LEN, dataChunk);
|
||||
|
||||
break;
|
||||
|
||||
case L2_MSG_TA_INIT:
|
||||
|
||||
// Word tag
|
||||
dataChunk = 3;
|
||||
FrameInsertChunk(bitarr, TA_MSG_WTAG_OFFSET, TA_MSG_WTAG_LEN, dataChunk);
|
||||
|
||||
// Msg tag
|
||||
dataChunk = 29;
|
||||
FrameInsertChunk(bitarr, TA_MSG_MSG_TAG_OFFSET, TA_MSG_MSG_TAG_LEN, dataChunk);
|
||||
|
||||
// Sub msg tag
|
||||
dataChunk = 0;
|
||||
FrameInsertChunk(bitarr, TA_MSG_MSG_STAG_OFFSET, TA_MSG_MSG_STAG_LEN, dataChunk);
|
||||
|
||||
// Source node id
|
||||
dataChunk = (instPtr->myInfo.nodeId & 0x1F)
|
||||
| (((uint16_t) (instPtr->myInfo.clustId & 0x1F)) << 5);
|
||||
FrameInsertChunk(bitarr, TA_MSG_SRC_ADDR_OFFSET, TA_MSG_SRC_ADDR_LEN, dataChunk);
|
||||
|
||||
// Height
|
||||
dataChunk = 0xEEEEEE;
|
||||
FrameInsertChunk(bitarr, TA_MSG_HEIGHT_OFFSET, TA_MSG_HEIGHT_LEN, dataChunk);
|
||||
|
||||
break;
|
||||
case L2_MSG_TA_EXTD:
|
||||
|
||||
// Longitude
|
||||
dataChunk = 0xAAAAAAAA;
|
||||
FrameInsertChunk(bitarr, TA_MSG_EX_LONGITUDE_OFFSET, TA_MSG_EX_LONGITUDE_LEN, dataChunk);
|
||||
|
||||
// Latitude
|
||||
dataChunk = 0xBBBBBBBB;
|
||||
FrameInsertChunk(bitarr, TA_MSG_EX_LATITUDE_OFFSET, TA_MSG_EX_LATITUDE_LEN, dataChunk);
|
||||
|
||||
break;
|
||||
case L2_MSG_TA_CONT_1:
|
||||
|
||||
// Time tag
|
||||
dataChunk = 0xCCCCCCCCCCCC;
|
||||
FrameInsertChunk(bitarr, TA_MSG_CONT_1_TIME_TAG_OFFSET, TA_MSG_CONT_1_TIME_TAG_LEN, dataChunk);
|
||||
|
||||
break;
|
||||
case L2_MSG_TA_CONT_2:
|
||||
|
||||
// East speed
|
||||
dataChunk = 0xBBBB;
|
||||
FrameInsertChunk(bitarr, TA_MSG_CONT_2_EAST_OFFSET, TA_MSG_CONT_2_EAST_LEN, dataChunk);
|
||||
|
||||
// North speed
|
||||
dataChunk = 0xCCCC;
|
||||
FrameInsertChunk(bitarr, TA_MSG_CONT_2_NORTH_OFFSET, TA_MSG_CONT_2_NORTH_LEN, dataChunk);
|
||||
|
||||
// Upper speed
|
||||
dataChunk = 0xDDDD;
|
||||
FrameInsertChunk(bitarr, TA_MSG_CONT_2_UPPER_OFFSET, TA_MSG_CONT_2_UPPER_LEN, dataChunk);
|
||||
|
||||
break;
|
||||
case L2_MSG_MADJ_INIT:
|
||||
break;
|
||||
case L2_MSG_MADJ_EXTD:
|
||||
break;
|
||||
case L2_MSG_RTT_REQ_INIT:
|
||||
// Series tag
|
||||
dataChunk = 0;
|
||||
FrameInsertChunk(bitarr, RTT_REQ_SER_TAG_OFFSET, RTT_REQ_SER_TAG_LEN, dataChunk);
|
||||
|
||||
// Word tag
|
||||
dataChunk = 3;
|
||||
FrameInsertChunk(bitarr, RTT_REQ_WTAG_OFFSET, RTT_REQ_WTAG_LEN, dataChunk);
|
||||
|
||||
// message identification.
|
||||
dataChunk = 29;
|
||||
FrameInsertChunk(bitarr, RTT_REQ_MSG_TAG_OFFSET, RTT_REQ_MSG_TAG_LEN, dataChunk);
|
||||
|
||||
// message identification.
|
||||
dataChunk = 1;
|
||||
FrameInsertChunk(bitarr, RTT_REQ_MSG_STAG_OFFSET, RTT_REQ_MSG_STAG_LEN, dataChunk);
|
||||
|
||||
// message length.
|
||||
dataChunk = 2; //request
|
||||
FrameInsertChunk(bitarr, RTT_REQ_MSG_OFFSET, RTT_REQ_MSG_LEN, dataChunk);
|
||||
|
||||
// source node address length.
|
||||
dataChunk = (instPtr->myInfo.nodeId & 0x1F)
|
||||
| (((uint16_t) (instPtr->myInfo.clustId & 0x1F)) << 5);
|
||||
FrameInsertChunk(bitarr, RTT_REQ_SRC_ADDR_OFFSET, RTT_REQ_SRC_ADDR_LEN, dataChunk);
|
||||
|
||||
// destination node address length.
|
||||
dataChunk = (0x02) | (((uint16_t) (instPtr->myInfo.clustId & 0x1F)) << 5);
|
||||
FrameInsertChunk(bitarr, RTT_REQ_DST_ADDR_OFFSET, RTT_REQ_DST_ADDR_LEN, dataChunk);
|
||||
break;
|
||||
|
||||
case L2_MSG_RTT_REQ_EXTD:
|
||||
// Word tag
|
||||
dataChunk = 1;
|
||||
FrameInsertChunk(bitarr, RTT_REQ_EX_WTAG_OFFSET, RTT_REQ_EX_WTAG_LEN, dataChunk);
|
||||
|
||||
// Time tag Low.
|
||||
dataChunk = instPtr->mgmtNetFSM->rttData.rttTime.timeL;
|
||||
FrameInsertChunk(bitarr, RTT_REQ_EX_TTAGL_OFFSET, RTT_REQ_EX_TTAGL_LEN, dataChunk);
|
||||
|
||||
// Time tag High.
|
||||
dataChunk = instPtr->mgmtNetFSM->rttData.rttTime.timeH;
|
||||
FrameInsertChunk(bitarr, RTT_REQ_EX_TTAGH_OFFSET, RTT_REQ_EX_TTAGH_LEN, dataChunk);
|
||||
break;
|
||||
case L2_MSG_RTT_REQ_CONT:
|
||||
// Doppler
|
||||
dataChunk = instPtr->mgmtNetFSM->rttData.rttDoppler;
|
||||
FrameInsertChunk(bitarr, RTT_REQ_CONT_DOP_OFFSET, RTT_REQ_CONT_DOP_LEN, dataChunk);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////
|
||||
break;
|
||||
case L2_MSG_RTT_RSP_INIT:
|
||||
// Series tag
|
||||
dataChunk = 0;
|
||||
FrameInsertChunk(bitarr, RTT_RSP_SER_TAG_OFFSET, RTT_RSP_SER_TAG_LEN, dataChunk);
|
||||
|
||||
// Word tag
|
||||
dataChunk = 3;
|
||||
FrameInsertChunk(bitarr, RTT_RSP_WTAG_OFFSET, RTT_RSP_WTAG_LEN, dataChunk);
|
||||
|
||||
// message identification.
|
||||
dataChunk = 29;
|
||||
FrameInsertChunk(bitarr, RTT_RSP_MSG_TAG_OFFSET,
|
||||
RTT_RSP_MSG_TAG_LEN, dataChunk);
|
||||
|
||||
// message identification.
|
||||
dataChunk = 2; // response
|
||||
FrameInsertChunk(bitarr, RTT_RSP_MSG_STAG_OFFSET, RTT_RSP_MSG_STAG_LEN, dataChunk);
|
||||
|
||||
// message length.
|
||||
dataChunk = 2;
|
||||
FrameInsertChunk(bitarr, RTT_RSP_MSG_OFFSET, RTT_RSP_MSG_LEN, dataChunk);
|
||||
|
||||
// source node address length.
|
||||
dataChunk = (instPtr->myInfo.nodeId & 0x1F)
|
||||
| (((uint16_t) (instPtr->myInfo.clustId & 0x1F)) << 5);
|
||||
FrameInsertChunk(bitarr, RTT_RSP_SRC_ADDR_OFFSET, RTT_RSP_SRC_ADDR_LEN, dataChunk);
|
||||
|
||||
// destination node address length.
|
||||
dataChunk = (0x01) | (((uint16_t) (instPtr->myInfo.clustId & 0x1F)) << 5);
|
||||
FrameInsertChunk(bitarr, RTT_RSP_DST_ADDR_OFFSET, RTT_RSP_DST_ADDR_LEN, dataChunk);
|
||||
break;
|
||||
case L2_MSG_RTT_RSP_EXTD:
|
||||
|
||||
// Word tag
|
||||
dataChunk = 1;
|
||||
FrameInsertChunk(bitarr, RTT_RSP_EX_WTAG_OFFSET, RTT_RSP_EX_WTAG_LEN, dataChunk);
|
||||
|
||||
// Time tag Low.
|
||||
dataChunk = instPtr->mgmtNetFSM->rttData.rttTime.timeL;
|
||||
FrameInsertChunk(bitarr, RTT_RSP_EX_TTAGL_OFFSET, RTT_RSP_EX_TTAGL_LEN, dataChunk);
|
||||
|
||||
// Time tag High.
|
||||
dataChunk = instPtr->mgmtNetFSM->rttData.rttTime.timeH;
|
||||
FrameInsertChunk(bitarr, RTT_RSP_EX_TTAGH_OFFSET, RTT_RSP_EX_TTAGH_LEN, dataChunk);
|
||||
break;
|
||||
case L2_MSG_RTT_RSP_CONT:
|
||||
// Doppler
|
||||
dataChunk = instPtr->mgmtNetFSM->rttData.rttDoppler;
|
||||
FrameInsertChunk(bitarr, RTT_RSP_CONT_DOP_OFFSET, RTT_RSP_CONT_DOP_LEN, dataChunk);
|
||||
break;
|
||||
case L2_MSG_NQT_INIT:
|
||||
// if (priorInfo.myType == MEMBER_NODE && ( L2_GetCurrentFrameNo() == ( myInfo->netScanTime + TIME2QUIT ) )) {
|
||||
// // word tag
|
||||
// dataChunk = 3;
|
||||
// FrameInsertChunk(bitarr, NQT_MSG_WTAG_OFFSET,
|
||||
// NQT_MSG_WTAG_LEN, dataChunk);
|
||||
//
|
||||
// // msg tag
|
||||
// dataChunk = 30;
|
||||
// FrameInsertChunk(bitarr, NQT_MSG_MSG_TAG_OFFSET,
|
||||
// NQT_MSG_MSG_TAG_LEN, dataChunk);
|
||||
//
|
||||
// // msg sub tag
|
||||
// dataChunk = 1;
|
||||
// FrameInsertChunk(bitarr, NQT_MSG_MSG_STAG_OFFSET,
|
||||
// NQT_MSG_MSG_STAG_LEN, dataChunk);
|
||||
//
|
||||
// // msg length
|
||||
// dataChunk = 0;
|
||||
// FrameInsertChunk(bitarr, NQT_MSG_MSG_OFFSET,
|
||||
// NQT_MSG_MSG_LEN, dataChunk);
|
||||
//
|
||||
// // Ctrol Word
|
||||
// dataChunk = 1;
|
||||
// FrameInsertChunk(bitarr, NQT_MSG_CTRL_MUTE_OFFSET,
|
||||
// NQT_MSG_CTRL_MUTE_LEN, dataChunk);
|
||||
//
|
||||
// // Quit object
|
||||
// dataChunk = (priorInfo.myId & 0x1F)
|
||||
// | (((uint16_t) (priorInfo.clustId & 0x1F)) << 5);
|
||||
// FrameInsertChunk(bitarr, NQT_MSG_OBJ_OFFSET,
|
||||
// NQT_MSG_OBJ_LEN, dataChunk);
|
||||
// L2_NODE_STATE newState = INIT_STATE;
|
||||
// L2_EVENT stateEvent = {
|
||||
// .event = L2_EV_MAIN_STATE_UPDATE,
|
||||
// .msg = &newState
|
||||
// };
|
||||
// AssertL2Event(&stateEvent);
|
||||
// L2_EVENT lostCxnEvent = {
|
||||
// .event = L2_EV_LOST_CXN,
|
||||
// .msg = NULL
|
||||
// };
|
||||
// AssertL2Event(&lostCxnEvent);
|
||||
// }
|
||||
break;
|
||||
case L2_MSG_CMG_INIT:
|
||||
break;
|
||||
case L2_MSG_BCU_INIT:
|
||||
break;
|
||||
default:
|
||||
return EPARAM;
|
||||
break;
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int32_t MgmtPkt_Packing(L2_INST* instPtr, MGMTPKT_TYPE pktType) {
|
||||
ASSERT(instPtr != NULL);
|
||||
uint8_t* buff = instPtr->sendPktData;
|
||||
uint32_t filedSize = 0;
|
||||
BIT_ARRAY* mgmtPkt = bit_array_create(L2_MSG_MAX);
|
||||
if (mgmtPkt == NULL) {
|
||||
DBG_ERROR("Failed to allocate memory for scanMsg.\n");
|
||||
return NUM_SLOTS_NONE;
|
||||
}
|
||||
switch (pktType) {
|
||||
case MGMTPKT_INTRA_MGMT:
|
||||
for (int i = 0; i < ARRAY_SIZE(intraMgmtFrameMsgs); i++) {
|
||||
if (MgmtMsg_Packing(instPtr, mgmtPkt, intraMgmtFrameMsgs[i]) == SUCCESS) {
|
||||
memcpy((uint8_t*)buff + (size_t) (i * (MGMT_MSG_LEN / 8)),
|
||||
mgmtPkt->words, (size_t) (MGMT_MSG_LEN / 8));
|
||||
}
|
||||
else {
|
||||
DBG_ERROR("Failed to packing intraMgmtFrameMsgs[%d].\n", i);
|
||||
goto failed;
|
||||
}
|
||||
filedSize += MGMT_MSG_LEN;
|
||||
if (filedSize / 8 >= INTRA_MGMT_FRAME_LENGTH_MAX) {
|
||||
DBG_ERROR("Message is too long to be properly packed.\n");
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case MGMTPKT_INTRA_RTTREQ:
|
||||
for(int i = 0; i < ARRAY_SIZE(rttReqFrameMsgs); i++) {
|
||||
if (MgmtMsg_Packing(instPtr, mgmtPkt, rttReqFrameMsgs[i]) == SUCCESS) {
|
||||
memcpy(buff + (size_t)(i * (MGMT_MSG_LEN / 8)),
|
||||
mgmtPkt->words,
|
||||
(size_t)(MGMT_MSG_LEN / 8));
|
||||
}
|
||||
else {
|
||||
DBG_ERROR("Failed to packing rttReqFrameMsgs[%d].\n", i);
|
||||
goto failed;
|
||||
}
|
||||
filedSize += MGMT_MSG_LEN;
|
||||
if (filedSize / 8 >= INTRA_MGMT_FRAME_LENGTH_MAX) {
|
||||
DBG_ERROR("Message is too long to be properly packed.\n");
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case MGMTPKT_INTRA_RTTRSP:
|
||||
for (int i = 0; i < ARRAY_SIZE(rttRspFrameMsgs); i++) {
|
||||
if (MgmtMsg_Packing(instPtr, mgmtPkt, rttRspFrameMsgs[i]) == SUCCESS) {
|
||||
memcpy(buff + (size_t) (i * (MGMT_MSG_LEN / 8)),
|
||||
mgmtPkt->words,
|
||||
(size_t) (MGMT_MSG_LEN / 8));
|
||||
}
|
||||
else {
|
||||
DBG_ERROR("Failed to packing rttRspFrameMsgs[%d].\n", i);
|
||||
goto failed;
|
||||
}
|
||||
filedSize += MGMT_MSG_LEN;
|
||||
if (filedSize / 8 >= INTRA_MGMT_FRAME_LENGTH_MAX) {
|
||||
DBG_ERROR("Message is too long to be properly packed.\n");
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
DBG_ERROR("Scan Packet type [%d] is not surpported yet.\n", pktType);
|
||||
goto failed;
|
||||
}
|
||||
bit_array_free(mgmtPkt);
|
||||
return SUCCESS;
|
||||
failed:
|
||||
bit_array_free(mgmtPkt);
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief initialize the management FSM instance.
|
||||
*
|
||||
* @param mgmtFSM A second rank pointer to management FSM instance.
|
||||
*
|
||||
* @return SUCCESS Initialize successfully
|
||||
* EALLOC Memory allocation error.
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t MgmtNet_Init(L2_MGMT_FSM** mgmtFSM) {
|
||||
(*mgmtFSM) = (L2_MGMT_FSM*) malloc(sizeof(L2_MGMT_FSM));
|
||||
if (*mgmtFSM == NULL) {
|
||||
return EALLOC;
|
||||
}
|
||||
MgmtNet_Reset(*mgmtFSM);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
void MgmtNet_Reset(L2_MGMT_FSM* mgmtFSM) {
|
||||
mgmtFSM->isBisarProc = false;
|
||||
mgmtFSM->isPendSlotAlloc = false;
|
||||
mgmtFSM->isPendTimeAlloc = false;
|
||||
|
||||
mgmtFSM->mgmtMsgLog.nextNetState = NONE_STATE;
|
||||
mgmtFSM->mgmtMsgLog.isValid = false;
|
||||
mgmtFSM->mgmtMsgLog.quitCtrlWord = 0;
|
||||
mgmtFSM->mgmtMsgLog.quitNodeId = 0;
|
||||
mgmtFSM->mgmtMsgLog.msgSubTag = 0 ;
|
||||
mgmtFSM->mgmtMsgLog.msgTag = 0;
|
||||
mgmtFSM->mgmtMsgLog.wordTag = 0;
|
||||
mgmtFSM->mgmtMsgLog.srcNodeId = 0;
|
||||
|
||||
// Position value
|
||||
mgmtFSM->mgmtMsgLog.EastSpeed = 0 ;
|
||||
mgmtFSM->mgmtMsgLog.NorthSpeed = 0 ;
|
||||
mgmtFSM->mgmtMsgLog.UpperSpeed = 0 ;
|
||||
mgmtFSM->mgmtMsgLog.Height = 0 ;
|
||||
mgmtFSM->mgmtMsgLog.Longitude = 0 ;
|
||||
mgmtFSM->mgmtMsgLog.Latitude = 0 ;
|
||||
|
||||
// clear buffer.
|
||||
memset(&(mgmtFSM->rttMsgRspLog), 0x00, sizeof(RTT_MSG_RECORD));
|
||||
memset(&(mgmtFSM->rttMsgReqLog), 0x00, sizeof(RTT_MSG_RECORD));
|
||||
memset(&(mgmtFSM->rttData), 0x00, sizeof(RTT_DATA));
|
||||
}
|
||||
|
||||
void MgmtNet_Destroy(L2_MGMT_FSM* mgmtFSM){
|
||||
free(mgmtFSM);
|
||||
}
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Handles management net packet, apply time sync and other management
|
||||
* net functions.
|
||||
*
|
||||
* @param msg A pointer to packet data buffer.
|
||||
*
|
||||
* @return SUCCESS Packet was successfully handled.
|
||||
* Other Packed was dumped(not addressed to me, unrecognized frame type)
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t MgmtNet_PktHandler(L2_INST* instPtr) {
|
||||
ASSERT(instPtr != NULL);
|
||||
int32_t Status;
|
||||
uint32_t filedSize = 0;
|
||||
uint64_t dataChunk = 0;
|
||||
MGMT_MSG_RECORD *mgmtMsgLog = &(instPtr->mgmtNetFSM->mgmtMsgLog);
|
||||
RTT_MSG_RECORD *rttMsgRspLog = &(instPtr->mgmtNetFSM->rttMsgRspLog);
|
||||
RTT_MSG_RECORD *rttMsgReqLog = &(instPtr->mgmtNetFSM->rttMsgReqLog);
|
||||
|
||||
BIT_ARRAY* mgmtMsg = bit_array_create(L2_MSG_MAX);
|
||||
if (mgmtMsg == NULL) {
|
||||
free(mgmtMsg);
|
||||
return EALLOC;
|
||||
}
|
||||
switch (L2_GetLastRcvFrameType(instPtr)) {
|
||||
case L2_INTER_MGMT_FRAME:
|
||||
case L2_INTRA_MGMT_FRAME: {
|
||||
for (int i = 0; i < ARRAY_SIZE(intraMgmtFrameMsgs); i++) {
|
||||
memcpy(mgmtMsg->words,
|
||||
instPtr->recvPktData + (size_t) (i * (MGMT_MSG_LEN / 8)),
|
||||
(size_t) (MGMT_MSG_LEN / 8));
|
||||
switch (intraMgmtFrameMsgs[i]) {
|
||||
case L2_MSG_TK_INIT:
|
||||
FrameGetChunk(mgmtMsg, TK_MSG_INI_NET_STATE_OFFSET, TK_MSG_INI_NET_STATE_LEN, &dataChunk);
|
||||
mgmtMsgLog->nextNetState = (uint8_t) (dataChunk);
|
||||
|
||||
FrameGetChunk(mgmtMsg, TK_MSG_INI_WTAG_OFFSET, TK_MSG_INI_WTAG_LEN, &dataChunk);
|
||||
mgmtMsgLog->wordTag = (uint8_t) (dataChunk);
|
||||
|
||||
FrameGetChunk(mgmtMsg, TK_MSG_INI_TAG_OFFSET, TK_MSG_INI_TAG_LEN, &dataChunk);
|
||||
mgmtMsgLog->msgTag = (uint8_t) (dataChunk);
|
||||
|
||||
FrameGetChunk(mgmtMsg, TK_MSG_INI_STAG_OFFSET, TK_MSG_INI_STAG_LEN, &dataChunk);
|
||||
mgmtMsgLog->msgSubTag = (uint8_t) (dataChunk);
|
||||
|
||||
if ( mgmtMsgLog->wordTag == 3
|
||||
&& mgmtMsgLog->msgTag == 28
|
||||
&& mgmtMsgLog->msgSubTag == 1 ) {
|
||||
mgmtMsgLog->isValid = true;
|
||||
}
|
||||
else {
|
||||
mgmtMsgLog->isValid = false ;
|
||||
}
|
||||
break;
|
||||
case L2_MSG_TK_EXTD :
|
||||
FrameGetChunk(mgmtMsg, TK_MSG_EXTEND_EAST_SPEED_OFFSET, TK_MSG_EXTEND_EAST_SPEED_LEN, &dataChunk);
|
||||
mgmtMsgLog->EastSpeed = (uint16_t) (dataChunk);
|
||||
|
||||
break;
|
||||
case L2_MSG_TK_CONT_1:
|
||||
FrameGetChunk(mgmtMsg, TK_MSG_EXTEND_EAST_SPEED_OFFSET, TK_MSG_EXTEND_EAST_SPEED_LEN, &dataChunk);
|
||||
mgmtMsgLog->EastSpeed = (uint16_t) (dataChunk);
|
||||
|
||||
FrameGetChunk(mgmtMsg, TK_MSG_CONT_1_NORTH_SPEED_OFFSET, TK_MSG_CONT_1_NORTH_SPEED_LEN, &dataChunk);
|
||||
mgmtMsgLog->NorthSpeed = (uint16_t) (dataChunk);
|
||||
|
||||
FrameGetChunk(mgmtMsg, TK_MSG_CONT_1_UPPER_SPEED_OFFSET, TK_MSG_CONT_1_UPPER_SPEED_LEN, &dataChunk);
|
||||
mgmtMsgLog->UpperSpeed = (uint16_t) (dataChunk);
|
||||
|
||||
FrameGetChunk(mgmtMsg, TK_MSG_CONT_1_HEIGHT_OFFSET, TK_MSG_CONT_1_HEIGHT_LEN, &dataChunk);
|
||||
mgmtMsgLog->Height = (uint32_t) (dataChunk);
|
||||
|
||||
break;
|
||||
case L2_MSG_TK_CONT_2:
|
||||
FrameGetChunk(mgmtMsg, TK_MSG_CONT_2_LONGITUDE_OFFSET, TK_MSG_CONT_2_LONGITUDE_LEN, &dataChunk);
|
||||
mgmtMsgLog->Longitude = (uint32_t) (dataChunk);
|
||||
|
||||
FrameGetChunk(mgmtMsg, TK_MSG_CONT_2_LATITUDE_OFFSET, TK_MSG_CONT_2_LATITUDE_LEN, &dataChunk);
|
||||
mgmtMsgLog->Latitude = (uint32_t) (dataChunk);
|
||||
|
||||
break;
|
||||
case L2_MSG_TK_CONT_3:
|
||||
FrameGetChunk(mgmtMsg, TK_MSG_CONT_3_MEMBER_ADDR_OFFSET, TK_MSG_CONT_3_MEMBER_ADDR_LEN, &dataChunk);
|
||||
mgmtMsgLog->srcNodeId = (uint8_t) (dataChunk & 0x1F);
|
||||
|
||||
break;
|
||||
case L2_MSG_NQT_INIT:
|
||||
FrameGetChunk(mgmtMsg, NQT_MSG_OBJ_OFFSET, NQT_MSG_OBJ_LEN, &dataChunk);
|
||||
mgmtMsgLog->quitNodeId = (uint8_t) (dataChunk & 0x1F);
|
||||
if (mgmtMsgLog->quitNodeId != instPtr->myInfo.nodeId) {
|
||||
FrameGetChunk(mgmtMsg, NQT_MSG_CTRL_MUTE_OFFSET, NQT_MSG_CTRL_MUTE_LEN, &dataChunk);
|
||||
mgmtMsgLog->quitCtrlWord = (uint8_t)(dataChunk & 0x7F);
|
||||
if (mgmtMsgLog->quitCtrlWord == 0x01) {
|
||||
DeletNode(instPtr->nodeList, mgmtMsgLog->quitNodeId);
|
||||
}
|
||||
}
|
||||
else {
|
||||
DBG_WARNING("Ignore node quit request(ID not mine), target node id is [%d]\n", mgmtMsgLog->quitNodeId);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
DBG_ERROR("Cannot decapsulate message type [%d] in L2_INTRA_MGMT_FRAME.\n", intraMgmtFrameMsgs[i]);
|
||||
Status = EPARAM;
|
||||
goto failed;
|
||||
}
|
||||
filedSize += MGMT_MSG_LEN;
|
||||
if (filedSize / 8 >= INTRA_MGMT_FRAME_LENGTH_MAX) {
|
||||
DBG_ERROR("Message decapsulate exceeds frame length.\n");
|
||||
Status = EPARAM;
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
// Member Node update state with received message
|
||||
if(instPtr->myInfo.nodeId != HEAD_NODE && mgmtMsgLog->isValid == true ){
|
||||
L2_NODE_STATE newState = NONE_STATE;
|
||||
// FIXME :
|
||||
switch (mgmtMsgLog->nextNetState) {
|
||||
case NET_INI_STAGE:
|
||||
newState = INIT_STATE;
|
||||
break;
|
||||
case NET_NORMAL_STAGE:
|
||||
newState = NORMAL_STATE;
|
||||
break;
|
||||
case NET_INTRA_SEEK_STAGE:
|
||||
newState = INTRA_SEEK_STATE;
|
||||
break;
|
||||
case NET_INTER_SEEK_STAGE:
|
||||
newState = INTER_SEEK_STATE;
|
||||
break;
|
||||
case NET_SEEK_STAGE:
|
||||
newState = SEEK_STATE;
|
||||
break;
|
||||
default:
|
||||
DBG_WARNING("Unknown Head node state [%d].\n", mgmtMsgLog->nextNetState);
|
||||
newState = L2_GetMainState(instPtr);
|
||||
break;
|
||||
}
|
||||
L2_EVENT stateUpEvent = {
|
||||
.event = L2_EV_MAIN_STATE_UPDATE,
|
||||
.msg = &newState
|
||||
};
|
||||
AssertL2Event(instPtr, &stateUpEvent);
|
||||
}
|
||||
// TODO: Reset of tracking message src
|
||||
RstNodeTTL(instPtr->nodeList, mgmtMsgLog->srcNodeId);
|
||||
|
||||
if(mgmtMsgLog->srcNodeId == instPtr->config.headId){
|
||||
L2_TimeAlign(instPtr, L2_GetCurrentFrameNum(instPtr), L2_GetCurrentSlotNum(instPtr));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case L2_INTER_TSYNC_FRAME:
|
||||
case L2_INTRA_TSYNC_FRAME: {
|
||||
L2_RTT_FSM* rttFsmPtr = L2_GetRttDesc(instPtr);
|
||||
L2_RTT_SATGE rttStage = RTT_GetCurrentStage(rttFsmPtr);
|
||||
if(rttStage == RTT_REQ1 || rttStage == RTT_REQ2){
|
||||
for (int i = 0; i < ARRAY_SIZE(rttReqFrameMsgs); i++) {
|
||||
memcpy(mgmtMsg->words,
|
||||
instPtr->recvPktData + (size_t) (i * (RTT_MSG_LEN / 8)),
|
||||
(size_t) (RTT_MSG_LEN / 8));
|
||||
switch (rttReqFrameMsgs[i]) {
|
||||
case L2_MSG_RTT_REQ_INIT:
|
||||
FrameGetChunk(mgmtMsg, RTT_REQ_WTAG_OFFSET, RTT_REQ_WTAG_LEN, &dataChunk);
|
||||
rttMsgReqLog->wordTag = (uint16_t) (dataChunk);
|
||||
|
||||
FrameGetChunk(mgmtMsg, RTT_REQ_MSG_TAG_OFFSET, RTT_REQ_MSG_TAG_LEN, &dataChunk);
|
||||
rttMsgReqLog->msgTag = (uint16_t) (dataChunk);
|
||||
|
||||
FrameGetChunk(mgmtMsg, RTT_REQ_MSG_STAG_OFFSET, RTT_REQ_MSG_STAG_LEN, &dataChunk);
|
||||
rttMsgReqLog->msgSubTag = (uint16_t) (dataChunk);
|
||||
|
||||
FrameGetChunk(mgmtMsg, RTT_REQ_MSG_OFFSET, RTT_REQ_MSG_LEN, &dataChunk);
|
||||
rttMsgReqLog->msgLen = (uint16_t) (dataChunk);
|
||||
|
||||
FrameGetChunk(mgmtMsg, RTT_REQ_SRC_ADDR_OFFSET, RTT_REQ_SRC_ADDR_LEN, &dataChunk);
|
||||
rttMsgReqLog->srcAddr = (uint16_t) (dataChunk);
|
||||
|
||||
FrameGetChunk(mgmtMsg, RTT_REQ_DST_ADDR_OFFSET, RTT_REQ_DST_ADDR_LEN, &dataChunk);
|
||||
rttMsgReqLog->dstAddr = (uint16_t) (dataChunk);
|
||||
|
||||
break;
|
||||
case L2_MSG_RTT_REQ_EXTD:
|
||||
FrameGetChunk(mgmtMsg, RTT_REQ_EX_TTAGL_OFFSET, RTT_REQ_EX_TTAGL_LEN, &dataChunk);
|
||||
rttMsgReqLog->timeWordL = (uint32_t) (dataChunk);
|
||||
|
||||
FrameGetChunk(mgmtMsg, RTT_REQ_EX_TTAGH_OFFSET, RTT_REQ_EX_TTAGH_LEN, &dataChunk);
|
||||
rttMsgReqLog->timeWordH = (uint32_t) (dataChunk);
|
||||
|
||||
break;
|
||||
case L2_MSG_RTT_REQ_CONT:
|
||||
FrameGetChunk(mgmtMsg, RTT_REQ_CONT_DOP_OFFSET, RTT_REQ_CONT_DOP_LEN, &dataChunk);
|
||||
rttMsgReqLog->doppler = (int32_t) (dataChunk);
|
||||
|
||||
break;
|
||||
default:
|
||||
DBG_ERROR("Cannot decapsulate message type [%d] in L2_INTRA_TSYNC_FRAME.\n", rttReqFrameMsgs[i]);
|
||||
Status = EPARAM;
|
||||
goto failed;
|
||||
}
|
||||
filedSize += RTT_MSG_LEN;
|
||||
if (filedSize / 8 >= INTRA_RTT_FRAME_LENGTH_MAX) {
|
||||
DBG_ERROR("Message decapsulate exceeds frame length.\n");
|
||||
Status = EPARAM;
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(rttStage == RTT_RSP1 || rttStage == RTT_RSP2){
|
||||
for (int i = 0; i < ARRAY_SIZE(rttRspFrameMsgs); i++) {
|
||||
memcpy(mgmtMsg->words,
|
||||
instPtr->recvPktData + (size_t) (i * (RTT_MSG_LEN / 8)),
|
||||
(size_t) (RTT_MSG_LEN / 8));
|
||||
switch (rttRspFrameMsgs[i]) {
|
||||
case L2_MSG_RTT_RSP_INIT:
|
||||
FrameGetChunk(mgmtMsg, RTT_RSP_WTAG_OFFSET, RTT_RSP_WTAG_LEN, &dataChunk);
|
||||
rttMsgRspLog->wordTag = (uint16_t) (dataChunk);
|
||||
|
||||
FrameGetChunk(mgmtMsg, RTT_RSP_MSG_TAG_OFFSET, RTT_RSP_MSG_TAG_LEN, &dataChunk);
|
||||
rttMsgRspLog->msgTag = (uint16_t) (dataChunk);
|
||||
|
||||
FrameGetChunk(mgmtMsg, RTT_RSP_MSG_STAG_OFFSET, RTT_RSP_MSG_STAG_LEN, &dataChunk);
|
||||
rttMsgRspLog->msgSubTag = (uint16_t) (dataChunk);
|
||||
|
||||
FrameGetChunk(mgmtMsg, RTT_RSP_MSG_OFFSET, RTT_RSP_MSG_LEN, &dataChunk);
|
||||
rttMsgRspLog->msgLen = (uint16_t) (dataChunk);
|
||||
|
||||
FrameGetChunk(mgmtMsg, RTT_RSP_SRC_ADDR_OFFSET, RTT_RSP_SRC_ADDR_LEN, &dataChunk);
|
||||
rttMsgRspLog->srcAddr = (uint16_t) (dataChunk);
|
||||
|
||||
FrameGetChunk(mgmtMsg, RTT_RSP_DST_ADDR_OFFSET, RTT_RSP_DST_ADDR_LEN, &dataChunk);
|
||||
rttMsgRspLog->dstAddr = (uint16_t) (dataChunk);
|
||||
|
||||
break;
|
||||
case L2_MSG_RTT_RSP_EXTD:
|
||||
FrameGetChunk(mgmtMsg, RTT_RSP_EX_TTAGL_OFFSET, RTT_RSP_EX_TTAGL_LEN, &dataChunk);
|
||||
rttMsgRspLog->timeWordL = (uint32_t) (dataChunk);
|
||||
|
||||
FrameGetChunk(mgmtMsg, RTT_RSP_EX_TTAGH_OFFSET, RTT_RSP_EX_TTAGH_LEN, &dataChunk);
|
||||
rttMsgRspLog->timeWordH = (uint32_t) (dataChunk);
|
||||
|
||||
break;
|
||||
case L2_MSG_RTT_RSP_CONT:
|
||||
FrameGetChunk(mgmtMsg, RTT_RSP_CONT_DOP_OFFSET,
|
||||
RTT_RSP_CONT_DOP_LEN, &dataChunk);
|
||||
rttMsgRspLog->doppler = (int32_t) (dataChunk);
|
||||
|
||||
break;
|
||||
default:
|
||||
DBG_ERROR("Cannot decapsulate message type [%d] in L2_INTRA_TSYNC_FRAME.\n", rttRspFrameMsgs[i]);
|
||||
Status = EPARAM;
|
||||
goto failed;
|
||||
}
|
||||
filedSize += RTT_MSG_LEN;
|
||||
if (filedSize / 8 >= INTRA_RTT_FRAME_LENGTH_MAX) {
|
||||
DBG_ERROR("Message decapsulate exceeds frame length.\n");
|
||||
Status = EPARAM;
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
}
|
||||
// TODO: Reset of tracking message src
|
||||
RstNodeTTL(instPtr->nodeList, rttMsgRspLog->srcAddr & 0x001F);
|
||||
if((rttMsgRspLog->srcAddr&0x001F) == instPtr->config.headId){
|
||||
L2_TimeAlign(instPtr, L2_GetCurrentFrameNum(instPtr), L2_GetCurrentSlotNum(instPtr));
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
DBG_ERROR("Cannot handle frame type [%d] properly.\n", L2_GetLastRcvFrameType(instPtr));
|
||||
Status = EPARAM;
|
||||
goto failed;
|
||||
}
|
||||
bit_array_free(mgmtMsg);
|
||||
return SUCCESS;
|
||||
failed:
|
||||
bit_array_free(mgmtMsg);
|
||||
return Status;
|
||||
}
|
||||
|
||||
// helper function
|
||||
static bool IsTTLValid(NODE_ENTRY* entry) {
|
||||
ASSERT(entry != NULL);
|
||||
return (entry->ttlCnt <= CONN_LOST_TH);
|
||||
}
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Management net FSM procedure.
|
||||
*
|
||||
* @param mgmtFSM
|
||||
* mainState
|
||||
*
|
||||
* @return Slot has be used.
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t MgmtNet_Routine(L2_INST* instPtr, const L2_RTNE_TABLE_ENTRY* rtneEntry){
|
||||
ASSERT(instPtr != NULL);
|
||||
int32_t Status;
|
||||
RTT_DATA *rttData = &(instPtr->mgmtNetFSM->rttData);
|
||||
RTT_RECORD *rttRecord = &(L2_GetRttDesc(instPtr)->rttRecord);
|
||||
DBG_INFO("-------- MgmtNet Routine --------\n");
|
||||
|
||||
if(rtneEntry->slotSeq != 0){
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
// Check if there is any node exceeds the ttl threshold.
|
||||
IterDeleteNode(instPtr->nodeList, IsTTLValid);
|
||||
|
||||
// Determine next slot TOR state.
|
||||
L2_TOR_TYPE torState = L2_TOR_SUSPEND;
|
||||
if ((rtneEntry->src0 == instPtr->myInfo.nodeId)
|
||||
|| (rtneEntry->src1 == instPtr->myInfo.nodeId)) {
|
||||
torState = L2_TOR_TX;
|
||||
}
|
||||
else if ((rtneEntry->dst0 == instPtr->myInfo.nodeId)
|
||||
|| (rtneEntry->dst1 == instPtr->myInfo.nodeId)) {
|
||||
torState = L2_TOR_RX;
|
||||
}
|
||||
else {
|
||||
torState = L2_TOR_SUSPEND;
|
||||
}
|
||||
|
||||
switch (rtneEntry->slotType) {
|
||||
case SLOT_INTER_MGMT:
|
||||
// TODO:
|
||||
L2_SetupNextSlot(instPtr, torState, L2_INTER_MGMT_FRAME);
|
||||
break;
|
||||
case SLOT_INTRA_MGMT:
|
||||
memset(instPtr->sendPktData, 0xAA, INTRA_MGMT_FRAME_LENGTH_MAX);
|
||||
if (torState == L2_TOR_TX) {
|
||||
if(MgmtPkt_Packing(instPtr, MGMTPKT_INTRA_MGMT) != SUCCESS) {
|
||||
Status = FAILURE;
|
||||
goto routine_err;
|
||||
}
|
||||
}
|
||||
L2_SetupNextSlot(instPtr, torState, L2_INTRA_MGMT_FRAME);
|
||||
break;
|
||||
case SLOT_INTER_TSYNC:
|
||||
// TODO:
|
||||
L2_SetupNextSlot(instPtr, torState, L2_INTER_TSYNC_FRAME);
|
||||
break;
|
||||
case SLOT_INTRA_TSYNC:
|
||||
if (torState == L2_TOR_TX) {
|
||||
// TODO:
|
||||
memset(instPtr->sendPktData, 0x00, INTRA_RTT_FRAME_LENGTH_MAX); // FIXME
|
||||
L2_RTT_FSM* rttFsmPtr = L2_GetRttDesc(instPtr);
|
||||
L2_RTT_SATGE rttStage = RTT_GetCurrentStage(rttFsmPtr);
|
||||
if(rttStage == RTT_REQ1 || rttStage == RTT_REQ2){
|
||||
if(rttStage == RTT_REQ1){
|
||||
DBG_INFO("MGMT Sending RTT REQ-1\n");
|
||||
rttData->rttTime.timeH = rttRecord->Tt1.timeH;
|
||||
rttData->rttTime.timeL = rttRecord->Tt1.timeL;
|
||||
rttData->rttDoppler = RTT_DOPPLER_NONE;
|
||||
}
|
||||
else{ //RTT_REQ2
|
||||
DBG_INFO("MGMT Sending RTT REQ-2\n");
|
||||
rttData->rttTime.timeH = (rttFsmPtr->isR2Valid)? rttRecord->TroundA.timeH : RTT_TIME_NONE;
|
||||
rttData->rttTime.timeL = (rttFsmPtr->isR2Valid)? rttRecord->TroundA.timeL : RTT_TIME_NONE;
|
||||
rttData->rttDoppler = (rttFsmPtr->isR2Valid)? rttRecord->dopplerR2:RTT_DOPPLER_NONE;
|
||||
}
|
||||
if(MgmtPkt_Packing(instPtr, MGMTPKT_INTRA_RTTREQ) != SUCCESS) {
|
||||
Status = FAILURE;
|
||||
goto routine_err;
|
||||
}
|
||||
}
|
||||
else if(rttStage == RTT_RSP1 || rttStage == RTT_RSP2){
|
||||
if(rttStage == RTT_RSP1){
|
||||
DBG_INFO("MGMT Sending RTT RSP-1\n");
|
||||
rttData->rttTime.timeH = (rttFsmPtr->isR1Valid) ? rttRecord->TreplyB.timeH : RTT_TIME_NONE;
|
||||
rttData->rttTime.timeL = (rttFsmPtr->isR1Valid) ? rttRecord->TreplyB.timeL : RTT_TIME_NONE;
|
||||
rttData->rttDoppler = (rttFsmPtr->isR1Valid) ? rttRecord->dopplerR1 : RTT_DOPPLER_NONE;
|
||||
}
|
||||
else{ //RTT_RSP2
|
||||
DBG_INFO("MGMT Sending RTT RSP-2\n");
|
||||
rttData->rttTime.timeH = (rttFsmPtr->isR3Valid) ? rttRecord->TreplyB.timeH : RTT_TIME_NONE;
|
||||
rttData->rttTime.timeL = (rttFsmPtr->isR3Valid) ? rttRecord->TreplyB.timeL : RTT_TIME_NONE;
|
||||
rttData->rttDoppler = (rttFsmPtr->isR3Valid) ? rttRecord->dopplerR3 : RTT_DOPPLER_NONE;
|
||||
}
|
||||
// Packing message.
|
||||
if(MgmtPkt_Packing(instPtr, MGMTPKT_INTRA_RTTRSP) != SUCCESS) {
|
||||
Status = FAILURE;
|
||||
goto routine_err;
|
||||
}
|
||||
|
||||
}
|
||||
else{
|
||||
DBG_ERROR("Unexpected RTT Stage: %d.\n", rttStage);
|
||||
torState = L2_TOR_SUSPEND;
|
||||
}
|
||||
}
|
||||
L2_SetupNextSlot(instPtr, torState, L2_INTRA_TSYNC_FRAME);
|
||||
break;
|
||||
default:
|
||||
DBG_ERROR("UNKNOWN slot type [%d].\n", rtneEntry->slotType);
|
||||
Status = FAILURE;
|
||||
goto routine_err;
|
||||
}
|
||||
|
||||
/*************************************************/
|
||||
// Update link layer state...
|
||||
if (instPtr->myInfo.nodeType == HEAD_NODE) {
|
||||
L2_NODE_STATE newState = NONE_STATE;
|
||||
L2_EVENT stateEvent = {
|
||||
.event = L2_EV_MAIN_STATE_UPDATE,
|
||||
.msg = &newState
|
||||
};
|
||||
if (instPtr->nodeList->nodeNum < instPtr->config.netScale
|
||||
&& L2_GetMainState(instPtr) != INTRA_SEEK_STATE) {
|
||||
newState = INTRA_SEEK_STATE;
|
||||
AssertL2Event(instPtr, &stateEvent);
|
||||
}
|
||||
else if(instPtr->nodeList->nodeNum >= instPtr->config.netScale &&
|
||||
L2_GetMainState(instPtr) != NORMAL_STATE){
|
||||
newState = NORMAL_STATE;
|
||||
AssertL2Event(instPtr, &stateEvent);
|
||||
}
|
||||
}
|
||||
else{ // MEMBER_NODE or BACKUP_HEAD
|
||||
if(IsNodeInList(instPtr->nodeList, instPtr->config.headId) == false){
|
||||
L2_NODE_STATE newState = INIT_STATE;
|
||||
L2_EVENT stateEvent = {
|
||||
.event = L2_EV_MAIN_STATE_UPDATE,
|
||||
.msg = &newState
|
||||
};
|
||||
AssertL2Event(instPtr, &stateEvent);
|
||||
L2_EVENT lostCxnEvent = {
|
||||
.event = L2_EV_LOST_CXN,
|
||||
.msg = NULL
|
||||
};
|
||||
AssertL2Event(instPtr, &lostCxnEvent);
|
||||
DBG_WARNING("Lost connection with head node [%d].\n", instPtr->config.headId);
|
||||
}
|
||||
}
|
||||
return SUCCESS;
|
||||
routine_err:
|
||||
return Status;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,295 @@
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* Description: Implementations for 814 datalink service net.
|
||||
* Date: 2021-11-16 00:08
|
||||
* LastEditors: Fan Hao
|
||||
* LastEditTime: 2022-07-16 17:04
|
||||
* Revisions: Rev 0.1
|
||||
* History:
|
||||
* [2022-07-16]: New branch for DiJian.
|
||||
* [2021-11-16]: Initial version.
|
||||
*
|
||||
* Copyright(c) 2021 Beijing Institute of Technology.
|
||||
* Lab of Communication and Networking
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/***************************** Include Files *********************************/
|
||||
#include <string.h>
|
||||
#include "linklayer814.h"
|
||||
#include "linklayer814_types.h"
|
||||
#include "msg_def.h"
|
||||
#include "../error.h"
|
||||
#include "../common.h"
|
||||
|
||||
|
||||
#ifdef _MPC_CTRL
|
||||
|
||||
#endif
|
||||
|
||||
/************************** Constant Definitions *****************************/
|
||||
#define SQUENCE_SVC_SLOTS 0
|
||||
#define INER_SVC_SLOTS 2
|
||||
#define INRA_SVC_SLOTS 1
|
||||
#define NONE_SVC_SLOTS 0
|
||||
#define TEST_UDU_PDLEN 16
|
||||
#define TEST_UDU_LEN (UDUH_LEN/8 + TEST_UDU_PDLEN + PDU_CRC_LEN/8 )
|
||||
/***************** Macros (Inline Functions) Definitions *********************/
|
||||
|
||||
/************************** Function Prototypes ******************************/
|
||||
#ifdef _MPC_CTRL
|
||||
#endif
|
||||
|
||||
/**************************** Type Definitions *******************************/
|
||||
|
||||
/************************** Variable Definitions *****************************/
|
||||
#ifdef _MPC_CTRL
|
||||
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Packing UDU Header to a bit array.
|
||||
*
|
||||
* @param bitarr pointer to bit array buffer.
|
||||
* dst Destination node address.
|
||||
* dataLen Length of UDU data.
|
||||
*
|
||||
* @return EPARAM
|
||||
* SUCCESS
|
||||
*
|
||||
******************************************************************************/
|
||||
static int UduHeader_Packing(L2_INST* instPtr, BIT_ARRAY* bitarr, uint8_t dst, uint32_t dataLen){
|
||||
ASSERT(bitarr != NULL);
|
||||
if(bitarr->num_of_bits < UDUH_LEN){
|
||||
return EPARAM;
|
||||
}
|
||||
uint64_t dataChunk = 0;
|
||||
memset(bitarr->words, 0xF0, (size_t)(UDUH_LEN/8));
|
||||
// priority
|
||||
dataChunk = 1;
|
||||
FrameInsertChunk(bitarr, UDUH_PRI_OFFSET, UDUH_PRI_LEN, dataChunk);
|
||||
// message type
|
||||
dataChunk = 2;
|
||||
FrameInsertChunk(bitarr, UDUH_MSG_TYPE_OFFSET, UDUH_MSG_TYPE_LEN, dataChunk);
|
||||
// data length
|
||||
dataChunk = dataLen;
|
||||
FrameInsertChunk(bitarr, UDUH_LENGTH_OFFSET, UDUH_LENGTH_LEN, dataChunk);
|
||||
// source node id
|
||||
dataChunk = (instPtr->myInfo.nodeId & 0x1F)|((instPtr->myInfo.clustId & 0x1F) << 5);
|
||||
FrameInsertChunk(bitarr, UDUH_SRC_ADDR_OFFSET, UDUH_SRC_ADDR_LEN, dataChunk);
|
||||
// destination node id
|
||||
dataChunk = (dst & 0x1F)|((instPtr->myInfo.clustId & 0x1F) << 5);
|
||||
FrameInsertChunk(bitarr, UDUH_DST_ADDR_OFFSET, UDUH_DST_ADDR_LEN, dataChunk);
|
||||
// UDU Sequence number
|
||||
dataChunk = 0;
|
||||
FrameInsertChunk(bitarr, UDUH_UDU_SEQ_NUM_OFFSET, UDUH_UDU_SEQ_NUM_LEN, dataChunk);
|
||||
// retransmission times
|
||||
dataChunk = 0;
|
||||
FrameInsertChunk(bitarr, UDUH_RETRANS_NUM_OFFSET, UDUH_RETRANS_NUM_LEN, dataChunk);
|
||||
// number of slice
|
||||
dataChunk = 1;
|
||||
FrameInsertChunk(bitarr, UDUH_NUM_SLICE_OFFSET, UDUH_NUM_SLICE_LEN, dataChunk);
|
||||
// slice id
|
||||
dataChunk = 1;
|
||||
FrameInsertChunk(bitarr, UDUH_SLICE_ID_OFFSET, UDUH_SLICE_ID_LEN, dataChunk);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Packing PDU Header to a bit array.
|
||||
*
|
||||
* @param bitarr pointer to bit array buffer.
|
||||
* headerType PDU header type.
|
||||
* dst Destination node address.
|
||||
*
|
||||
* @return EPARAM
|
||||
* SUCCESS
|
||||
*
|
||||
******************************************************************************/
|
||||
static int PduHeader_Packing(L2_INST* instPtr, BIT_ARRAY* bitarr, L2_PDU_HEADER_TYPE headerType, uint8_t dst){
|
||||
ASSERT(bitarr != NULL);
|
||||
if(headerType < L2_PDU_HEADER_0 || headerType > L2_PDU_HEADER_1){
|
||||
return EPARAM;
|
||||
}
|
||||
uint64_t dataChunk = 0;
|
||||
if(headerType == L2_PDU_HEADER_0){
|
||||
if(bitarr->num_of_bits < PDUH0_LEN){
|
||||
return EPARAM;
|
||||
}
|
||||
memset(bitarr->words, 0xF0, (size_t)(PDUH0_LEN/8));
|
||||
// PDU type
|
||||
dataChunk = 0;
|
||||
FrameInsertChunk(bitarr, PDUH0_TYPE_OFFSET, PDUH0_TYPE_LEN, dataChunk);
|
||||
// frame length
|
||||
dataChunk = INTRA_SVC_FRAME_LENGTH_MAX;
|
||||
FrameInsertChunk(bitarr, PDUH0_LENGTH_OFFSET, PDUH0_LENGTH_LEN, dataChunk);
|
||||
// source node id
|
||||
dataChunk = (instPtr->myInfo.nodeId & 0x1F)|((instPtr->myInfo.clustId & 0x1F) << 5);
|
||||
FrameInsertChunk(bitarr, PDUH0_SRC_ADDR_OFFSET, PDUH0_SRC_ADDR_LEN, dataChunk);
|
||||
// destination node id
|
||||
dataChunk = (dst & 0x1F)|((instPtr->myInfo.clustId & 0x1F) << 5);
|
||||
FrameInsertChunk(bitarr, PDUH0_DST_ADDR_OFFSET, PDUH0_DST_ADDR_LEN, dataChunk);
|
||||
// Sequence number
|
||||
dataChunk = 0;
|
||||
FrameInsertChunk(bitarr, PDUH0_SEQ_NUM_OFFSET, PDUH0_SEQ_NUM_LEN, dataChunk);
|
||||
// Append CRC
|
||||
L2_CrcAppend((uint8_t*)bitarr->words, PDUH0_HEADER_CRC_OFFSET/8, PDUH0_HEADER_CRC_OFFSET/8, L2_CRC8_31);
|
||||
}
|
||||
else if(headerType == L2_PDU_HEADER_1){
|
||||
if(bitarr->num_of_bits < PDUH1_LEN){
|
||||
return EPARAM;
|
||||
}
|
||||
memset(bitarr->words, 0xF0, (size_t)(PDUH1_LEN/8));
|
||||
// PDU type
|
||||
dataChunk = 1;
|
||||
FrameInsertChunk(bitarr, PDUH1_TYPE_OFFSET, PDUH1_TYPE_LEN, dataChunk);
|
||||
// frame length
|
||||
dataChunk = INTRA_SVC_FRAME_LENGTH_MAX;
|
||||
FrameInsertChunk(bitarr, PDUH1_LENGTH_OFFSET, PDUH1_LENGTH_LEN, dataChunk);
|
||||
// source node id
|
||||
dataChunk = (instPtr->myInfo.nodeId & 0x1F)|((instPtr->myInfo.clustId & 0x1F) << 5);
|
||||
FrameInsertChunk(bitarr, PDUH1_SRC_ADDR_OFFSET, PDUH1_SRC_ADDR_LEN, dataChunk);
|
||||
// destination node id
|
||||
dataChunk = (dst & 0x1F)|((instPtr->myInfo.clustId & 0x1F) << 5);
|
||||
FrameInsertChunk(bitarr, PDUH1_DST_ADDR_OFFSET, PDUH1_DST_ADDR_LEN, dataChunk);
|
||||
// Slice tage...
|
||||
// Append CRC
|
||||
L2_CrcAppend((uint8_t*)bitarr->words, PDUH1_HEADER_CRC_OFFSET/8, PDUH1_HEADER_CRC_OFFSET/8, L2_CRC8_31);
|
||||
}
|
||||
else{
|
||||
return FAILURE;
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Initialize service net FSM
|
||||
*
|
||||
* @param serviceFSM A pointer to service FSM instance.
|
||||
*
|
||||
* @return SUCCESS Initialize successfully.
|
||||
* Other Initialize failed.
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t ServiceNet_Init(L2_SVC_FSM** serviceFSM) {
|
||||
(*serviceFSM) = (L2_SVC_FSM*) malloc(sizeof(L2_SVC_FSM));
|
||||
if (*serviceFSM == NULL) {
|
||||
return EALLOC;
|
||||
}
|
||||
ServiceNet_Reset(*serviceFSM);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
void ServiceNet_Reset(L2_SVC_FSM* serviceFSM) {
|
||||
serviceFSM->isBisar = false;
|
||||
serviceFSM->isBisarEven = false;
|
||||
serviceFSM->bisarDst = NONE_ID;
|
||||
}
|
||||
|
||||
void ServiceNet_Destroy(L2_SVC_FSM* serviceFSM){
|
||||
free(serviceFSM);
|
||||
}
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Handle service received packet. Send data up to MPC
|
||||
*
|
||||
* @param instPtr a pointer to linklayer layer instance
|
||||
*
|
||||
* @return SUCCESS message has been successfully handled.
|
||||
* other error occurred.
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t ServiceNet_PktHandler(L2_INST* instPtr) {
|
||||
// TODO:
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Service net FSM procedure.
|
||||
*
|
||||
* @param instPtr a pointer to linklayer layer instance
|
||||
* @param rtneEntry
|
||||
*
|
||||
* @return Slot has been used.
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t ServiceNet_Routine(L2_INST* instPtr, const L2_RTNE_TABLE_ENTRY* rtneEntry) {
|
||||
ASSERT(instPtr != NULL);
|
||||
int32_t Status;
|
||||
L2_TOR_TYPE torState;
|
||||
DBG_INFO("-------- ServiceNet Routine --------\n");
|
||||
|
||||
if(rtneEntry->slotSeq != 0){
|
||||
return SQUENCE_SVC_SLOTS;
|
||||
}
|
||||
|
||||
// Determine TOR State.
|
||||
if(rtneEntry->src0 == instPtr->myInfo.nodeId){
|
||||
torState = L2_TOR_TX;
|
||||
}
|
||||
else if(rtneEntry->dst0 == instPtr->myInfo.nodeId){
|
||||
torState = L2_TOR_RX;
|
||||
}
|
||||
else{
|
||||
torState = L2_TOR_SUSPEND;
|
||||
}
|
||||
|
||||
BIT_ARRAY* svcMsg = bit_array_create(L2_MSG_MAX);
|
||||
if(svcMsg == NULL){
|
||||
DBG_ERROR("Failed to allocate memory for svcMsg.\n");
|
||||
return NUM_SLOTS_NONE;
|
||||
}
|
||||
memset(instPtr->sendPktData, 0xCC, (size_t)(INTRA_SVC_FRAME_LENGTH_MAX));
|
||||
switch(rtneEntry->slotType){
|
||||
case SLOT_INTER_SVC:
|
||||
L2_SetupNextSlot(instPtr, torState, L2_INTER_SVC_FRAME);
|
||||
break;
|
||||
case SLOT_INTRA_SVC:
|
||||
if(torState == L2_TOR_TX){
|
||||
//TODO:
|
||||
memset(instPtr->sendPktData, 0xAA, INTRA_SVC_FRAME_LENGTH_MAX);
|
||||
// Pack PDU header
|
||||
if(PduHeader_Packing(instPtr, svcMsg, L2_PDU_HEADER_0, rtneEntry->dst0) != SUCCESS){
|
||||
DBG_ERROR("Failed to packing PduHeader.\n");
|
||||
Status = FAILURE;
|
||||
goto routine_err;
|
||||
}
|
||||
memcpy(instPtr->sendPktData, svcMsg->words, (size_t)(PDUH0_LEN/8));
|
||||
// Pack UDU Header
|
||||
if(UduHeader_Packing(instPtr, svcMsg, rtneEntry->dst0,
|
||||
INTRA_SVC_FRAME_LENGTH_MAX-(PDUH0_LEN+MSG_KEY_LENGTH_LEN)/8)
|
||||
!= SUCCESS){
|
||||
DBG_ERROR("Failed to packing UduHeader.\n");
|
||||
Status = FAILURE;
|
||||
goto routine_err;
|
||||
}
|
||||
memcpy(instPtr->sendPktData + ((PDUH0_LEN+MSG_KEY_LENGTH_LEN)/8), svcMsg->words, (size_t)(UDUH_LEN/8));
|
||||
// For ZhiQiang
|
||||
// Payload Byte3, bit0~2: message class, bit3~7 message subclass
|
||||
// FIXME: message class tag 0x01, only for test.
|
||||
memset(instPtr->sendPktData+((PDUH0_LEN+MSG_KEY_LENGTH_LEN+UDUH_LEN)/8) + 3, 0x01, 1);
|
||||
L2_CrcAppend(instPtr->sendPktData + ((PDUH0_LEN+MSG_KEY_LENGTH_LEN)/8),
|
||||
INTRA_SVC_FRAME_LENGTH_MAX-(PDUH0_LEN+MSG_KEY_LENGTH_LEN+PDU_CRC_LEN)/8,
|
||||
INTRA_SVC_FRAME_LENGTH_MAX-(PDUH0_LEN+MSG_KEY_LENGTH_LEN+PDU_CRC_LEN)/8,
|
||||
L2_CRC16_8005
|
||||
);
|
||||
}
|
||||
L2_SetupNextSlot(instPtr, torState, L2_INTRA_SVC_FRAME);
|
||||
break;
|
||||
default:
|
||||
DBG_ERROR("UNKNOWN slot type [%d].\n", rtneEntry->slotType);
|
||||
DBG_ERROR("Failed to packing PduHeader.\n");
|
||||
Status = FAILURE;
|
||||
goto routine_err;
|
||||
}
|
||||
bit_array_free(svcMsg);// free memory
|
||||
return SUCCESS;
|
||||
routine_err:
|
||||
bit_array_free(svcMsg);// free memory
|
||||
return Status;
|
||||
}
|
||||
@@ -0,0 +1,477 @@
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* Description: Implementations of 814 linklayer local record.
|
||||
*
|
||||
* Date: 2022-07-14 00:08
|
||||
* LastEditors: Fan Hao
|
||||
* LastEditTime: 2022-07-14 22:52
|
||||
* Revisions: Rev 0.0
|
||||
* History:
|
||||
* [2022-07-14]: Initial version.
|
||||
*
|
||||
* Copyright(c) 2021 Beijing Institute of Technology.
|
||||
* Lab of Communication and Networking
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/***************************** Include Files *********************************/
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "linklayer814_types.h"
|
||||
#include "node_list.h"
|
||||
#include "../common.h"
|
||||
#include "../error.h"
|
||||
|
||||
/***************** Macros (Inline Functions) Definitions *********************/
|
||||
inline int32_t GetNodeNum(NODE_LIST *list) {
|
||||
ASSERT(list != NULL);
|
||||
return list->nodeNum;
|
||||
}
|
||||
/**************************** Type Definitions *******************************/
|
||||
|
||||
/************************** Variable Definitions *****************************/
|
||||
|
||||
/************************** Function Prototypes ******************************/
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Initialize node list
|
||||
*
|
||||
* @param list
|
||||
*
|
||||
* @return SUCCESS
|
||||
* ENOMEM - not enough memory.
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t NodeList_Init(NODE_LIST **list) {
|
||||
NODE_ENTRY *entry;
|
||||
(*list) = malloc(sizeof(NODE_LIST));
|
||||
if (*list == NULL) {
|
||||
return ENOMEM;
|
||||
}
|
||||
entry = malloc(sizeof(NODE_ENTRY));
|
||||
if(entry == NULL) {
|
||||
free(*list);
|
||||
return ENOMEM;
|
||||
}
|
||||
entry->nodeInfo.nodeId = 0;
|
||||
entry->nextNode = entry;
|
||||
entry->preNode = entry;
|
||||
(*list)->head = entry;
|
||||
(*list)->nodeNum = 0;
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
void NodeList_Clear(NODE_LIST *list){
|
||||
ASSERT(list != NULL);
|
||||
NODE_ENTRY *nodeEntry, *deletEntry;
|
||||
nodeEntry = list->head->nextNode;
|
||||
while (nodeEntry != list->head) {
|
||||
deletEntry = nodeEntry;
|
||||
nodeEntry = nodeEntry->nextNode;
|
||||
deletEntry->preNode->nextNode = deletEntry->nextNode;
|
||||
deletEntry->nextNode->preNode = deletEntry->preNode;
|
||||
DBG_INFO("Deleting node [%d].\n", deletEntry->nodeInfo.nodeId);
|
||||
free(deletEntry);
|
||||
list->nodeNum--;
|
||||
}
|
||||
}
|
||||
|
||||
void NodeList_Destroy(NODE_LIST *list){
|
||||
if(list == NULL){
|
||||
return;
|
||||
}
|
||||
NodeList_Clear(list);
|
||||
free(list->head);
|
||||
free(list);
|
||||
}
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Get node entry frome node list base on node id.
|
||||
*
|
||||
* @param list
|
||||
* @param nodeId
|
||||
*
|
||||
* @return Node entry
|
||||
* NULL if node dose not exist.
|
||||
*
|
||||
******************************************************************************/
|
||||
NODE_ENTRY* GetNode(NODE_LIST *list, uint32_t nodeId) {
|
||||
ASSERT(list != NULL);
|
||||
NODE_ENTRY* nodeEntry = list->head->nextNode;
|
||||
while (nodeEntry != list->head) {
|
||||
if (nodeEntry->nodeInfo.nodeId == nodeId) {
|
||||
break;
|
||||
}
|
||||
else {
|
||||
nodeEntry = nodeEntry->nextNode;
|
||||
}
|
||||
}
|
||||
if (nodeEntry == list->head) {
|
||||
return NULL;
|
||||
}
|
||||
else {
|
||||
return nodeEntry;
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Check whether the node is already in the node list.
|
||||
*
|
||||
* @param list
|
||||
* @param nodeId
|
||||
*
|
||||
* @return true node in the list
|
||||
* false node not in the list
|
||||
*
|
||||
******************************************************************************/
|
||||
inline bool IsNodeInList(NODE_LIST *list, uint8_t nodeId) {
|
||||
ASSERT(list != NULL);
|
||||
return (GetNode(list, nodeId) != NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Append a new node entry to the node list
|
||||
*
|
||||
* @param list
|
||||
* @param nodeId
|
||||
* @param nodeType
|
||||
*
|
||||
* @return SUCCESS Node was added successfully.
|
||||
* Other Error occurred.(Node already exist, memory alloc error ect.)
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t AppendNode(NODE_LIST *list, uint8_t nodeId, L2_NODE_TYPE nodeType)
|
||||
{
|
||||
ASSERT(list != NULL);
|
||||
if(IsNodeInList(list, nodeId)){
|
||||
DBG_WARNING("Node [%d] already exist.\n", nodeId);
|
||||
return FAILURE;
|
||||
}
|
||||
DBG_INFO("Link layer appending node [%d] to node list.\n", nodeId);
|
||||
NODE_ENTRY* nodeEntry = (NODE_ENTRY*) malloc(sizeof(NODE_ENTRY));
|
||||
if (nodeEntry == NULL) {
|
||||
return ENOMEM;
|
||||
}
|
||||
nodeEntry->nodeInfo.nodeId = nodeId;
|
||||
nodeEntry->nodeInfo.nodeType = (uint8_t) nodeType;
|
||||
nodeEntry->nodeInfo.pos.x = 0;
|
||||
nodeEntry->nodeInfo.pos.y = 0;
|
||||
nodeEntry->nodeInfo.pos.z = 0;
|
||||
nodeEntry->nodeInfo.speed.x = 0;
|
||||
nodeEntry->nodeInfo.speed.y = 0;
|
||||
nodeEntry->nodeInfo.speed.z = 0;
|
||||
nodeEntry->nodeInfo.beamNo = 0;
|
||||
nodeEntry->ttlCnt = 0;
|
||||
|
||||
nodeEntry->nextNode = list->head;
|
||||
nodeEntry->preNode = list->head->nextNode;
|
||||
list->head->nextNode = nodeEntry;
|
||||
|
||||
list->nodeNum++;
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Delete a node in list based on node id.
|
||||
*
|
||||
* @param list
|
||||
* @param nodeId
|
||||
*
|
||||
* @return SUCCESS Node has been successfully deleted.
|
||||
* Other Node not exist.
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t DeletNode(NODE_LIST *list, uint8_t nodeId) {
|
||||
ASSERT(list != NULL);
|
||||
NODE_ENTRY* nodeEntry = GetNode(list, nodeId);
|
||||
if(nodeEntry == NULL){
|
||||
DBG_WARNING("Node [%d] in not in node list, skip deleting process.\n", nodeId);
|
||||
return SUCCESS;
|
||||
}
|
||||
nodeEntry->preNode->nextNode = nodeEntry->nextNode;
|
||||
nodeEntry->nextNode->preNode = nodeEntry->preNode;
|
||||
DBG_INFO("Deleting node [%d].\n", nodeId);
|
||||
free(nodeEntry);
|
||||
list->nodeNum--;
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Get the distance between me and the node.
|
||||
*
|
||||
* @param list
|
||||
* @param nodeId
|
||||
* @param dst A pointer to store distance.
|
||||
*
|
||||
* @return SUCCESS distance has been successfully store in dst
|
||||
* FAILURE Node dose not exit.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
int32_t GetDistance(NODE_LIST *list, COORD myCoord, uint8_t nodeId, double* dst) {
|
||||
ASSERT(list != NULL);
|
||||
NODE_ENTRY* nodeEntry = GetNode(list, nodeId);
|
||||
if (nodeEntry == NULL) {
|
||||
return FAILURE;
|
||||
}
|
||||
else {
|
||||
*dst = Coord_Distance(myCoord, nodeEntry->nodeInfo.pos);
|
||||
return SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Update node positions information.
|
||||
*
|
||||
* @param list
|
||||
* @param nodeId
|
||||
* @param newPos A structure stores the corresponding node position info.
|
||||
*
|
||||
* @return SUCCESS update successfully.
|
||||
* FAILURE node not exist.
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t UpdateNodePos(NODE_LIST *list, uint8_t nodeId, const COORD *newPos) {
|
||||
ASSERT(list != NULL);
|
||||
NODE_ENTRY* nodeEntry = GetNode(list, nodeId);
|
||||
if (nodeEntry == NULL) {
|
||||
return FAILURE;
|
||||
}
|
||||
else {
|
||||
memcpy(&(nodeEntry->nodeInfo.pos), newPos, sizeof(COORD));
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Get node positions information.
|
||||
*
|
||||
* @param list
|
||||
* @param nodeId
|
||||
* @param newPos A structure stores the corresponding node position info.
|
||||
*
|
||||
* @return SUCCESS update successfully.
|
||||
* FAILURE node not exist.
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t GetNodePos(NODE_LIST *list, uint8_t nodeId, COORD *pos) {
|
||||
ASSERT(list != NULL);
|
||||
NODE_ENTRY* nodeEntry = GetNode(list, nodeId);
|
||||
if (nodeEntry == NULL) {
|
||||
return FAILURE;
|
||||
}
|
||||
else {
|
||||
memcpy(pos, &(nodeEntry->nodeInfo.pos), sizeof(COORD));
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Update node speed information.
|
||||
*
|
||||
* @param list
|
||||
* @param nodeId
|
||||
* @param newSpeed A structure stores the corresponding node speed info.
|
||||
*
|
||||
* @return SUCCESS update successfully.
|
||||
* FAILURE node not exist.
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t UpdateNodeSpeed(NODE_LIST *list, uint8_t nodeId, const COORD *newSpeed) {
|
||||
ASSERT(list != NULL);
|
||||
NODE_ENTRY* nodeEntry = GetNode(list, nodeId);
|
||||
if (nodeEntry == NULL) {
|
||||
return FAILURE;
|
||||
}
|
||||
else {
|
||||
memcpy(&(nodeEntry->nodeInfo.speed), newSpeed, sizeof(COORD));
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Get node speed information.
|
||||
*
|
||||
* @param list
|
||||
* @param nodeId
|
||||
* @param newSpeed A structure stores the corresponding node speed info.
|
||||
*
|
||||
* @return SUCCESS update successfully.
|
||||
* FAILURE node not exist.
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t GetNodeSpeed(NODE_LIST *list, uint8_t nodeId, COORD *speed) {
|
||||
ASSERT(list != NULL);
|
||||
NODE_ENTRY* nodeEntry = GetNode(list, nodeId);
|
||||
if (nodeEntry == NULL) {
|
||||
return FAILURE;
|
||||
}
|
||||
else {
|
||||
memcpy(speed, &(nodeEntry->nodeInfo.speed), sizeof(COORD));
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Update node ACK status.
|
||||
*
|
||||
* @param list
|
||||
* @param nodeId
|
||||
* @param defl
|
||||
*
|
||||
* @return SUCCESS update successfully.
|
||||
* FAILURE Node not exist.
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t UpdateNodeTimeDeviation(NODE_LIST *list, uint8_t nodeId, int32_t devi) {
|
||||
ASSERT(list != NULL);
|
||||
NODE_ENTRY* nodeEntry = GetNode(list, nodeId);
|
||||
if (nodeEntry == NULL) {
|
||||
return FAILURE;
|
||||
}
|
||||
else {
|
||||
nodeEntry->timeDevi = devi;
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Increase TTL of specified node in the list.
|
||||
*
|
||||
* @param list
|
||||
* @param inc cnt of slot to add
|
||||
* @param nodeId
|
||||
*
|
||||
* @return NONE
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t IncNodeTTL(NODE_LIST *list, uint8_t nodeId, uint32_t inc) {
|
||||
ASSERT(list != NULL);
|
||||
NODE_ENTRY* nodeEntry = GetNode(list, nodeId);
|
||||
if (nodeEntry == NULL) {
|
||||
return FAILURE;
|
||||
}
|
||||
else {
|
||||
nodeEntry->ttlCnt += inc;
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Reset node TTL based on node id.
|
||||
*
|
||||
* @param list
|
||||
* @param nodeId
|
||||
*
|
||||
* @return SUCCESS TTL has been successfully cleared.
|
||||
* FAILURE Node not exist.
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t RstNodeTTL(NODE_LIST *list, uint8_t nodeId) {
|
||||
ASSERT(list != NULL);
|
||||
NODE_ENTRY* nodeEntry = GetNode(list, nodeId);
|
||||
if (nodeEntry == NULL) {
|
||||
return FAILURE;
|
||||
}
|
||||
else {
|
||||
nodeEntry->ttlCnt = 0;
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Get TTL of specified node in the list.
|
||||
*
|
||||
* @param list
|
||||
* @param nodeId
|
||||
* @param ttl
|
||||
*
|
||||
* @return NONE
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t GetNodeTTL(NODE_LIST *list, uint8_t nodeId, uint32_t *ttl) {
|
||||
ASSERT(list != NULL);
|
||||
NODE_ENTRY* nodeEntry = GetNode(list, nodeId);
|
||||
if (nodeEntry == NULL) {
|
||||
return FAILURE;
|
||||
}
|
||||
else {
|
||||
*ttl = nodeEntry->ttlCnt;
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Implements a edit operations to each node.
|
||||
*
|
||||
* @param list
|
||||
* @param param
|
||||
* @param operation A pointer to a function handled "NODE_ENTRY*" as input
|
||||
* which defines the operations need to be apply.
|
||||
*
|
||||
* @return SUCCESS Operations has been applied successfully to all nodes.
|
||||
* Other Error occurred.
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t IterEditNode(NODE_LIST *list, const void *param, int32_t (*operation)(NODE_ENTRY *, const void *)) {
|
||||
ASSERT(list != NULL);
|
||||
int32_t Status = SUCCESS;
|
||||
NODE_ENTRY *nodeEntry = list->head->nextNode;
|
||||
while (nodeEntry != list->head) {
|
||||
Status = operation(nodeEntry, param);
|
||||
if(Status != SUCCESS){
|
||||
break;
|
||||
}
|
||||
nodeEntry = nodeEntry->nextNode;
|
||||
}
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Filter all node, delete all the node not satisfied the condition.
|
||||
*
|
||||
* @param list
|
||||
* @param condition A pointer to a function handled "NODE_ENTRY*" as input
|
||||
* which defines the condition need to be verify.
|
||||
*
|
||||
* @return SUCCESS
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t IterDeleteNode(NODE_LIST *list, bool (*condition)(NODE_ENTRY *)) {
|
||||
ASSERT(list != NULL);
|
||||
NODE_ENTRY *nodeEntry, *deletEntry;
|
||||
nodeEntry = list->head->nextNode;
|
||||
while (nodeEntry != list->head) {
|
||||
if (condition(nodeEntry) == false) {
|
||||
deletEntry = nodeEntry;
|
||||
nodeEntry = nodeEntry->nextNode;
|
||||
deletEntry->preNode->nextNode = deletEntry->nextNode;
|
||||
deletEntry->nextNode->preNode = deletEntry->preNode;
|
||||
DBG_INFO("Deleting node [%d].\n", deletEntry->nodeInfo.nodeId);
|
||||
free(deletEntry);
|
||||
list->nodeNum--;
|
||||
}
|
||||
else {
|
||||
nodeEntry = nodeEntry->nextNode;
|
||||
}
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* Description: Header of 814 linklayer local record.
|
||||
*
|
||||
* Date: 2022-07-14 00:08
|
||||
* LastEditors: Fan Hao
|
||||
* LastEditTime: 2022-07-14 22:52
|
||||
* Revisions: Rev 0.0
|
||||
* History:
|
||||
* [2022-07-14]: Initial version.
|
||||
*
|
||||
* Copyright(c) 2021 Beijing Institute of Technology.
|
||||
* Lab of Communication and Networking
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/***************************** Include Files *********************************/
|
||||
#ifndef NODE_LIST_H_
|
||||
#define NODE_LIST_H_
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
#include "linklayer814_types.h"
|
||||
#include "geometry/coord.h"
|
||||
#include "../util/util.h"
|
||||
|
||||
/************************** Constant Definitions *****************************/
|
||||
/***************** Macros (Inline Functions) Definitions *********************/
|
||||
/**************************** Type Definitions *******************************/
|
||||
typedef struct NODE_LIST_ENTRY {
|
||||
L2_NODE_INFO nodeInfo;
|
||||
uint32_t ttlCnt;
|
||||
int32_t timeDevi;
|
||||
struct NODE_LIST_ENTRY *nextNode;
|
||||
struct NODE_LIST_ENTRY *preNode;
|
||||
} NODE_ENTRY;
|
||||
|
||||
typedef struct {
|
||||
uint32_t nodeNum;
|
||||
NODE_ENTRY *head;
|
||||
} NODE_LIST;
|
||||
|
||||
/************************** Variable Definitions *****************************/
|
||||
|
||||
/************************** Function Prototypes ******************************/
|
||||
int32_t NodeList_Init(NODE_LIST **list);
|
||||
void NodeList_Clear(NODE_LIST *list);
|
||||
void NodeList_Destroy(NODE_LIST *list);
|
||||
NODE_ENTRY *GetNode(NODE_LIST *list, uint32_t nodeId);
|
||||
int32_t AppendNode(NODE_LIST *list, uint8_t nodeId, L2_NODE_TYPE nodeType);
|
||||
int32_t DeletNode(NODE_LIST *list, uint8_t nodeId);
|
||||
int32_t UpdateNodePos(NODE_LIST *list, uint8_t nodeId, const COORD *newPos);
|
||||
int32_t GetNodePos(NODE_LIST *list, uint8_t nodeId, COORD *newPos);
|
||||
int32_t UpdateNodeSpeed(NODE_LIST *list, uint8_t nodeId, const COORD *newSpeed);
|
||||
int32_t GetNodeSpeed(NODE_LIST *list, uint8_t nodeId, COORD *speed);
|
||||
int32_t UpdateNodeTimeDeviation(NODE_LIST *list, uint8_t nodeId, int32_t devi);
|
||||
int32_t GetDistance(NODE_LIST *list, COORD myCoord, uint8_t nodeId, double* dst);
|
||||
int32_t GetNodeNum(NODE_LIST *list);
|
||||
int32_t RstNodeTTL(NODE_LIST *list, uint8_t nodeId);
|
||||
int32_t IncNodeTTL(NODE_LIST *list, uint8_t nodeId, uint32_t inc);
|
||||
int32_t GetNodeTTL(NODE_LIST *list, uint8_t nodeId, uint32_t *ttl);
|
||||
bool IsNodeInList(NODE_LIST *list, uint8_t nodeId);
|
||||
int32_t IterEditNode(NODE_LIST *list, const void *param, int32_t (*operation)(NODE_ENTRY*, const void*));
|
||||
int32_t IterDeleteNode(NODE_LIST *list, bool (*condition)(NODE_ENTRY *));
|
||||
|
||||
#endif /* NODE_LIST_H_ */
|
||||
@@ -0,0 +1,102 @@
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* Description: A simplified version of timesync for datalink 814 (Dijian)
|
||||
*
|
||||
* Date: 2021-12-04 16:32
|
||||
* LastEditors: Fan Hao
|
||||
* LastEditTime: 2022-07-06 16:32
|
||||
* Revisions: Rev 0.0
|
||||
* History:
|
||||
* [2022-07-06]: Initial version.
|
||||
* [2021-12-04]: Initial version.
|
||||
*
|
||||
* Copyright(c) 2021 Beijing Institute of Technology.
|
||||
* Lab of Communication and Networking
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef RTT_H_
|
||||
#define RTT_H_
|
||||
|
||||
/***************************** Include Files *********************************/
|
||||
#include <stdint.h>
|
||||
#include "linklayer814.h"
|
||||
#include "linklayer814_types.h"
|
||||
|
||||
/************************** Constant Definitions *****************************/
|
||||
#define MAX_FREQ_EST_NUM 128 // 32bit word
|
||||
#define SVC_FREQ_EST_NUM 512 // byte
|
||||
#define MGMT_FREQ_EST_NUM 512 // byte
|
||||
#define BISAR_FREQ_EST_NUM 480 // byte
|
||||
|
||||
#define CXR_FREQ 3800000000.0 // Hz
|
||||
|
||||
#define LIGHT_SPPED_AIR 299702547.0 // m/s
|
||||
#define LIGHT_SPPED_VAC 299792458.0 // m/s
|
||||
|
||||
#define RCV2FSYNC_CLOCKS 0 // clocks from frame sync time to receive time
|
||||
#define PHYRSP_DELAY_CLOCKS 0// clocks from frame sync time to receive time
|
||||
//#define PHY_SYNCT2FEND_200K 904052L
|
||||
//#define PHY_SYNCT2FEND_200K 924232L
|
||||
#define PHY_SYNCT2FEND_200K 905052L
|
||||
|
||||
#define RTT_TIME_NONE UINT32_MAX
|
||||
#define RTT_DOPPLER_NONE UINT32_MAX
|
||||
|
||||
|
||||
/***************** Macros (Inline Functions) Definitions *********************/
|
||||
|
||||
/**************************** Type Definitions *******************************/
|
||||
|
||||
// TODO: Multi-node RTT
|
||||
typedef struct {
|
||||
L2_TIME_WORD Tt1;
|
||||
L2_TIME_WORD Tr1;
|
||||
L2_TIME_WORD Tt2;
|
||||
L2_TIME_WORD Tr2;
|
||||
L2_TIME_WORD Tt3;
|
||||
L2_TIME_WORD Tr3;
|
||||
L2_TIME_WORD Tt4;
|
||||
L2_TIME_WORD Tr4;
|
||||
int32_t dopplerR1;
|
||||
int32_t dopplerR2;
|
||||
int32_t dopplerR3;
|
||||
int32_t dopplerR4;
|
||||
L2_TIME_WORD TroundA;
|
||||
L2_TIME_WORD TreplyA;
|
||||
L2_TIME_WORD TroundB;
|
||||
L2_TIME_WORD TreplyB;
|
||||
int32_t rttAdj;
|
||||
} RTT_RECORD;
|
||||
|
||||
typedef enum {
|
||||
RTT_NONE_STAGE = 0,
|
||||
RTT_REQ1 = 1,
|
||||
RTT_RSP1 = 2,
|
||||
RTT_REQ2 = 3,
|
||||
RTT_RSP2 = 4, // Rtt Stages
|
||||
} L2_RTT_SATGE;
|
||||
|
||||
typedef struct {
|
||||
L2_RCD rttStatge;
|
||||
bool isR1Valid;
|
||||
bool isR2Valid;
|
||||
bool isR3Valid;
|
||||
bool isR4Valid;
|
||||
RTT_RECORD rttRecord;
|
||||
} L2_RTT_FSM;
|
||||
|
||||
typedef enum {
|
||||
RTT_NONE = 0,
|
||||
RTT_SEND = 1,
|
||||
RTT_RCV = 2,
|
||||
} L2_RTT_TOR;
|
||||
|
||||
/************************** Function Prototypes ******************************/
|
||||
|
||||
// RTT
|
||||
L2_RTT_SATGE RTT_GetLastStage(L2_RTT_FSM* rttFsmPtr);
|
||||
L2_RTT_SATGE RTT_GetCurrentStage(L2_RTT_FSM* rttFsmPtr);
|
||||
L2_RTT_SATGE RTT_GetNextStage(L2_RTT_FSM* rttFsmPtr);
|
||||
|
||||
#endif /* RTT_H_ */
|
||||
@@ -0,0 +1,523 @@
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* Description: Time sync implementation file.
|
||||
*
|
||||
* Author: Author's name
|
||||
* Date: 2021-12-04 16:32
|
||||
* LastEditors: FanHao
|
||||
* LastEditTime: 2022-07-10 20:43
|
||||
* Revisions: Rev 0.0
|
||||
* History:
|
||||
* [2022-07-10]: New branch for Dijian.
|
||||
* [2021-12-04]: Initial version.
|
||||
*
|
||||
* Copyright(c) 2021 Beijing Institute of Technology.
|
||||
* Lab of Communication and Networking
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/***************************** Include Files *********************************/
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "linklayer814.h"
|
||||
#include "rtt.h"
|
||||
#include "../time_ctrl/time_ctrl.h"
|
||||
#include "../error.h"
|
||||
#include "../common.h"
|
||||
|
||||
/************************** Constant Definitions *****************************/
|
||||
/***************** Macros (Inline Functions) Definitions *********************/
|
||||
/**************************** Type Definitions *******************************/
|
||||
/************************** Variable Definitions *****************************/
|
||||
/************************** Function Prototypes ******************************/
|
||||
|
||||
static void RTT_StageUpdate(L2_RTT_FSM* rttFsmPtr, L2_RTT_SATGE newSatge);
|
||||
static void RTT_ResetRecord(RTT_RECORD* recordPtr);
|
||||
static int32_t RTT_GetCounter10nsDeviation(PHY_INST *phyRef);
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief a slot alignment, base on physical layer information.
|
||||
*
|
||||
* @param instPtr a pointer to linklayer layer instance
|
||||
* @param frameNum
|
||||
* @param slotNum
|
||||
*
|
||||
* @return SUCCESS Initialize successfully.
|
||||
* FAILURE Initialization failed, allocate memory fail or initial
|
||||
* bram controller fail.
|
||||
*
|
||||
******************************************************************************/
|
||||
// TODO: Check
|
||||
int32_t L2_TimeAlign(L2_INST* instPtr, uint32_t frameNum, uint32_t slotNum){
|
||||
L1_FRAME_TYPE lastRecvdFrame;
|
||||
lastRecvdFrame = Phy_GetLastRecvFrameType(instPtr->config.phyInstPtr);
|
||||
if(lastRecvdFrame != L1_NONE_FRAME){
|
||||
return EIGNORE;
|
||||
}
|
||||
|
||||
// read nextSendTime from physical layer
|
||||
uint64_t currTime, expctTime;
|
||||
int64_t timeDiff;
|
||||
TIME_WORD timeStamp, slotTimerAdjmet;
|
||||
expctTime = ((uint64_t)(frameNum*L2_SLOTS_PER_FRAME + slotNum))*COUNTE_FRAC_MAX;
|
||||
expctTime += Phy_GetTimeComp(lastRecvdFrame);
|
||||
|
||||
Phy_GetFrameSyncTimeStamp(instPtr->config.phyInstPtr, &timeStamp);
|
||||
currTime = (uint64_t)timeStamp.frac_part;
|
||||
currTime += ((uint64_t)timeStamp.int_part) * COUNTE_FRAC_MAX;
|
||||
|
||||
timeDiff = (int64_t)(expctTime - currTime);
|
||||
|
||||
slotTimerAdjmet.int_part = (uint32_t)(timeDiff/COUNTE_FRAC_MAX);
|
||||
slotTimerAdjmet.frac_part = (uint32_t)(timeDiff%COUNTE_FRAC_MAX);
|
||||
TimeCtrl_TimeAdjust(instPtr->config.tmcInstPtr, &slotTimerAdjmet, TM_ADJ_ADD);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get last RTT stage of a specified RTT descriptor.
|
||||
*/
|
||||
inline L2_RTT_SATGE RTT_GetLastStage(L2_RTT_FSM* rttFsmPtr){
|
||||
ASSERT(rttFsmPtr != NULL);
|
||||
return rttFsmPtr->rttStatge.last;
|
||||
}
|
||||
/**
|
||||
* @brief Get current RTT stage of a specified RTT descriptor.
|
||||
*/
|
||||
inline L2_RTT_SATGE RTT_GetCurrentStage(L2_RTT_FSM* rttFsmPtr){
|
||||
ASSERT(rttFsmPtr != NULL);
|
||||
return rttFsmPtr->rttStatge.curr;
|
||||
}
|
||||
/**
|
||||
* @brief Get next RTT stage of a specified RTT descriptor.
|
||||
*/
|
||||
inline L2_RTT_SATGE RTT_GetNextStage(L2_RTT_FSM* rttFsmPtr){
|
||||
ASSERT(rttFsmPtr != NULL);
|
||||
return rttFsmPtr->rttStatge.next;
|
||||
}
|
||||
/**
|
||||
* @brief Get next RTT stage of a specified RTT descriptor.
|
||||
*/
|
||||
static inline void RTT_ResetRecord(RTT_RECORD* recordPtr){
|
||||
ASSERT(recordPtr != NULL);
|
||||
memset(recordPtr, 0x00, sizeof(RTT_RECORD));
|
||||
return;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Update corrent time-sync for RTT stage
|
||||
*
|
||||
* @param scanFsmPtr A pointer to scan net fsm.
|
||||
* newSatge New state.
|
||||
*
|
||||
* @return NONE.
|
||||
*
|
||||
******************************************************************************/
|
||||
static void RTT_StageUpdate(L2_RTT_FSM* rttFsmPtr, L2_RTT_SATGE newSatge) {
|
||||
ASSERT(rttFsmPtr != NULL);
|
||||
ASSERT(newSatge >= RTT_NONE_STAGE && newSatge <= RTT_RSP2);
|
||||
DBG_INFO("RTT current Stage: %u -> RTT new Stage: %u, Stage: arranged.%d.\n",
|
||||
rttFsmPtr->rttStatge.curr, rttFsmPtr->rttStatge.next, newSatge);
|
||||
L2_RcdShift(&(rttFsmPtr->rttStatge), newSatge);
|
||||
return;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Reset RTT systerm .
|
||||
*
|
||||
* @param rttFsmPtr
|
||||
*
|
||||
* @return SUCCESS Initialization successful.
|
||||
* EMAC_MEMORY_ALLOC_ERROR Memory allocate error.
|
||||
*
|
||||
******************************************************************************/
|
||||
void RTT_Reset(L2_RTT_FSM* rttFsmPtr){
|
||||
ASSERT(rttFsmPtr != NULL);
|
||||
RTT_ResetRecord(&(rttFsmPtr->rttRecord));
|
||||
rttFsmPtr->rttStatge.last = RTT_NONE_STAGE;
|
||||
rttFsmPtr->rttStatge.curr = RTT_NONE_STAGE;
|
||||
rttFsmPtr->rttStatge.next = RTT_NONE_STAGE;
|
||||
rttFsmPtr->isR1Valid = false;
|
||||
rttFsmPtr->isR2Valid = false;
|
||||
rttFsmPtr->isR3Valid = false;
|
||||
rttFsmPtr->isR4Valid = false;
|
||||
}
|
||||
|
||||
void RTT_Destroy(L2_RTT_FSM* rttFsmPtr){
|
||||
free(rttFsmPtr);
|
||||
}
|
||||
|
||||
|
||||
static int32_t RTT_GetCounter10nsDeviation(PHY_INST *phyRef) {
|
||||
TIME_WORD timeStamp;
|
||||
int64_t lastFrameSyncT, lastSlotStartT;
|
||||
Phy_GetFrameSyncTimeStamp(phyRef, &timeStamp);
|
||||
lastFrameSyncT = (uint64_t) timeStamp.frac_part;
|
||||
lastFrameSyncT += ((uint64_t)timeStamp.int_part) * COUNTE_FRAC_MAX;
|
||||
Phy_GetLastSlotStartTimeStamp(phyRef, &timeStamp);
|
||||
lastSlotStartT = (uint64_t) timeStamp.frac_part;
|
||||
lastSlotStartT += ((uint64_t)timeStamp.int_part) * COUNTE_FRAC_MAX;
|
||||
return (PHY_SYNCT2FEND_200K - (lastSlotStartT - lastFrameSyncT));
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Initialize RTT FSM, allocate memory for FSM instance.
|
||||
*
|
||||
* @param rttFsmPtr
|
||||
*
|
||||
* @return SUCCESS Initialization successful.
|
||||
* EMAC_MEMORY_ALLOC_ERROR Memory allocate error.
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t RTT_Init(L2_RTT_FSM** rttFsmPtr){
|
||||
(*rttFsmPtr) = (L2_RTT_FSM*) malloc(sizeof(L2_RTT_FSM));
|
||||
if (*rttFsmPtr == NULL) {
|
||||
free(*rttFsmPtr);
|
||||
return EALLOC;
|
||||
}
|
||||
RTT_Reset(*rttFsmPtr);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* @brief Execute a Time-Sync Process.
|
||||
*
|
||||
* @param instPtr a pointer to linklayer layer instance
|
||||
*
|
||||
* @return SUCCESS Time-Sync Process Done.
|
||||
* FAILURE Time-Sync Process end with error.
|
||||
*
|
||||
******************************************************************************/
|
||||
int32_t RTT_Proc(L2_INST* instPtr) {
|
||||
ASSERT(instPtr != NULL);
|
||||
L2_RTT_FSM* rttFsmPtr = L2_GetRttDesc(instPtr);
|
||||
RTT_RECORD* rttRecord = &(rttFsmPtr->rttRecord);
|
||||
PHY_INST *phyRef = instPtr->config.phyInstPtr;
|
||||
int32_t Status = SUCCESS;
|
||||
L2_RTT_TOR lastTor, nextTor;
|
||||
if(instPtr->rtneConfig.last != NULL && instPtr->rtneConfig.last->slotType == SLOT_INTRA_TSYNC){
|
||||
// Get last tor state
|
||||
if(instPtr->rtneConfig.last->src0 == instPtr->myInfo.nodeId){
|
||||
lastTor = RTT_SEND;
|
||||
}
|
||||
else if(instPtr->rtneConfig.last->dst0 == instPtr->myInfo.nodeId){
|
||||
lastTor = RTT_RCV;
|
||||
}
|
||||
else{
|
||||
lastTor = RTT_NONE;
|
||||
}
|
||||
}
|
||||
else{
|
||||
lastTor = RTT_NONE;
|
||||
}
|
||||
|
||||
if(instPtr->rtneConfig.next != NULL && instPtr->rtneConfig.next->slotType == SLOT_INTRA_TSYNC){
|
||||
// Get next tor state
|
||||
if(instPtr->rtneConfig.next->src0 == instPtr->myInfo.nodeId){
|
||||
nextTor = RTT_SEND;
|
||||
}
|
||||
else if(instPtr->rtneConfig.next->dst0 == instPtr->myInfo.nodeId){
|
||||
nextTor = RTT_RCV;
|
||||
}
|
||||
else{
|
||||
nextTor = RTT_NONE;
|
||||
}
|
||||
}
|
||||
else{
|
||||
nextTor = RTT_NONE;
|
||||
}
|
||||
|
||||
DBG_INFO("-------- RTT Procedure --------\n");
|
||||
// Stage trans
|
||||
// For Head Node: Tx->Rx->Tx->Rx
|
||||
if(instPtr->myInfo.nodeType == HEAD_NODE){
|
||||
switch(rttFsmPtr->rttStatge.next) {
|
||||
case RTT_NONE_STAGE :
|
||||
DBG_INFO("RTT procedure start...\n");
|
||||
// TODO
|
||||
// RTT_ResetRecord(rttRecord);
|
||||
RTT_StageUpdate(rttFsmPtr, RTT_REQ1);
|
||||
break;
|
||||
case RTT_REQ1 :
|
||||
if(nextTor == RTT_SEND){
|
||||
DBG_INFO("Prepare data for RTT REQ-1\n");
|
||||
rttRecord->Tt1.timeH = L2_GetNextFrameNum(instPtr)*L2_SLOTS_PER_FRAME + L2_GetNextSlotNum(instPtr);
|
||||
rttRecord->Tt1.timeL = 0 ;
|
||||
DBG_INFO("Tt1-timeL:%u.\n", rttRecord->Tt1.timeL);
|
||||
DBG_INFO("Tt1-timeH:%u.\n", rttRecord->Tt1.timeH);
|
||||
RTT_StageUpdate(rttFsmPtr, RTT_RSP1);
|
||||
}
|
||||
else{
|
||||
DBG_INFO("Skip RTT slot, [Stage: %u].\n", rttFsmPtr->rttStatge.next);
|
||||
}
|
||||
break;
|
||||
case RTT_RSP1 :
|
||||
if(lastTor == RTT_RCV){
|
||||
if(L2_isDataAvail(instPtr) == true){
|
||||
DBG_INFO("RTT RSP-1 have been received.\n");
|
||||
DBG_INFO("Preparing data for RTT REQ-2.\n");
|
||||
rttFsmPtr->isR2Valid = true;
|
||||
// Calculate doppler
|
||||
double doppler = Phy_GetCoarseFreqEst(phyRef);
|
||||
rttRecord->dopplerR2 = (int32_t)doppler;
|
||||
DBG_INFO("rttRecord->dopplerR2: %u.\n", rttRecord->dopplerR2);
|
||||
|
||||
// Calculate last frame receive time.
|
||||
int32_t counter10ns = RTT_GetCounter10nsDeviation(phyRef);
|
||||
// response for rtt Adj
|
||||
counter10ns += 10000;
|
||||
counter10ns -= rttRecord->rttAdj;
|
||||
if ( counter10ns < 0) {
|
||||
counter10ns += COUNTE_FRAC_MAX;
|
||||
rttRecord->Tr2.timeH -- ;
|
||||
_nop_();
|
||||
}
|
||||
rttRecord->Tr2.timeH = L2_GetLastFrameNum(instPtr)*L2_SLOTS_PER_FRAME + L2_GetLastSlotNum(instPtr);
|
||||
rttRecord->Tr2.timeL = (uint32_t)counter10ns;
|
||||
DBG_INFO("Tr2-timeL:%u.\n", rttRecord->Tr2.timeL);
|
||||
DBG_INFO("Tr2-timeH:%u.\n", rttRecord->Tr2.timeH);
|
||||
|
||||
// Calculate TroundA
|
||||
rttRecord->TroundA.timeL = rttRecord->Tr2.timeL;
|
||||
rttRecord->TroundA.timeH = rttRecord->Tr2.timeH - rttRecord->Tt1.timeH;
|
||||
DBG_INFO("TroundA-timeL:%u.\n", rttRecord->TroundA.timeL);
|
||||
DBG_INFO("TroundA-timeH:%u.\n", rttRecord->TroundA.timeH);
|
||||
}
|
||||
else{
|
||||
rttFsmPtr->isR2Valid = false;
|
||||
rttRecord->dopplerR2 = RTT_DOPPLER_NONE;
|
||||
rttRecord->TroundA.timeL = RTT_TIME_NONE;
|
||||
rttRecord->TroundA.timeH = RTT_TIME_NONE;
|
||||
DBG_WARNING("RTT RSP-1 have not been received [Stage: %u].\n", rttFsmPtr->rttStatge.next);
|
||||
DBG_WARNING("Set dopplerR2 and TroundA to dummy value.\n");
|
||||
DBG_INFO("dopplerR2:%08X.\n", rttRecord->dopplerR2);
|
||||
DBG_INFO("TroundA-timeL:%08X.\n", rttRecord->TroundA.timeL);
|
||||
DBG_INFO("TroundA-timeH:%08X.\n", rttRecord->TroundA.timeH);
|
||||
}
|
||||
RTT_StageUpdate(rttFsmPtr, RTT_REQ2);
|
||||
}
|
||||
else{
|
||||
DBG_INFO("Skip RTT slot, [Stage: %u].\n", rttFsmPtr->rttStatge.next);
|
||||
}
|
||||
break;
|
||||
case RTT_REQ2 :
|
||||
if(nextTor == RTT_SEND){
|
||||
DBG_INFO("Prepare data for RTT REQ-2\n");
|
||||
rttRecord->Tt3.timeH = L2_GetNextFrameNum(instPtr)*L2_SLOTS_PER_FRAME + L2_GetNextSlotNum(instPtr);
|
||||
rttRecord->Tt3.timeL = 0 ;
|
||||
DBG_INFO("Tt3-timeL:%u.\n", rttRecord->Tt3.timeL);
|
||||
DBG_INFO("Tt3-timeH:%u.\n", rttRecord->Tt3.timeH);
|
||||
|
||||
if ( rttFsmPtr->isR2Valid ) {
|
||||
// Calculate reply A
|
||||
rttRecord->TreplyA.timeL = COUNTE_FRAC_MAX - rttRecord->Tr2.timeL;
|
||||
rttRecord->TreplyA.timeH = rttRecord->Tt3.timeH - rttRecord->Tr2.timeH - 1;
|
||||
DBG_INFO("TreplyA-timeL:%u.\n", rttRecord->TreplyA.timeL);
|
||||
DBG_INFO("TreplyA-timeH:%u.\n", rttRecord->TreplyA.timeH);
|
||||
}
|
||||
else {
|
||||
rttRecord->TreplyA.timeL = RTT_TIME_NONE;
|
||||
rttRecord->TreplyA.timeH = RTT_TIME_NONE;
|
||||
DBG_WARNING("RTT RSP-1 have not been received [Stage: %u].\n", rttFsmPtr->rttStatge.next);
|
||||
DBG_WARNING("Set TreplyA to dummy value.\n");
|
||||
DBG_INFO("TreplyA-timeL:%08X.\n", rttRecord->TreplyA.timeL);
|
||||
DBG_INFO("TreplyA-timeH:%08X.\n", rttRecord->TreplyA.timeH);
|
||||
}
|
||||
RTT_StageUpdate(rttFsmPtr, RTT_RSP2);
|
||||
}
|
||||
else{
|
||||
DBG_INFO("Skip RTT slot, [Stage: %u].\n", rttFsmPtr->rttStatge.next);
|
||||
}
|
||||
break;
|
||||
case RTT_RSP2 :
|
||||
if(lastTor == RTT_RCV){
|
||||
if(L2_isDataAvail(instPtr) == true){
|
||||
DBG_INFO("RTT RSP-2 have been received.\n");
|
||||
rttFsmPtr->isR4Valid = true;
|
||||
// Calculate doppler
|
||||
double doppler = Phy_GetCoarseFreqEst(phyRef);
|
||||
rttRecord->dopplerR2 = (int32_t)doppler;
|
||||
DBG_INFO("rttRecord->dopplerR2: %d.\n", rttRecord->dopplerR2);
|
||||
|
||||
// Calculate last frame receive time.
|
||||
int32_t counter10ns = RTT_GetCounter10nsDeviation(phyRef);
|
||||
if ( counter10ns < 0) {
|
||||
counter10ns += COUNTE_FRAC_MAX;
|
||||
rttRecord->Tr4.timeH -- ;
|
||||
}
|
||||
rttRecord->Tr2.timeH = L2_GetLastFrameNum(instPtr)*L2_SLOTS_PER_FRAME + L2_GetLastSlotNum(instPtr);
|
||||
// Get a cnt with clk of 192MHz
|
||||
rttRecord->Tr4.timeL = (uint32_t)counter10ns;
|
||||
DBG_INFO("Tr4-timeL:%u.\n", rttRecord->Tr4.timeL);
|
||||
DBG_INFO("Tr4-timeH:%u.\n", rttRecord->Tr4.timeH);
|
||||
}
|
||||
else{
|
||||
rttFsmPtr->isR4Valid = false;
|
||||
rttRecord->Tr4.timeL = RTT_TIME_NONE;
|
||||
rttRecord->Tr4.timeH = RTT_TIME_NONE;
|
||||
DBG_WARNING("RTT RSP-2 have not been received [Stage: %u].\n", rttFsmPtr->rttStatge.next);
|
||||
DBG_WARNING("Set Tr4 to dummy value.\n");
|
||||
DBG_INFO("Tr4-timeL:%08X.\n", rttRecord->Tr4.timeL);
|
||||
DBG_INFO("Tr4-timeH:%08X.\n", rttRecord->Tr4.timeH);
|
||||
}
|
||||
RTT_StageUpdate(rttFsmPtr, RTT_NONE_STAGE);
|
||||
DBG_INFO("RTT procedure end...\n");
|
||||
}
|
||||
break;
|
||||
default :
|
||||
break;
|
||||
}
|
||||
}
|
||||
// For Member Node: Rx->Tx->Rx->Tx
|
||||
else{
|
||||
switch (rttFsmPtr->rttStatge.next) {
|
||||
case RTT_NONE_STAGE :
|
||||
DBG_INFO("RTT procedure start...\n");
|
||||
// TODO
|
||||
// RTT_ResetRecord(rttRecord);
|
||||
RTT_StageUpdate(rttFsmPtr, RTT_REQ1);
|
||||
break;
|
||||
case RTT_REQ1 :
|
||||
if(lastTor == RTT_RCV){
|
||||
if(L2_isDataAvail(instPtr) == true){
|
||||
DBG_INFO("RTT REQ-1 have been received.\n");
|
||||
DBG_INFO("Preparing data for RTT RSP-1.\n");
|
||||
rttFsmPtr->isR2Valid = true;
|
||||
// Calculate doppler
|
||||
double doppler = Phy_GetCoarseFreqEst(phyRef);
|
||||
rttRecord->dopplerR2 = (int32_t)doppler;
|
||||
DBG_INFO("rttRecord->dopplerR2: %d.\n", rttRecord->dopplerR2);
|
||||
|
||||
// Calculate last frame receive time.
|
||||
int32_t counter10ns = RTT_GetCounter10nsDeviation(phyRef);
|
||||
if ( counter10ns < 0) {
|
||||
counter10ns += COUNTE_FRAC_MAX;
|
||||
rttRecord->Tr1.timeH -- ;
|
||||
}
|
||||
rttRecord->Tr1.timeH = L2_GetLastFrameNum(instPtr)*L2_SLOTS_PER_FRAME + L2_GetLastSlotNum(instPtr);
|
||||
rttRecord->Tr1.timeL = (uint32_t)counter10ns;
|
||||
DBG_INFO("Tr1-timeL:%u.\n", rttRecord->Tr1.timeL);
|
||||
DBG_INFO("Tr1-timeH:%u.\n", rttRecord->Tr1.timeH);
|
||||
}
|
||||
else{
|
||||
rttFsmPtr->isR1Valid = false;
|
||||
rttRecord->dopplerR1 = RTT_DOPPLER_NONE;
|
||||
rttRecord->Tr1.timeL = RTT_TIME_NONE;
|
||||
rttRecord->Tr1.timeH = RTT_TIME_NONE;
|
||||
DBG_WARNING("RTT REQ-1 have not been received [Stage: %u].\n", rttFsmPtr->rttStatge.next);
|
||||
DBG_WARNING("Set dopplerR1 and Tr1 to dummy value.\n");
|
||||
DBG_INFO("dopplerR1:%08X.\n", rttRecord->dopplerR1);
|
||||
DBG_INFO("Tr1-timeL:%08X.\n", rttRecord->Tr1.timeL);
|
||||
DBG_INFO("Tr1-timeH:%08X.\n", rttRecord->Tr1.timeH);
|
||||
}
|
||||
RTT_StageUpdate(rttFsmPtr, RTT_RSP1);
|
||||
}
|
||||
break;
|
||||
case RTT_RSP1 :
|
||||
if(nextTor == RTT_SEND){
|
||||
DBG_INFO("Prepare data for RTT RSP-1\n");
|
||||
rttRecord->Tt2.timeH = L2_GetNextFrameNum(instPtr)*L2_SLOTS_PER_FRAME + L2_GetNextSlotNum(instPtr);
|
||||
rttRecord->Tt2.timeL = 0 ;
|
||||
DBG_INFO("Tt2-timeL:%u.\n", rttRecord->Tt2.timeL);
|
||||
DBG_INFO("Tt2-timeH:%u.\n", rttRecord->Tt2.timeH);
|
||||
|
||||
if ( rttFsmPtr->isR1Valid ) {
|
||||
// Calculate reply B
|
||||
rttRecord->TreplyB.timeL = COUNTE_FRAC_MAX - rttRecord->Tr1.timeL;
|
||||
rttRecord->TreplyB.timeH = rttRecord->Tt2.timeH - rttRecord->Tr1.timeH - 1;
|
||||
DBG_INFO("TreplyB-timeL:%u.\n", rttRecord->TreplyB.timeL);
|
||||
DBG_INFO("TreplyB-timeH:%u.\n", rttRecord->TreplyB.timeH);
|
||||
}
|
||||
else {
|
||||
rttRecord->TreplyB.timeL = RTT_TIME_NONE;
|
||||
rttRecord->TreplyB.timeH = RTT_TIME_NONE;
|
||||
DBG_WARNING("RTT REQ-1 have not been received [Stage: %u].\n", rttFsmPtr->rttStatge.next);
|
||||
DBG_WARNING("Set ReplayB to dummy value.\n");
|
||||
DBG_INFO("TreplyB-timeL:%08X.\n", rttRecord->TreplyB.timeL);
|
||||
DBG_INFO("TreplyB-timeH:%08X.\n", rttRecord->TreplyB.timeH);
|
||||
}
|
||||
RTT_StageUpdate(rttFsmPtr, RTT_REQ2);
|
||||
}
|
||||
break;
|
||||
case RTT_REQ2 :
|
||||
if(lastTor == RTT_RCV){
|
||||
if(L2_isDataAvail(instPtr) == true){
|
||||
DBG_INFO("RTT REQ-2 have been received.\n");
|
||||
DBG_INFO("Preparing data for RTT RSP-2.\n");
|
||||
rttFsmPtr->isR3Valid = true;
|
||||
|
||||
// Calculate doppler
|
||||
double doppler = Phy_GetCoarseFreqEst(phyRef);
|
||||
rttRecord->dopplerR2 = (int32_t)doppler;
|
||||
DBG_INFO("rttRecord->dopplerR2: %d.\n", rttRecord->dopplerR2);
|
||||
|
||||
// Calculate last frame receive time.
|
||||
int32_t counter10ns = RTT_GetCounter10nsDeviation(phyRef);
|
||||
if ( counter10ns < 0) {
|
||||
counter10ns += COUNTE_FRAC_MAX;
|
||||
rttRecord->Tr3.timeH -- ;
|
||||
}
|
||||
rttRecord->Tr3.timeL = (uint32_t)counter10ns;
|
||||
DBG_INFO("Tr3-timeL:%u.\n", rttRecord->Tr3.timeL);
|
||||
DBG_INFO("Tr3-timeH:%u.\n", rttRecord->Tr3.timeH);
|
||||
|
||||
// Calculate TroundB
|
||||
rttRecord->TroundB.timeL = rttRecord->Tr3.timeL;
|
||||
rttRecord->TroundB.timeH = rttRecord->Tr3.timeH - rttRecord->Tt2.timeH;
|
||||
DBG_INFO("TroundB-timeL:%u.\n", rttRecord->TroundB.timeL);
|
||||
DBG_INFO("TroundB-timeH:%u.\n", rttRecord->TroundB.timeH);
|
||||
}
|
||||
else{
|
||||
rttFsmPtr->isR3Valid = false;
|
||||
rttRecord->dopplerR3 = RTT_DOPPLER_NONE;
|
||||
rttRecord->TroundB.timeL = RTT_TIME_NONE;
|
||||
rttRecord->TroundB.timeH = RTT_TIME_NONE;
|
||||
DBG_WARNING("RTT REQ-2 have not been received [Stage: %u].\n", rttFsmPtr->rttStatge.next);
|
||||
DBG_WARNING("Set dopplerR3 and ReplayB to dummy value.\n");
|
||||
DBG_INFO("dopplerR3:%08X.\n", rttRecord->dopplerR3);
|
||||
DBG_INFO("TroundB-timeL:%08X.\n", rttRecord->TroundB.timeL);
|
||||
DBG_INFO("TroundB-timeH:%08X.\n", rttRecord->TroundB.timeH);
|
||||
}
|
||||
RTT_StageUpdate(rttFsmPtr, RTT_RSP2);
|
||||
}
|
||||
break;
|
||||
case RTT_RSP2 :
|
||||
if(nextTor == RTT_SEND){
|
||||
DBG_INFO("Prepare data for RTT RSP-2\n");
|
||||
rttRecord->Tt4.timeH = L2_GetNextFrameNum(instPtr)*L2_SLOTS_PER_FRAME + L2_GetNextSlotNum(instPtr);
|
||||
rttRecord->Tt4.timeL = 0;
|
||||
DBG_INFO("Tt4-timeL:%u.\n", rttRecord->Tt4.timeL);
|
||||
DBG_INFO("Tt4-timeH:%u.\n", rttRecord->Tt4.timeH);
|
||||
|
||||
if ( rttFsmPtr->isR3Valid ) {
|
||||
// Calculate reply B
|
||||
rttRecord->TreplyB.timeL = COUNTE_FRAC_MAX - rttRecord->Tr3.timeL;
|
||||
rttRecord->TreplyB.timeH = rttRecord->Tt4.timeH - rttRecord->Tr3.timeH - 1;
|
||||
DBG_INFO("TreplyB-timeL:%u.\n", rttRecord->TreplyB.timeL);
|
||||
DBG_INFO("TreplyB-timeH:%u.\n", rttRecord->TreplyB.timeH);
|
||||
// TODO implement a time adjustment.
|
||||
DBG_INFO("RTT procedure end...\n");
|
||||
}
|
||||
else {
|
||||
rttRecord->TreplyB.timeL = RTT_TIME_NONE;
|
||||
rttRecord->TreplyB.timeH = RTT_TIME_NONE;
|
||||
DBG_WARNING("RTT REQ-2 have not been received [Stage: %u].\n", rttFsmPtr->rttStatge.next);
|
||||
DBG_WARNING("Set ReplayB to dummy value.\n");
|
||||
DBG_INFO("TreplyB-timeL:%08X.\n", rttRecord->TreplyB.timeL);
|
||||
DBG_INFO("TreplyB-timeH:%08X.\n", rttRecord->TreplyB.timeH);
|
||||
}
|
||||
RTT_StageUpdate(rttFsmPtr, RTT_NONE_STAGE);
|
||||
}
|
||||
break;
|
||||
default :
|
||||
break;
|
||||
}
|
||||
}
|
||||
return Status;
|
||||
}
|
||||
Reference in New Issue
Block a user