123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675 |
- #pragma once
- #include "types.h"
- #define Geocache_REV 1.0
- public ref class Geocache
- {
- public:
-
- static const UCHAR DEVICE_TYPE = 19;
- static const UCHAR TX_TYPE_SENSOR = 5;
- static const UCHAR TX_TYPE_DISPLAY = 0;
- static const UCHAR RF_CHANNEL = 57;
- static const USHORT MESG_4HZ_PERIOD = 8192;
- static const USHORT MESG_P5HZ_PERIOD = 65535;
- static const UCHAR MESG_4HZ_TIMEOUT = (4 * 30);
- static const UCHAR MESG_REQ_RESP_ACK = 0x81;
- static const UCHAR MESG_REQ_RESP_BROADCAST = 0x01;
- static const UCHAR MESG_WAIT_REQ = 5;
-
-
- static const UCHAR PAGE_0 = 0;
- static const UCHAR PAGE_1 = 1;
- static const UCHAR PAGE_2 = 2;
- static const UCHAR PAGE_3 = 3;
- static const UCHAR PAGE_32 = 32;
- static const UCHAR PAGE_AUTHENTICATION = 32;
- static const UCHAR START_PROG_PAGES = 2;
-
- static const UCHAR ACK_FAIL = 0;
- static const UCHAR ACK_SUCCESS = 1;
-
-
- static const UCHAR RESERVED = 0xFF;
-
- static const UCHAR BYTE_MASK = 0xFF;
- static const UCHAR UPPER_NIBBLE_MASK = 0xF0;
- static const UCHAR LOWER_NIBBLE_MASK = 0x0F;
- static const UCHAR NEGATIVE_BYTE_MASK = 0x80;
- static const UCHAR REMOVE_SIGNED_BIT_MASK = 0x7F;
- static const ULONG NEGATIVE_LONG_MASK = 0xF0000000;
-
- static const UCHAR NIBBLE_SHIFT = 4;
- static const UCHAR BYTE_SHIFT = 8;
- static const UCHAR LATLON_BYTE_2_SHIFT = 8;
- static const UCHAR LATLON_BYTE_3_SHIFT = 16;
- static const UCHAR LATLON_BYTE_4_SHIFT = 24;
-
- static const USHORT TIME_SCALE_FACTOR = 1024;
- static const DOUBLE SEMI_CIRCLE_CONVERSION = System::Math::Pow(2.0, 31) / 180;
- static const UCHAR ID_LEN = 9;
- static const UCHAR TXT_LEN = 90;
- static const UCHAR AUTH_LEN = 41;
- static const UCHAR DEFAULT_ID = 0x00;
- static const UCHAR DEFAULT_TOT_PAGES = 0xFF;
- static const ULONG DEFAULT_PIN = 0xFFFFFFFF;
- static const UCHAR HINT_CHARS_PER_PAGE = 6;
-
- static const UCHAR PROGRAMMABLE_PAGES = 31;
- static const UCHAR DATA_ID_LATITUDE = 0;
- static const UCHAR DATA_ID_LONGITUDE = 1;
- static const UCHAR DATA_ID_HINT = 2;
- static const UCHAR DATA_ID_PIN = 3;
- static const UCHAR DATA_ID_LOGGED_VISITS = 4;
-
-
- ref class Error : public System::Exception{
- public:
- BOOL bBadReserved;
- BOOL bUndefPage;
- enum class Code : UCHAR // Error code definitions
- {
- INVALID_RESERVED,
- UNDEF_PAGE,
- };
- Error()
- {
- ClearFlags();
- }
- Error(Code eCode1_)
- {
- ClearFlags();
- SetFlags(eCode1_);
- }
- Error(Code eCode1_, Code eCode2_)
- {
- ClearFlags();
- SetFlags(eCode1_);
- SetFlags(eCode2_);
- }
- private:
- void ClearFlags()
- {
- bBadReserved = FALSE;
- bUndefPage = FALSE;
- }
- void SetFlags(Code eCode_)
- {
- switch(eCode_)
- {
- case Code::INVALID_RESERVED:
- bBadReserved = TRUE;
- break;
- case Code::UNDEF_PAGE:
- bUndefPage = TRUE;
- break;
- default:
- break;
- }
- }
- };
- public:
- USHORT usMessagePeriod;
- UCHAR ucReceivedPageNum;
-
-
- array<UCHAR, 1>^ cID;
-
- ULONG ulPIN;
- UCHAR ucTotalPages;
-
- BOOL bPINRequest;
- BOOL b4HzRotation;
- BOOL bPageRequest;
- BOOL bAckResponseRequest;
- UCHAR ucRequestedPageNum;
- BOOL bLatitudeEnabled;
- BOOL bLongitudeEnabled;
- BOOL bHintEnabled;
- BOOL bLoggedVisitsEnabled;
-
- UCHAR ucProgTotalPages;
-
- UCHAR ucCurrProgPage;
-
- array<BOOL, 1>^ bPageProg;
-
- array<BOOL, 1>^ bPageRead;
-
- array<UCHAR, 2>^ ucProgPages;
-
- SLONG slLatitude_SC;
-
- SLONG slLongitude_SC;
-
- array<UCHAR, 1>^ cHint;
- UCHAR ucHintStartPage;
- UCHAR ucNumHintPages;
-
- UCHAR ucLoggedVisitPage;
- ULONG ulLastVisitTimestamp;
- USHORT usNumVisits;
- UCHAR ucSeconds;
- UCHAR ucMinutes;
- UCHAR ucHours;
- UCHAR ucDays;
- UCHAR ucMonth;
- UCHAR ucYears;
-
- array <UCHAR, 1>^ ucAuthToken;
- ULONG ulSerialNum;
- USHORT usNonce;
- public:
- Geocache()
- {
-
- slLatitude_SC = 0;
- slLongitude_SC = 0;
- cID = gcnew array<UCHAR>(10);
- cHint = gcnew array<UCHAR>(180);
- ucAuthToken = gcnew array<UCHAR>(7);
- ucProgPages = gcnew array<UCHAR,2>(32,8);
- bPageRead = gcnew array<BOOL>(83);
- bPageProg = gcnew array<BOOL>(32);
- }
- ~Geocache()
- {
- }
- public:
- void Decode(UCHAR* pucRxBuffer_)
- {
- UCHAR ucPageNum = pucRxBuffer_[0];
- UCHAR ucDataID;
- static UCHAR ucHintOffset;
- switch(ucPageNum)
- {
- case PAGE_0:
-
- cID[0] = ((pucRxBuffer_[1] >> 2) & 0x3F);
- cID[1] = ((pucRxBuffer_[1] << 4) & 0x30) + ((pucRxBuffer_[2] >> 4) & 0x0F);
- cID[2] = ((pucRxBuffer_[2] << 2) & 0x3C) + ((pucRxBuffer_[3] >> 6) & 0x03);
- cID[3] = ((pucRxBuffer_[3] >> 0) & 0x3F);
- cID[4] = ((pucRxBuffer_[4] >> 2) & 0x3F);
- cID[5] = ((pucRxBuffer_[4] << 4) & 0x30) + ((pucRxBuffer_[5] >> 4) & 0x0F);
- cID[6] = ((pucRxBuffer_[5] << 2) & 0x3C) + ((pucRxBuffer_[6] >> 6) & 0x03);
- cID[7] = ((pucRxBuffer_[6] >> 0) & 0x3F);
- cID[8] = ((pucRxBuffer_[7] >> 2) & 0x3F);
- break;
- case PAGE_1:
-
- ulPIN = (pucRxBuffer_[2] << 0) + (pucRxBuffer_[3] << 8) +
- (pucRxBuffer_[4] << 16) + (pucRxBuffer_[5] << 24) ;
- ucTotalPages = pucRxBuffer_[6];
- ucHintStartPage = 0;
- break;
- case PAGE_32:
-
- ucAuthToken[0] = pucRxBuffer_[1];
- ucAuthToken[1] = pucRxBuffer_[2];
- ucAuthToken[2] = pucRxBuffer_[3];
- ucAuthToken[3] = pucRxBuffer_[4];
- ucAuthToken[4] = pucRxBuffer_[5];
- ucAuthToken[5] = pucRxBuffer_[6];
- ucAuthToken[6] = pucRxBuffer_[7];
- break;
- default:
- ucProgPages[ucPageNum,0] = pucRxBuffer_[0];
- ucProgPages[ucPageNum,1] = pucRxBuffer_[1];
- ucProgPages[ucPageNum,2] = pucRxBuffer_[2];
- ucProgPages[ucPageNum,3] = pucRxBuffer_[3];
- ucProgPages[ucPageNum,4] = pucRxBuffer_[4];
- ucProgPages[ucPageNum,5] = pucRxBuffer_[5];
- ucProgPages[ucPageNum,6] = pucRxBuffer_[6];
- ucProgPages[ucPageNum,7] = pucRxBuffer_[7];
- ucDataID = pucRxBuffer_[1];
- switch (ucDataID)
- {
- case DATA_ID_LATITUDE:
- bLatitudeEnabled = TRUE;
- slLatitude_SC = (long)((pucRxBuffer_[2]) |
- (pucRxBuffer_[3] << LATLON_BYTE_2_SHIFT) |
- (pucRxBuffer_[4] << LATLON_BYTE_3_SHIFT) |
- (pucRxBuffer_[5] << LATLON_BYTE_4_SHIFT));
- break;
-
- case DATA_ID_LONGITUDE:
- bLongitudeEnabled = TRUE;
- slLongitude_SC = (long)((pucRxBuffer_[2]) |
- (pucRxBuffer_[3] << LATLON_BYTE_2_SHIFT) |
- (pucRxBuffer_[4] << LATLON_BYTE_3_SHIFT) |
- (pucRxBuffer_[5] << LATLON_BYTE_4_SHIFT));
- break;
- case DATA_ID_HINT :
- bHintEnabled = TRUE;
- if (ucHintStartPage == 0) ucHintStartPage = ucPageNum;
- ucHintOffset = (ucPageNum - ucHintStartPage) * HINT_CHARS_PER_PAGE;;
- cHint[ucHintOffset + 0] = pucRxBuffer_[2];
- cHint[ucHintOffset + 1] = pucRxBuffer_[3];
- cHint[ucHintOffset + 2] = pucRxBuffer_[4];
- cHint[ucHintOffset + 3] = pucRxBuffer_[5];
- cHint[ucHintOffset + 4] = pucRxBuffer_[6];
- cHint[ucHintOffset + 5] = pucRxBuffer_[7];
- break;
- case DATA_ID_LOGGED_VISITS :
- bLoggedVisitsEnabled = TRUE;
- ucLoggedVisitPage = ucPageNum;
- ulLastVisitTimestamp = (pucRxBuffer_[2]) +
- (pucRxBuffer_[3] << 8) +
- (pucRxBuffer_[4] << 16) +
- (pucRxBuffer_[5] << 24);
- usNumVisits = (pucRxBuffer_[6]) + (pucRxBuffer_[7] << 8);
- break;
- default :
- break;
- }
- break;
- }
- }
-
- void GetPageData(UCHAR ucPageNum_, UCHAR* pucTxBuffer_)
- {
- switch (ucPageNum_)
- {
- case PAGE_0 :
- pucTxBuffer_[0] = ucPageNum_;
- pucTxBuffer_[1] = ((cID[0] << 2) & 0xFC) | ((cID[1] >> 4) & 0x03);
- pucTxBuffer_[2] = ((cID[1] << 4) & 0xF0) | ((cID[2] >> 2) & 0x0F);
- pucTxBuffer_[3] = ((cID[2] << 6) & 0xC0) | ((cID[3] >> 0) & 0x3F);
- pucTxBuffer_[4] = ((cID[4] << 2) & 0xFC) | ((cID[5] >> 4) & 0x03);
- pucTxBuffer_[5] = ((cID[5] << 4) & 0xF0) | ((cID[6] >> 2) & 0x0F);
- pucTxBuffer_[6] = ((cID[6] << 6) & 0xC0) | ((cID[7] >> 0) & 0x3F);
- pucTxBuffer_[7] = ((cID[8] << 2) & 0xFC);
- break;
- case PAGE_1 :
- pucTxBuffer_[0] = ucPageNum_;
- pucTxBuffer_[1] = RESERVED;
- pucTxBuffer_[2] = ulPIN & 0xFF;
- pucTxBuffer_[3] = (ulPIN >> 8) & 0xFF;
- pucTxBuffer_[4] = (ulPIN >> 16) & 0xFF;
- pucTxBuffer_[5] = (ulPIN >> 24) & 0xFF;
- pucTxBuffer_[6] = ucTotalPages;
- pucTxBuffer_[7] = 0xFF;
- break;
- case PAGE_32 :
- pucTxBuffer_[0] = ucPageNum_;
- pucTxBuffer_[1] = ucAuthToken[0];
- pucTxBuffer_[2] = ucAuthToken[1];
- pucTxBuffer_[3] = ucAuthToken[2];
- pucTxBuffer_[4] = ucAuthToken[3];
- pucTxBuffer_[5] = ucAuthToken[4];
- pucTxBuffer_[6] = ucAuthToken[5];
- pucTxBuffer_[7] = ucAuthToken[6];
- break;
- default :
- pucTxBuffer_[0] = ucPageNum_;
- pucTxBuffer_[1] = ucProgPages[ucPageNum_,1];
- pucTxBuffer_[2] = ucProgPages[ucPageNum_,2];
- pucTxBuffer_[3] = ucProgPages[ucPageNum_,3];
- pucTxBuffer_[4] = ucProgPages[ucPageNum_,4];
- pucTxBuffer_[5] = ucProgPages[ucPageNum_,5];
- pucTxBuffer_[6] = ucProgPages[ucPageNum_,6];
- pucTxBuffer_[7] = ucProgPages[ucPageNum_,7];
- break;
- }
- }
- void GenerateAuthRequestPage(UCHAR* pucTxBuffer_)
- {
- ulSerialNum = 0x33221100;
- usNonce = rand();
- pucTxBuffer_[0] = PAGE_32;
- pucTxBuffer_[1] = RESERVED;
- pucTxBuffer_[2] = usNonce & 0xFF;
- pucTxBuffer_[3] = (usNonce >> 8) & 0xFF;
- pucTxBuffer_[4] = ulSerialNum & 0xFF;
- pucTxBuffer_[5] = (ulSerialNum >> 8) & 0xFF;
- pucTxBuffer_[6] = (ulSerialNum >> 16) & 0xFF;
- pucTxBuffer_[7] = (ulSerialNum >> 24) & 0xFF;
- }
- void GenerateProgPages(void)
- {
- UCHAR ucHintOffset;
- UCHAR ucPageCount = START_PROG_PAGES;
- if (bLatitudeEnabled)
- {
- ucProgPages[ucPageCount,0] = ucPageCount;
- ucProgPages[ucPageCount,1] = DATA_ID_LATITUDE;
- ucProgPages[ucPageCount,2] = slLatitude_SC & BYTE_MASK;
- ucProgPages[ucPageCount,3] = (slLatitude_SC >> LATLON_BYTE_2_SHIFT) & BYTE_MASK;
- ucProgPages[ucPageCount,4] = (slLatitude_SC >> LATLON_BYTE_3_SHIFT) & BYTE_MASK;
- ucProgPages[ucPageCount,5] = (slLatitude_SC >> LATLON_BYTE_4_SHIFT) & BYTE_MASK;
- ucPageCount++;
- }
- if (bLongitudeEnabled)
- {
- ucProgPages[ucPageCount,0] = ucPageCount;
- ucProgPages[ucPageCount,1] = DATA_ID_LONGITUDE;
- ucProgPages[ucPageCount,2] = slLongitude_SC & BYTE_MASK;
- ucProgPages[ucPageCount,3] = (slLongitude_SC >> LATLON_BYTE_2_SHIFT) & BYTE_MASK;
- ucProgPages[ucPageCount,4] = (slLongitude_SC >> LATLON_BYTE_3_SHIFT) & BYTE_MASK;
- ucProgPages[ucPageCount,5] = (slLongitude_SC >> LATLON_BYTE_4_SHIFT) & BYTE_MASK;
- ucPageCount++;
- }
- if (bLoggedVisitsEnabled)
- {
- ucProgPages[ucPageCount,0] = ucPageCount;
- ucProgPages[ucPageCount,1] = DATA_ID_LOGGED_VISITS;
- ucProgPages[ucPageCount,2] = ulLastVisitTimestamp & 0xFF;
- ucProgPages[ucPageCount,3] = (ulLastVisitTimestamp >> 8) & 0xFF;
- ucProgPages[ucPageCount,4] = (ulLastVisitTimestamp >> 16) & 0xFF;
- ucProgPages[ucPageCount,5] = (ulLastVisitTimestamp >> 24) & 0xFF;
- ucProgPages[ucPageCount,6] = usNumVisits & 0xFF;
- ucProgPages[ucPageCount,7] = (usNumVisits >> 8) & 0xFF;
- ucPageCount++;
- }
- if (bHintEnabled)
- {
- ucHintStartPage = ucPageCount;
- for (UCHAR ucHintPage=ucHintStartPage; ucHintPage<(ucHintStartPage+ucNumHintPages); ucHintPage++)
- {
- ucHintOffset = (ucHintPage - ucHintStartPage) * HINT_CHARS_PER_PAGE;;
- ucProgPages[ucHintPage,0] = ucHintPage;
- ucProgPages[ucHintPage,1] = DATA_ID_HINT;
- ucProgPages[ucHintPage,2] = cHint[ucHintOffset + 0];
- ucProgPages[ucHintPage,3] = cHint[ucHintOffset + 1];
- ucProgPages[ucHintPage,4] = cHint[ucHintOffset + 2];
- ucProgPages[ucHintPage,5] = cHint[ucHintOffset + 3];
- ucProgPages[ucHintPage,6] = cHint[ucHintOffset + 4];
- ucProgPages[ucHintPage,7] = cHint[ucHintOffset + 5];
- ucPageCount++;
- }
- }
- ucTotalPages = ucPageCount;
-
- for (; ucPageCount<32; ucPageCount++)
- {
- ucProgPages[ucPageCount,0] = ucPageCount;
- ucProgPages[ucPageCount,1] = RESERVED;
- ucProgPages[ucPageCount,2] = RESERVED;
- ucProgPages[ucPageCount,3] = RESERVED;
- ucProgPages[ucPageCount,4] = RESERVED;
- ucProgPages[ucPageCount,5] = RESERVED;
- ucProgPages[ucPageCount,6] = RESERVED;
- ucProgPages[ucPageCount,7] = RESERVED;
- }
- }
- void UpdateLoggedVisitPage(void)
- {
- if (bLoggedVisitsEnabled)
- {
- ucProgPages[ucLoggedVisitPage,0] = ucLoggedVisitPage;
- ucProgPages[ucLoggedVisitPage,1] = DATA_ID_LOGGED_VISITS;
- ucProgPages[ucLoggedVisitPage,1] = DATA_ID_LOGGED_VISITS;
- ucProgPages[ucLoggedVisitPage,2] = ulLastVisitTimestamp & 0xFF;
- ucProgPages[ucLoggedVisitPage,3] = (ulLastVisitTimestamp >> 8) & 0xFF;
- ucProgPages[ucLoggedVisitPage,4] = (ulLastVisitTimestamp >> 16) & 0xFF;
- ucProgPages[ucLoggedVisitPage,5] = (ulLastVisitTimestamp >> 24) & 0xFF;
- ucProgPages[ucLoggedVisitPage,6] = usNumVisits & 0xFF;
- ucProgPages[ucLoggedVisitPage,7] = (usNumVisits >> 8) & 0xFF;
- }
- }
- void EnabledProgPages(void)
- {
- UCHAR ucDataID;
- UCHAR ucPageCount;
- bLatitudeEnabled = FALSE;
- bLongitudeEnabled = FALSE;
- bHintEnabled = FALSE;
- bLoggedVisitsEnabled = FALSE;
- for(ucPageCount=START_PROG_PAGES; ucPageCount<=ucTotalPages; ucPageCount++)
- {
- ucDataID = ucProgPages[ucPageCount,1];
- switch (ucDataID)
- {
- case DATA_ID_LATITUDE:
- bLatitudeEnabled = TRUE;
- break;
-
- case DATA_ID_LONGITUDE:
- bLongitudeEnabled = TRUE;
- break;
- case DATA_ID_HINT :
- bHintEnabled = TRUE;
- break;
- case DATA_ID_LOGGED_VISITS :
- bLoggedVisitsEnabled = TRUE;
- break;
- default :
- break;
- }
- }
- }
- void InitSensor(void)
- {
-
- for (UCHAR i=0; i<ID_LEN; i++) cID[i] = DEFAULT_ID;
-
- ulPIN = DEFAULT_PIN;
-
- for (UCHAR ucPageCount=0; ucPageCount<32; ucPageCount++)
- {
- ucProgPages[ucPageCount,0] = ucPageCount;
- ucProgPages[ucPageCount,1] = RESERVED;
- ucProgPages[ucPageCount,2] = RESERVED;
- ucProgPages[ucPageCount,3] = RESERVED;
- ucProgPages[ucPageCount,4] = RESERVED;
- ucProgPages[ucPageCount,5] = RESERVED;
- ucProgPages[ucPageCount,6] = RESERVED;
- ucProgPages[ucPageCount,7] = RESERVED;
- }
- }
- void InitDisplay(void)
- {
-
- for (UCHAR i=0; i<=82; i++) bPageRead[i] = FALSE;
-
- for (UCHAR i=0; i<32; i++) bPageProg[i] = FALSE;
-
- for (UCHAR i=0; i<ID_LEN; i++) cID[i] = DEFAULT_ID;
-
- ulPIN = DEFAULT_PIN;
- ucTotalPages = DEFAULT_TOT_PAGES;
- bLatitudeEnabled = FALSE;
- slLatitude_SC = 0xFFFFFFFF;
- bLongitudeEnabled = FALSE;
- slLongitude_SC = 0xFFFFFFFF;
- bHintEnabled = FALSE;
- bLoggedVisitsEnabled = FALSE;
- ulLastVisitTimestamp = 0xFFFFFFFF;
- usNumVisits = 0xFFFF;
-
- for (UCHAR ucPageCount=0; ucPageCount<32; ucPageCount++)
- {
- ucProgPages[ucPageCount,0] = ucPageCount;
- ucProgPages[ucPageCount,1] = RESERVED;
- ucProgPages[ucPageCount,2] = RESERVED;
- ucProgPages[ucPageCount,3] = RESERVED;
- ucProgPages[ucPageCount,4] = RESERVED;
- ucProgPages[ucPageCount,5] = RESERVED;
- ucProgPages[ucPageCount,6] = RESERVED;
- ucProgPages[ucPageCount,7] = RESERVED;
- }
- }
- };
|