mirror of
https://github.com/lwvmobile/dsd-fme.git
synced 2026-11-13 09:17:20 -05:00
279 lines
8.2 KiB
C
279 lines
8.2 KiB
C
/*
|
|
* Copyright (C) 2010 DSD Author
|
|
* GPG Key ID: 0x3F1D7FD0 (74EF 430D F7F2 0A48 FCE6 F630 FAA2 635D 3F1D 7FD0)
|
|
*
|
|
* Permission to use, copy, modify, and/or distribute this software for any
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
* copyright notice and this permission notice appear in all copies.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
|
|
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
* AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
|
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|
|
|
|
#include "dsd.h"
|
|
|
|
|
|
/* Convert the Channel code (24 bit) into a valid
|
|
* dPMR color code [0..63]
|
|
* Return -1 on error */
|
|
int32_t GetdPmrColorCode(uint8_t ChannelCodeBit[24])
|
|
{
|
|
uint32_t ChannelCodeByte;
|
|
int32_t ColorCode;
|
|
uint32_t i;
|
|
|
|
/* Reconstitute the 24 bit channel code into a 3 bytes integer */
|
|
ChannelCodeByte = 0;
|
|
for(i = 0; i < 24; i++)
|
|
{
|
|
ChannelCodeByte <<= 1;
|
|
ChannelCodeByte |= (ChannelCodeBit[i] & 1);
|
|
}
|
|
|
|
/* By analyzing all channel code on the
|
|
* dPMR standard, I observe that if we decompose the
|
|
* 24 bit into 12 dibit, all dibit's LSB are always
|
|
* equal to "1", so apply a mask to correct
|
|
* flipped LSB dibit.
|
|
*
|
|
* For more details see ETSI TS 102 658 chapter
|
|
* 6.1.5.2.2 "Channel Code Determined by Frequency
|
|
* and System Identity Code".
|
|
*
|
|
* Apply the mask 0x555555
|
|
* 0x555555 = 0b010101010101010101010101 => All dibit's LSB
|
|
* are equal to "1".
|
|
*/
|
|
ChannelCodeByte |= 0x555555;
|
|
|
|
|
|
/* Switch to the right color code */
|
|
switch(ChannelCodeByte & 0xFF0000)
|
|
{
|
|
case 0x570000:
|
|
{
|
|
switch(ChannelCodeByte)
|
|
{
|
|
case 0x575F77: {ColorCode = 0; break;}
|
|
case 0x577577: {ColorCode = 1; break;}
|
|
case 0x57DD75: {ColorCode = 2; break;}
|
|
case 0x57F775: {ColorCode = 3; break;}
|
|
default: {ColorCode = -1; break;}
|
|
} /* End switch(ChannelCodeByte) */
|
|
break;
|
|
} /* End case 0x570000 */
|
|
|
|
case 0x550000:
|
|
{
|
|
switch(ChannelCodeByte)
|
|
{
|
|
case 0x55577D: {ColorCode = 4; break;}
|
|
case 0x557D7D: {ColorCode = 5; break;}
|
|
case 0x55D57F: {ColorCode = 6; break;}
|
|
case 0x55FF7F: {ColorCode = 7; break;}
|
|
default: {ColorCode = -1; break;}
|
|
} /* End switch(ChannelCodeByte) */
|
|
break;
|
|
} /* End case 0x550000 */
|
|
|
|
case 0x5F0000:
|
|
{
|
|
switch(ChannelCodeByte)
|
|
{
|
|
case 0x5F555F: {ColorCode = 8; break;}
|
|
case 0x5F7F5F: {ColorCode = 9; break;}
|
|
case 0x5FD75D: {ColorCode = 10; break;}
|
|
case 0x5FFD5D: {ColorCode = 11; break;}
|
|
default: {ColorCode = -1; break;}
|
|
} /* End switch(ChannelCodeByte) */
|
|
break;
|
|
} /* End case 0x5F0000 */
|
|
|
|
case 0x5D0000:
|
|
{
|
|
switch(ChannelCodeByte)
|
|
{
|
|
case 0x5D5D55: {ColorCode = 12; break;}
|
|
case 0x5D7755: {ColorCode = 13; break;}
|
|
case 0x5DDF57: {ColorCode = 14; break;}
|
|
case 0x5DF557: {ColorCode = 15; break;}
|
|
default: {ColorCode = -1; break;}
|
|
} /* End switch(ChannelCodeByte) */
|
|
break;
|
|
} /* End case 0x5D0000 */
|
|
|
|
case 0x770000:
|
|
{
|
|
switch(ChannelCodeByte)
|
|
{
|
|
case 0x775DD7: {ColorCode = 16; break;}
|
|
case 0x7777D7: {ColorCode = 17; break;}
|
|
case 0x77DFD5: {ColorCode = 18; break;}
|
|
case 0x77F5D5: {ColorCode = 19; break;}
|
|
default: {ColorCode = -1; break;}
|
|
} /* End switch(ChannelCodeByte) */
|
|
break;
|
|
} /* End case 0x770000 */
|
|
|
|
case 0x750000:
|
|
{
|
|
switch(ChannelCodeByte)
|
|
{
|
|
case 0x7555DD: {ColorCode = 20; break;}
|
|
case 0x757FDD: {ColorCode = 21; break;}
|
|
case 0x75D7DF: {ColorCode = 22; break;}
|
|
case 0x75FDDF: {ColorCode = 23; break;}
|
|
default: {ColorCode = -1; break;}
|
|
} /* End switch(ChannelCodeByte) */
|
|
break;
|
|
} /* End case 0x750000 */
|
|
|
|
case 0x7F0000:
|
|
{
|
|
switch(ChannelCodeByte)
|
|
{
|
|
case 0x7F57FF: {ColorCode = 24; break;}
|
|
case 0x7F7DFF: {ColorCode = 25; break;}
|
|
case 0x7FD5FD: {ColorCode = 26; break;}
|
|
case 0x7FFFFD: {ColorCode = 27; break;}
|
|
default: {ColorCode = -1; break;}
|
|
} /* End switch(ChannelCodeByte) */
|
|
break;
|
|
} /* End case 0x7F0000 */
|
|
|
|
case 0x7D0000:
|
|
{
|
|
switch(ChannelCodeByte)
|
|
{
|
|
case 0x7D5FF5: {ColorCode = 28; break;}
|
|
case 0x7D75F5: {ColorCode = 29; break;}
|
|
case 0x7DDDF7: {ColorCode = 30; break;}
|
|
case 0x7DF7F7: {ColorCode = 31; break;}
|
|
default: {ColorCode = -1; break;}
|
|
} /* End switch(ChannelCodeByte) */
|
|
break;
|
|
} /* End case 0x7D0000 */
|
|
|
|
case 0xD70000:
|
|
{
|
|
switch(ChannelCodeByte)
|
|
{
|
|
case 0xD755F7: {ColorCode = 32; break;}
|
|
case 0xD77FF7: {ColorCode = 33; break;}
|
|
case 0xD7D7F5: {ColorCode = 34; break;}
|
|
case 0xD7FDF5: {ColorCode = 35; break;}
|
|
default: {ColorCode = -1; break;}
|
|
} /* End switch(ChannelCodeByte) */
|
|
break;
|
|
} /* End case 0xD70000 */
|
|
|
|
case 0xD50000:
|
|
{
|
|
switch(ChannelCodeByte)
|
|
{
|
|
case 0xD55DFD: {ColorCode = 36; break;}
|
|
case 0xD577FD: {ColorCode = 37; break;}
|
|
case 0xD5DFFF: {ColorCode = 38; break;}
|
|
case 0xD5F5FF: {ColorCode = 39; break;}
|
|
default: {ColorCode = -1; break;}
|
|
} /* End switch(ChannelCodeByte) */
|
|
break;
|
|
} /* End case 0xD50000 */
|
|
|
|
case 0xDF0000:
|
|
{
|
|
switch(ChannelCodeByte)
|
|
{
|
|
case 0xDF5FDF: {ColorCode = 40; break;}
|
|
case 0xDF75DF: {ColorCode = 41; break;}
|
|
case 0xDFDDDD: {ColorCode = 42; break;}
|
|
case 0xDFF7DD: {ColorCode = 43; break;}
|
|
default: {ColorCode = -1; break;}
|
|
} /* End switch(ChannelCodeByte) */
|
|
break;
|
|
} /* End case 0xDF0000 */
|
|
|
|
case 0xDD0000:
|
|
{
|
|
switch(ChannelCodeByte)
|
|
{
|
|
case 0xDD57D5: {ColorCode = 44; break;}
|
|
case 0xDD7DD5: {ColorCode = 45; break;}
|
|
case 0xDDD5D7: {ColorCode = 46; break;}
|
|
case 0xDDFFD7: {ColorCode = 47; break;}
|
|
default: {ColorCode = -1; break;}
|
|
} /* End switch(ChannelCodeByte) */
|
|
break;
|
|
} /* End case 0xDD0000 */
|
|
|
|
case 0xF70000:
|
|
{
|
|
switch(ChannelCodeByte)
|
|
{
|
|
case 0xF75757: {ColorCode = 48; break;}
|
|
case 0xF77D57: {ColorCode = 49; break;}
|
|
case 0xF7D555: {ColorCode = 50; break;}
|
|
case 0xF7FF55: {ColorCode = 51; break;}
|
|
default: {ColorCode = -1; break;}
|
|
} /* End switch(ChannelCodeByte) */
|
|
break;
|
|
} /* End case 0xF70000 */
|
|
|
|
case 0xF50000:
|
|
{
|
|
switch(ChannelCodeByte)
|
|
{
|
|
case 0xF55F5D: {ColorCode = 52; break;}
|
|
case 0xF5755D: {ColorCode = 53; break;}
|
|
case 0xF5DD5F: {ColorCode = 54; break;}
|
|
case 0xF5F75F: {ColorCode = 55; break;}
|
|
default: {ColorCode = -1; break;}
|
|
} /* End switch(ChannelCodeByte) */
|
|
break;
|
|
} /* End case 0xF50000 */
|
|
|
|
case 0xFF0000:
|
|
{
|
|
switch(ChannelCodeByte)
|
|
{
|
|
case 0xFF5D7F: {ColorCode = 56; break;}
|
|
case 0xFF777F: {ColorCode = 57; break;}
|
|
case 0xFFDF7D: {ColorCode = 58; break;}
|
|
case 0xFFF57D: {ColorCode = 59; break;}
|
|
default: {ColorCode = -1; break;}
|
|
} /* End switch(ChannelCodeByte) */
|
|
break;
|
|
} /* End case 0xFF0000 */
|
|
|
|
case 0xFD0000:
|
|
{
|
|
switch(ChannelCodeByte)
|
|
{
|
|
case 0xFD5575: {ColorCode = 60; break;}
|
|
case 0xFD7F75: {ColorCode = 61; break;}
|
|
case 0xFDD777: {ColorCode = 62; break;}
|
|
case 0xFDFD77: {ColorCode = 63; break;}
|
|
default: {ColorCode = -1; break;}
|
|
} /* End switch(ChannelCodeByte) */
|
|
break;
|
|
} /* End case 0xFD0000 */
|
|
|
|
default:
|
|
{
|
|
ColorCode = -1;
|
|
break;
|
|
}
|
|
} /* End switch(ChannelCodeByte & 0xFF0000) */
|
|
|
|
/* Return the colour code */
|
|
return ColorCode;
|
|
}
|
|
|
|
|
|
/* End of file */
|