POCSAG: Allow all 128 ASCII characters to be transmitted using pointed brackets
This commit is contained in:
parent
a6bf66ee83
commit
1f55ad659b
|
@ -3,10 +3,12 @@
|
||||||
"active_layer": 0,
|
"active_layer": 0,
|
||||||
"active_layer_preset": "All Layers",
|
"active_layer_preset": "All Layers",
|
||||||
"auto_track_width": false,
|
"auto_track_width": false,
|
||||||
|
"hidden_netclasses": [],
|
||||||
"hidden_nets": [],
|
"hidden_nets": [],
|
||||||
"high_contrast_mode": 0,
|
"high_contrast_mode": 0,
|
||||||
"net_color_mode": 1,
|
"net_color_mode": 1,
|
||||||
"opacity": {
|
"opacity": {
|
||||||
|
"images": 0.6,
|
||||||
"pads": 1.0,
|
"pads": 1.0,
|
||||||
"tracks": 1.0,
|
"tracks": 1.0,
|
||||||
"vias": 1.0,
|
"vias": 1.0,
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
{
|
{
|
||||||
"board": {
|
"board": {
|
||||||
|
"3dviewports": [],
|
||||||
"design_settings": {
|
"design_settings": {
|
||||||
"defaults": {
|
"defaults": {
|
||||||
"board_outline_line_width": 0.049999999999999996,
|
"board_outline_line_width": 0.049999999999999996,
|
||||||
|
@ -137,7 +138,8 @@
|
||||||
"zones_allow_external_fillets": false,
|
"zones_allow_external_fillets": false,
|
||||||
"zones_use_no_outline": true
|
"zones_use_no_outline": true
|
||||||
},
|
},
|
||||||
"layer_presets": []
|
"layer_presets": [],
|
||||||
|
"viewports": []
|
||||||
},
|
},
|
||||||
"boards": [],
|
"boards": [],
|
||||||
"cvpcb": {
|
"cvpcb": {
|
||||||
|
@ -359,7 +361,7 @@
|
||||||
"net_settings": {
|
"net_settings": {
|
||||||
"classes": [
|
"classes": [
|
||||||
{
|
{
|
||||||
"bus_width": 12.0,
|
"bus_width": 12,
|
||||||
"clearance": 0.2,
|
"clearance": 0.2,
|
||||||
"diff_pair_gap": 0.25,
|
"diff_pair_gap": 0.25,
|
||||||
"diff_pair_via_gap": 0.25,
|
"diff_pair_via_gap": 0.25,
|
||||||
|
@ -373,13 +375,15 @@
|
||||||
"track_width": 0.25,
|
"track_width": 0.25,
|
||||||
"via_diameter": 0.8,
|
"via_diameter": 0.8,
|
||||||
"via_drill": 0.4,
|
"via_drill": 0.4,
|
||||||
"wire_width": 6.0
|
"wire_width": 6
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"meta": {
|
"meta": {
|
||||||
"version": 2
|
"version": 3
|
||||||
},
|
},
|
||||||
"net_colors": null
|
"net_colors": null,
|
||||||
|
"netclass_assignments": null,
|
||||||
|
"netclass_patterns": []
|
||||||
},
|
},
|
||||||
"pcbnew": {
|
"pcbnew": {
|
||||||
"last_paths": {
|
"last_paths": {
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
static const char numeric[16] = "0123456789RU -][";
|
static const char numeric[16] = "0123456789RU -][";
|
||||||
static const char hex[16] = "0123456789abcdef";
|
static const char hex[16] = "0123456789abcdef";
|
||||||
|
|
||||||
static const char *ctrl_char[33] = {
|
static const char *ctrl_char[32] = {
|
||||||
"<NUL>",
|
"<NUL>",
|
||||||
"<SOH>",
|
"<SOH>",
|
||||||
"<STX>",
|
"<STX>",
|
||||||
|
@ -71,9 +71,10 @@ static const char *ctrl_char[33] = {
|
||||||
"<GS>",
|
"<GS>",
|
||||||
"<RS>",
|
"<RS>",
|
||||||
"<US>",
|
"<US>",
|
||||||
"<DEL>",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const char *del_char = "<DEL>";
|
||||||
|
|
||||||
const char *print_message(const char *message, int message_length)
|
const char *print_message(const char *message, int message_length)
|
||||||
{
|
{
|
||||||
static char message_print[1024];
|
static char message_print[1024];
|
||||||
|
@ -85,7 +86,7 @@ const char *print_message(const char *message, int message_length)
|
||||||
if (message[i] >= 0 && message[i] <= 31)
|
if (message[i] >= 0 && message[i] <= 31)
|
||||||
c = ctrl_char[(int)message[i]];
|
c = ctrl_char[(int)message[i]];
|
||||||
else if (message[i] == 127)
|
else if (message[i] == 127)
|
||||||
c = ctrl_char[(int)message[32]];
|
c = del_char;
|
||||||
else {
|
else {
|
||||||
message_print[ii++] = message[i];
|
message_print[ii++] = message[i];
|
||||||
continue;
|
continue;
|
||||||
|
@ -101,6 +102,50 @@ const char *print_message(const char *message, int message_length)
|
||||||
return message_print;
|
return message_print;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int scan_message(const char *message_input, int message_input_length, char *message_output, int message_output_length)
|
||||||
|
{
|
||||||
|
int i, ii, j, clen;
|
||||||
|
|
||||||
|
/* i is input counter, ii is output counter */
|
||||||
|
for (i = 0, ii = 0; i < message_input_length; ii++) {
|
||||||
|
if (ii == message_output_length)
|
||||||
|
break;
|
||||||
|
if (message_input[i] == '<') {
|
||||||
|
/* maybe a control character ? */
|
||||||
|
for (j = 0; j < 32; j++) {
|
||||||
|
clen = strlen(ctrl_char[j]);
|
||||||
|
/* skip, if control sequence would not fit into the input buffer */
|
||||||
|
if (clen <= message_input_length - i && !memcmp(message_input + i, ctrl_char[j], clen)) {
|
||||||
|
/* found control sequence, so break the loop */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (j < 32) {
|
||||||
|
/* if loop was not completed, use the found character */
|
||||||
|
message_output[ii] = j;
|
||||||
|
i += clen;
|
||||||
|
} else {
|
||||||
|
clen = strlen(del_char);
|
||||||
|
/* skip, if control sequence would not fit into the input buffer */
|
||||||
|
if (clen <= i - message_input_length && !memcmp(message_input + i, del_char, clen)) {
|
||||||
|
/* found control sequence, copy DEL character */
|
||||||
|
message_output[ii] = 127;
|
||||||
|
i += clen;
|
||||||
|
} else {
|
||||||
|
/* found no control sequence, copy '<' character */
|
||||||
|
message_output[ii] = '<';
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* no control character */
|
||||||
|
message_output[ii] = message_input[i];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ii;
|
||||||
|
}
|
||||||
|
|
||||||
static uint32_t pocsag_crc(uint32_t word)
|
static uint32_t pocsag_crc(uint32_t word)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
|
|
||||||
const char *print_message(const char *message, int message_length);
|
const char *print_message(const char *message, int message_length);
|
||||||
|
int scan_message(const char *message_input, int message_input_length, char *message_output, int message_output_length);
|
||||||
int64_t get_codeword(pocsag_t *pocsag);
|
int64_t get_codeword(pocsag_t *pocsag);
|
||||||
void put_codeword(pocsag_t *pocsag, uint32_t word, int8_t slot, int8_t subslot);
|
void put_codeword(pocsag_t *pocsag, uint32_t word, int8_t slot, int8_t subslot);
|
||||||
|
|
||||||
|
|
|
@ -94,6 +94,14 @@ void print_help(const char *arg0)
|
||||||
printf("File: %s\n", MSG_SEND);
|
printf("File: %s\n", MSG_SEND);
|
||||||
printf(" Write \"<ric>,0,message\" to it to send a numerical message.\n");
|
printf(" Write \"<ric>,0,message\" to it to send a numerical message.\n");
|
||||||
printf(" Write \"<ric>,3,message\" to it to send an alphanumerical message.\n");
|
printf(" Write \"<ric>,3,message\" to it to send an alphanumerical message.\n");
|
||||||
|
printf(" alphanumeric messages may contain any character except LF and CR.\n");
|
||||||
|
printf(" Any control character can be sent by using pointed brackets:\n");
|
||||||
|
printf(" '<NUL>' '<SOH>' '<STX>' '<ETX>' '<EOT>' '<ENQ>' '<ACK>' '<BEL>'\n");
|
||||||
|
printf(" '<BS>' '<HT>' '<LF>' '<VT>' '<FF>' '<CR>' '<SO>' '<SI>'\n");
|
||||||
|
printf(" '<DLE> '<DC1>' '<DC2' '<DC3>' '<DC4>' '<NAK>' '<SYN>' '<ETB>'\n");
|
||||||
|
printf(" '<CAN>' '<EM>' '<SUB>' '<ESC>' '<FS>' '<GS>' '<RS>' '<US>'\n");
|
||||||
|
printf(" '<DEL> Example: Hello,<LF><CR>World!'\n");
|
||||||
|
|
||||||
printf("File: %s\n", MSG_RECEIVED);
|
printf("File: %s\n", MSG_RECEIVED);
|
||||||
printf(" Read from it to see received messages.\n");
|
printf(" Read from it to see received messages.\n");
|
||||||
main_mobile_print_station_id();
|
main_mobile_print_station_id();
|
||||||
|
|
|
@ -441,8 +441,7 @@ inval:
|
||||||
if (text_length) {
|
if (text_length) {
|
||||||
text++;
|
text++;
|
||||||
text_length--;
|
text_length--;
|
||||||
memcpy(message, text, text_length);
|
message_length = scan_message(text, text_length, message, sizeof(message));
|
||||||
message_length = text_length;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ric = atoi(ric_string);
|
ric = atoi(ric_string);
|
||||||
|
|
Loading…
Reference in New Issue