pocsag: Add option to change text message padding character

This commit is contained in:
Andreas Eversberg
2024-04-10 21:30:35 +02:00
parent f294261285
commit b642f82390
4 changed files with 17 additions and 4 deletions

View File

@@ -237,7 +237,7 @@ static uint32_t encode_alpha(pocsag_msg_t *msg)
/* fill remaining digit space with 0x04 (EOT) */ /* fill remaining digit space with 0x04 (EOT) */
while (bits <= 13) { while (bits <= 13) {
word = (word << 7) | 0x10; word = (word << 7) | msg->padding;
bits += 7; bits += 7;
} }

View File

@@ -50,6 +50,7 @@ static double polarity = -1;
static int polarity_given = 0; static int polarity_given = 0;
static enum pocsag_function function = POCSAG_FUNCTION_NUMERIC; static enum pocsag_function function = POCSAG_FUNCTION_NUMERIC;
static const char *message = "1234"; static const char *message = "1234";
static char padding = 4;
static enum pocsag_language language = LANGUAGE_DEFAULT; static enum pocsag_language language = LANGUAGE_DEFAULT;
static uint32_t scan_from = 0; static uint32_t scan_from = 0;
static uint32_t scan_to = 0; static uint32_t scan_to = 0;
@@ -87,6 +88,8 @@ void print_help(const char *arg0)
printf(" time. The upper 5 digits of the RIC are sent as message, if numeric\n"); printf(" time. The upper 5 digits of the RIC are sent as message, if numeric\n");
printf(" function was selected. The upper 3 digits of the RIC are sent as\n"); printf(" function was selected. The upper 3 digits of the RIC are sent as\n");
printf(" message (2 digits hexadecimal), if alphanumeric function was selected.\n"); printf(" message (2 digits hexadecimal), if alphanumeric function was selected.\n");
printf(" --padding 4 | 0 | ...\n");
printf(" Text message padding uses 4 (EOT) by default. Old pagers want 0 (NUL).\n");
printf("\n"); printf("\n");
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");
@@ -97,6 +100,8 @@ void print_help(const char *arg0)
main_mobile_print_hotkeys(); main_mobile_print_hotkeys();
} }
#define OPT_PADDING 256
static void add_options(void) static void add_options(void)
{ {
main_mobile_add_options(); main_mobile_add_options();
@@ -109,6 +114,7 @@ static void add_options(void)
option_add('M', "message", 1); option_add('M', "message", 1);
option_add('L', "language", 0); option_add('L', "language", 0);
option_add('S', "scan", 2); option_add('S', "scan", 2);
option_add(OPT_PADDING, "padding", 1);
} }
static int handle_options(int short_option, int argi, char **argv) static int handle_options(int short_option, int argi, char **argv)
@@ -188,6 +194,9 @@ static int handle_options(int short_option, int argi, char **argv)
return -EINVAL; return -EINVAL;
} }
break; break;
case OPT_PADDING:
padding = atoi(argv[argi++]);
break;
default: default:
return main_mobile_handle_options(short_option, argi, argv); return main_mobile_handle_options(short_option, argi, argv);
} }
@@ -343,7 +352,7 @@ int main(int argc, char *argv[])
printf("Invalid channel '%s', Use '-k list' to get a list of all channels.\n\n", kanal[i]); printf("Invalid channel '%s', Use '-k list' to get a list of all channels.\n\n", kanal[i]);
goto fail; goto fail;
} }
rc = pocsag_create(kanal[i], frequency, dsp_device[i], use_sdr, dsp_samplerate, rx_gain, tx_gain, tx, rx, language, baudrate, deviation, polarity, function, message, scan_from, scan_to, write_rx_wave, write_tx_wave, read_rx_wave, read_tx_wave, loopback); rc = pocsag_create(kanal[i], frequency, dsp_device[i], use_sdr, dsp_samplerate, rx_gain, tx_gain, tx, rx, language, baudrate, deviation, polarity, function, message, padding, scan_from, scan_to, write_rx_wave, write_tx_wave, read_rx_wave, read_tx_wave, loopback);
if (rc < 0) { if (rc < 0) {
fprintf(stderr, "Failed to create \"Sender\" instance. Quitting!\n"); fprintf(stderr, "Failed to create \"Sender\" instance. Quitting!\n");
goto fail; goto fail;

View File

@@ -228,6 +228,7 @@ static pocsag_msg_t *pocsag_msg_create(pocsag_t *pocsag, uint32_t callref, uint3
msg->repeat = 0; msg->repeat = 0;
strncpy(msg->data, text, sizeof(msg->data)); strncpy(msg->data, text, sizeof(msg->data));
msg->data_length = (strlen(text) < sizeof(msg->data)) ? strlen(text) : sizeof(msg->data); msg->data_length = (strlen(text) < sizeof(msg->data)) ? strlen(text) : sizeof(msg->data);
msg->padding = pocsag->padding;
/* link */ /* link */
msg->pocsag = pocsag; msg->pocsag = pocsag;
@@ -340,7 +341,7 @@ void pocsag_msg_receive(enum pocsag_language language, const char *channel, uint
} }
/* Create transceiver instance and link to a list. */ /* Create transceiver instance and link to a list. */
int pocsag_create(const char *kanal, double frequency, const char *device, int use_sdr, int samplerate, double rx_gain, double tx_gain, int tx, int rx, enum pocsag_language language, int baudrate, double deviation, double polarity, enum pocsag_function function, const char *message, uint32_t scan_from, uint32_t scan_to, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, const char *read_tx_wave, int loopback) int pocsag_create(const char *kanal, double frequency, const char *device, int use_sdr, int samplerate, double rx_gain, double tx_gain, int tx, int rx, enum pocsag_language language, int baudrate, double deviation, double polarity, enum pocsag_function function, const char *message, char padding, uint32_t scan_from, uint32_t scan_to, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, const char *read_tx_wave, int loopback)
{ {
pocsag_t *pocsag; pocsag_t *pocsag;
int rc; int rc;
@@ -374,6 +375,7 @@ int pocsag_create(const char *kanal, double frequency, const char *device, int u
pocsag->default_message = message; pocsag->default_message = message;
pocsag->scan_from = scan_from; pocsag->scan_from = scan_from;
pocsag->scan_to = scan_to; pocsag->scan_to = scan_to;
pocsag->padding = padding;
pocsag_display_status(); pocsag_display_status();

View File

@@ -34,6 +34,7 @@ typedef struct pocsag_msg {
int data_index; /* current character transmitting */ int data_index; /* current character transmitting */
int bit_index; /* current bit transmitting */ int bit_index; /* current bit transmitting */
int repeat; /* how often the message is sent */ int repeat; /* how often the message is sent */
char padding; /* EOT or other padding */
} pocsag_msg_t; } pocsag_msg_t;
/* instance of pocsag transmitter/receiver */ /* instance of pocsag transmitter/receiver */
@@ -46,6 +47,7 @@ typedef struct pocsag {
enum pocsag_language language; /* special characters */ enum pocsag_language language; /* special characters */
enum pocsag_function default_function; /* default function, if not given by caller */ enum pocsag_function default_function; /* default function, if not given by caller */
const char *default_message; /* default message, if caller has no caller ID */ const char *default_message; /* default message, if caller has no caller ID */
char padding; /* EOT or other padding */
/* tx states */ /* tx states */
enum pocsag_state state; /* state (idle, preamble, message) */ enum pocsag_state state; /* state (idle, preamble, message) */
@@ -98,7 +100,7 @@ int pocsag_init(void);
void pocsag_exit(void); void pocsag_exit(void);
void pocsag_new_state(pocsag_t *pocsag, enum pocsag_state new_state); void pocsag_new_state(pocsag_t *pocsag, enum pocsag_state new_state);
void pocsag_msg_receive(enum pocsag_language language, const char *channel, uint32_t ric, enum pocsag_function function, const char *message); void pocsag_msg_receive(enum pocsag_language language, const char *channel, uint32_t ric, enum pocsag_function function, const char *message);
int pocsag_create(const char *kanal, double frequency, const char *device, int use_sdr, int samplerate, double rx_gain, double tx_gain, int tx, int rx, enum pocsag_language language, int baudrate, double deviation, double polarity, enum pocsag_function function, const char *message, uint32_t scan_from, uint32_t scan_to, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, const char *read_tx_wave, int loopback); int pocsag_create(const char *kanal, double frequency, const char *device, int use_sdr, int samplerate, double rx_gain, double tx_gain, int tx, int rx, enum pocsag_language language, int baudrate, double deviation, double polarity, enum pocsag_function function, const char *message, char padding, uint32_t scan_from, uint32_t scan_to, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, const char *read_tx_wave, int loopback);
void pocsag_destroy(sender_t *sender); void pocsag_destroy(sender_t *sender);
void pocsag_msg_send(enum pocsag_language language, const char *text); void pocsag_msg_send(enum pocsag_language language, const char *text);
void pocsag_msg_destroy(pocsag_msg_t *msg); void pocsag_msg_destroy(pocsag_msg_t *msg);