aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2019-03-09 09:51:09 +0100
committerAndreas Eversberg <jolly@eversberg.eu>2019-03-09 09:51:09 +0100
commite4fcc080df85127542a6594535a44a30f2f66bf5 (patch)
treed647162635fb1f6b176fa23124d37814264eede5
parent1321f664565716679a2e73a5cd191c03029f7690 (diff)
NMT: Fixed traffic area (Y1Y2) digit conversion
-rw-r--r--src/nmt/countries.c4
-rw-r--r--src/nmt/frame.c25
-rw-r--r--src/nmt/frame.h1
-rw-r--r--src/nmt/main.c15
-rw-r--r--src/nmt/nmt.c2
5 files changed, 27 insertions, 20 deletions
diff --git a/src/nmt/countries.c b/src/nmt/countries.c
index 8812319..29d00e4 100644
--- a/src/nmt/countries.c
+++ b/src/nmt/countries.c
@@ -147,7 +147,7 @@ static struct nmt_country {
{ 900, 1, 2, 1,9, "SE", "Sweden", "Telia Mobitel", frq_900_scandinavia },
{ 900, 1, 3, 1,9, "NO", "Norway", "Telenor Mobil", frq_900_scandinavia },
{ 900, 1, 4, 1,9, "FI", "Finland", "Telecom Finland", frq_900_scandinavia },
- { 900, 1,10, 1,9, "F0", "France (Group 0)", "France Telecom", frq_900_f },
+ { 900, 1, 0, 1,9, "F0", "France (Group 0)", "France Telecom", frq_900_f },
{ 900, 1, 1, 1,9, "F1", "France (Group 1)", "France Telecom", frq_900_f },
{ 900, 1, 2, 1,9, "F2", "France (Group 2)", "France Telecom", frq_900_f },
{ 900, 1, 3, 1,9, "F3", "France (Group 3)", "France Telecom", frq_900_f },
@@ -174,7 +174,7 @@ void nmt_country_list(int nmt_system)
int ch_from = 0, ch_to = 0;
char ch_string[256];
- printf("TA from\tTA to\tYY Code\tChannels\t\t\tShort\tCountry (Provider)\n");
+ printf("TA from\tTA to\tYY Code\tChannels\t\t\tCountry (Provider)\n");
printf("--------------------------------------------------------------------------------------------------------\n");
for (i = 0; nmt_country[i].short_name; i++) {
if (nmt_system != nmt_country[i].system)
diff --git a/src/nmt/frame.c b/src/nmt/frame.c
index 5e3f6f4..ad03ae3 100644
--- a/src/nmt/frame.c
+++ b/src/nmt/frame.c
@@ -147,7 +147,7 @@ void nmt_value2digits(uint64_t value, char *digits, int num)
if (digit == 10)
digits[i] = '0';
else if (digit == 0)
- digits[i] = 'N';
+ digits[i] = 'a';
else if (digit > 10)
digits[i] = digit - 10 + 'a';
else
@@ -167,9 +167,9 @@ uint64_t nmt_digits2value(const char *digits, int num)
value |= digit - '0';
else if (digit == '0')
value |= 10;
- else if (digit >= 'a' && digit <= 'f')
+ else if (digit >= 'b' && digit <= 'f')
value |= digit - 'a' + 10;
- else if (digit >= 'A' && digit <= 'F')
+ else if (digit >= 'B' && digit <= 'F')
value |= digit - 'A' + 10;
else
value |= 0;
@@ -178,6 +178,14 @@ uint64_t nmt_digits2value(const char *digits, int num)
return value;
}
+uint8_t nmt_flip_ten(uint8_t v)
+{
+ if (!(v % 10))
+ v ^= 10;
+
+ return v;
+}
+
char nmt_value2digit(uint64_t value)
{
return "D1234567890*#ABC"[value & 0x0000f];
@@ -481,18 +489,13 @@ static const char *param_ta_450(uint64_t value, int ndigits, enum nmt_direction
return result;
}
-static const char *param_ta_900(uint64_t value, int ndigits, enum nmt_direction __attribute__((unused)) direction)
+static const char *param_ta_900(uint64_t value, int __attribute__((unused)) ndigits, enum nmt_direction __attribute__((unused)) direction)
{
static char result[64];
- if ((value & 0x80)) {
- nmt_value2digits(value & 0x7f, result, ndigits);
- result[ndigits] = '\0';
+ sprintf(result, "%02" PRIx64, value & 0x7f);
+ if ((value & 0x80))
strcat(result, " (Channel No. + 1024)");
- } else {
- nmt_value2digits(value, result, ndigits);
- result[ndigits] = '\0';
- }
return result;
}
diff --git a/src/nmt/frame.h b/src/nmt/frame.h
index 0743dd3..61af530 100644
--- a/src/nmt/frame.h
+++ b/src/nmt/frame.h
@@ -90,6 +90,7 @@ uint64_t nmt_encode_traffic_area(int nmt_system, int channel, uint8_t traffic_ar
void nmt_value2digits(uint64_t value, char *digits, int num);
uint64_t nmt_digits2value(const char *digits, int num);
char nmt_value2digit(uint64_t value);
+uint8_t nmt_flip_ten(uint8_t v);
uint16_t nmt_encode_area_no(uint8_t area_no);
int nmt_encode_a_number(frame_t *frame, int index, enum number_type type, const char *number, int nmt_system, int channel, int power, uint8_t traffic_area);
diff --git a/src/nmt/main.c b/src/nmt/main.c
index 68ef122..7478c64 100644
--- a/src/nmt/main.c
+++ b/src/nmt/main.c
@@ -48,7 +48,8 @@ int num_chan_type = 0;
enum nmt_chan_type chan_type[MAX_SENDER] = { CHAN_TYPE_CC_TC };
int ms_power = 1; /* 0..3 */
char country[16] = "";
-char traffic_area[3] = "";
+uint8_t traffic_area;
+int traffic_area_given = 0;
char area_no = 0;
int compandor = 1;
int num_supervisory = 0;
@@ -172,14 +173,16 @@ error_ta:
fprintf(stderr, "Invalid traffic area '%s', use '-Y list' for a list of valid areas\n", argv[argi]);
return -EINVAL;
}
- traffic_area[0] = rc + '0';
+ traffic_area = rc << 4;
if (p[strlen(p) - 1] != '!') {
rc = nmt_ta_by_short_name(nmt_system, country, atoi(p));
if (rc < 0)
goto error_ta;
}
- nmt_value2digits(atoi(p), traffic_area + 1, 1);
- traffic_area[2] = '\0';
+ if (atoi(p) < 0 || atoi(p) > 15)
+ goto error_ta;
+ traffic_area |= (nmt_system == 450) ? nmt_flip_ten(atoi(p)) : atoi(p);
+ traffic_area_given = 1;
break;
case 'A':
area_no = argv[argi][0] - '0';
@@ -354,7 +357,7 @@ int main(int argc, char *argv[])
}
}
- if (!traffic_area[0]) {
+ if (!traffic_area_given) {
printf("No traffic area is specified, I suggest to use Sweden (-Y SE,1) and set the phone's roaming to 'SE' also.\n\n");
mandatory = 1;
}
@@ -398,7 +401,7 @@ int main(int argc, char *argv[])
/* create transceiver instance */
for (i = 0; i < num_kanal; i++) {
- rc = nmt_create(nmt_system, country, kanal[i], chan_type[i], audiodev[i], use_sdr, samplerate, rx_gain, do_pre_emphasis, do_de_emphasis, write_rx_wave, write_tx_wave, read_rx_wave, read_tx_wave, ms_power, nmt_digits2value(traffic_area, 2), area_no, compandor, supervisory[i], smsc_number, send_callerid, loopback);
+ rc = nmt_create(nmt_system, country, kanal[i], chan_type[i], audiodev[i], use_sdr, samplerate, rx_gain, do_pre_emphasis, do_de_emphasis, write_rx_wave, write_tx_wave, read_rx_wave, read_tx_wave, ms_power, traffic_area, area_no, compandor, supervisory[i], smsc_number, send_callerid, loopback);
if (rc < 0) {
fprintf(stderr, "Failed to create transceiver instance. Quitting!\n");
goto fail;
diff --git a/src/nmt/nmt.c b/src/nmt/nmt.c
index 81e8fd2..944b3a6 100644
--- a/src/nmt/nmt.c
+++ b/src/nmt/nmt.c
@@ -347,7 +347,7 @@ int nmt_create(int nmt_system, const char *country, int channel, enum nmt_chan_t
PDEBUG(DNMT, DEBUG_NOTICE, "Created channel #%d of type '%s' = %s\n", channel, chan_type_short_name(nmt_system, chan_type), chan_type_long_name(nmt_system, chan_type));
if (nmt_long_name_by_short_name(nmt_system, country))
PDEBUG(DNMT, DEBUG_NOTICE, " -> Using country '%s'\n", nmt_long_name_by_short_name(nmt_system, country));
- PDEBUG(DNMT, DEBUG_NOTICE, " -> Using traffic area %d,%d and area no %d\n", traffic_area >> 4, traffic_area & 0xf, area_no);
+ PDEBUG(DNMT, DEBUG_NOTICE, " -> Using traffic area %d,%d and area no %d\n", traffic_area >> 4, (nmt_system == 450) ? nmt_flip_ten((traffic_area & 0xf)) : (traffic_area & 0xf), area_no);
if (nmt->supervisory)
PDEBUG(DNMT, DEBUG_NOTICE, " -> Using supervisory signal %d\n", supervisory);
else