diff --git a/QnetDVAP.cpp b/QnetDVAP.cpp index a1b9cd2..9467332 100644 --- a/QnetDVAP.cpp +++ b/QnetDVAP.cpp @@ -515,144 +515,6 @@ static void readFrom20000() return; } -int main(int argc, const char **argv) -{ - struct sigaction act; - int rc = -1; - time_t tnow = 0; - time_t ackpoint = 0; - short cnt = 0; - - setvbuf(stdout, NULL, _IOLBF, 0); - printf("dvap_rptr VERSION %s\n", VERSION); - - if (argc != 2) { - fprintf(stderr, "Usage: %s dvap_rptr.cfg\n", argv[0]); - return 1; - } - - if ('-' == argv[1][0]) { - printf("\nQnetDVAP Version #%s Copyright (C) 2018-2019 by Thomas A. Early N7TAE\n", DVAP_VERSION); - printf("QnetDVAP comes with ABSOLUTELY NO WARRANTY; see the LICENSE for details.\n"); - printf("This is free software, and you are welcome to distribute it\nunder certain conditions that are discussed in the LICENSE file.\n\n"); - return 0; - } - - const char *qn = strstr(argv[0], "qndvap"); - if (NULL == qn) { - fprintf(stderr, "Error finding 'qndvap' in %s!\n", argv[0]); - return 1; - } - qn += 6; - - switch (argv[1][0]) { - case NULL: - assigned_module = -1; - break; - case 'a': - assigned_module = 0; - break; - case 'b': - assigned_module = 1; - break; - case 'c': - assigned_module = 2; - break; - default: - fprintf(stderr, "ERROR: '%s' is not a valid module\nassigned module must be a, b or c\n", argv[1]); - return 1; - } - - if (read_config(argv[1])) { - printf("Failed to process config file %s\n", argv[2]); - return 1; - } - - if (RPTR.length() != 8) { - printf("Bad RPTR value, length must be exactly 8 bytes\n"); - return 1; - } - if ((RPTR_MOD != 'A') && (RPTR_MOD != 'B') && (RPTR_MOD != 'C')) { - printf("Bad RPTR_MOD value, must be one of A or B or C\n"); - return 1; - } - - if (RPTR_MOD == 'A') - SND_TERM_ID = 0x03; - else if (RPTR_MOD == 'B') - SND_TERM_ID = 0x01; - else if (RPTR_MOD == 'C') - SND_TERM_ID = 0x02; - - strcpy(RPTR_and_G, RPTR.c_str()); - RPTR_and_G[7] = 'G'; - - strcpy(RPTR_and_MOD, RPTR.c_str()); - RPTR_and_MOD[7] = RPTR_MOD; - - time(&tnow); - aseed = tnow + getpid(); - - act.sa_handler = sig_catch; - sigemptyset(&act.sa_mask); - if (sigaction(SIGTERM, &act, 0) != 0) { - printf("sigaction-TERM failed, error=%d\n", errno); - return 1; - } - if (sigaction(SIGHUP, &act, 0) != 0) { - printf("sigaction-HUP failed, error=%d\n", errno); - return 1; - } - if (sigaction(SIGINT, &act, 0) != 0) { - printf("sigaction-INT failed, error=%d\n", errno); - return 1; - } - - /* open dvp */ - if (!dongle.Initialize(DVP_SERIAL.c_str(), DVP_FREQ, DVP_OFF, DVP_PWR, DVP_SQL)) - return 1; - - rc = open_sock(); - if (rc != 0) { - dongle.Stop(); - close(serfd); - return 1; - } - printf("DVAP opened and initialized!\n"); - dstar_dv_init(); - - std::future readthread; - try { - readthread = std::async(std::launch::async, ReadDVAPThread); - } catch (const std::exception &e) { - printf("Unable to start ReadDVAPThread(). Exception: %s\n", e.what()); - keep_running = false; - } - printf("Started ReadDVAPThread()\n"); - - while (keep_running) { - time(&tnow); - if ((tnow - ackpoint) > 2) { - rc = dongle.KeepAlive(); - if (rc < 0) { - cnt ++; - if (cnt > 5) { - printf("Could not send KEEPALIVE signal to dvap 5 times...exiting\n"); - keep_running = false; - } - } else - cnt = 0; - ackpoint = tnow; - } - readFrom20000(); - } - - readthread.get(); - Gate2Modem.Close(); - printf("dvap_rptr exiting\n"); - return 0; -} - static void RptrAckThread(SDVAP_ACK_ARG *parg) { char mycall[8]; @@ -1074,3 +936,141 @@ static void ReadDVAPThread() keep_running = false; return; } + +int main(int argc, const char **argv) +{ + struct sigaction act; + int rc = -1; + time_t tnow = 0; + time_t ackpoint = 0; + short cnt = 0; + + setvbuf(stdout, NULL, _IOLBF, 0); + printf("dvap_rptr VERSION %s\n", VERSION); + + if (argc != 2) { + fprintf(stderr, "Usage: %s dvap_rptr.cfg\n", argv[0]); + return 1; + } + + if ('-' == argv[1][0]) { + printf("\nQnetDVAP Version #%s Copyright (C) 2018-2019 by Thomas A. Early N7TAE\n", DVAP_VERSION); + printf("QnetDVAP comes with ABSOLUTELY NO WARRANTY; see the LICENSE for details.\n"); + printf("This is free software, and you are welcome to distribute it\nunder certain conditions that are discussed in the LICENSE file.\n\n"); + return 0; + } + + const char *qn = strstr(argv[0], "qndvap"); + if (NULL == qn) { + fprintf(stderr, "Error finding 'qndvap' in %s!\n", argv[0]); + return 1; + } + qn += 6; + + switch (*qn) { + case NULL: + assigned_module = -1; + break; + case 'a': + assigned_module = 0; + break; + case 'b': + assigned_module = 1; + break; + case 'c': + assigned_module = 2; + break; + default: + fprintf(stderr, "ERROR: '%s' is not a valid module\nassigned module must be a, b or c\n", argv[1]); + return 1; + } + + if (read_config(argv[1])) { + printf("Failed to process config file %s\n", argv[2]); + return 1; + } + + if (RPTR.length() != 8) { + printf("Bad RPTR value, length must be exactly 8 bytes\n"); + return 1; + } + if ((RPTR_MOD != 'A') && (RPTR_MOD != 'B') && (RPTR_MOD != 'C')) { + printf("Bad RPTR_MOD value, must be one of A or B or C\n"); + return 1; + } + + if (RPTR_MOD == 'A') + SND_TERM_ID = 0x03; + else if (RPTR_MOD == 'B') + SND_TERM_ID = 0x01; + else if (RPTR_MOD == 'C') + SND_TERM_ID = 0x02; + + strcpy(RPTR_and_G, RPTR.c_str()); + RPTR_and_G[7] = 'G'; + + strcpy(RPTR_and_MOD, RPTR.c_str()); + RPTR_and_MOD[7] = RPTR_MOD; + + time(&tnow); + aseed = tnow + getpid(); + + act.sa_handler = sig_catch; + sigemptyset(&act.sa_mask); + if (sigaction(SIGTERM, &act, 0) != 0) { + printf("sigaction-TERM failed, error=%d\n", errno); + return 1; + } + if (sigaction(SIGHUP, &act, 0) != 0) { + printf("sigaction-HUP failed, error=%d\n", errno); + return 1; + } + if (sigaction(SIGINT, &act, 0) != 0) { + printf("sigaction-INT failed, error=%d\n", errno); + return 1; + } + + /* open dvp */ + if (!dongle.Initialize(DVP_SERIAL.c_str(), DVP_FREQ, DVP_OFF, DVP_PWR, DVP_SQL)) + return 1; + + rc = open_sock(); + if (rc != 0) { + dongle.Stop(); + close(serfd); + return 1; + } + printf("DVAP opened and initialized!\n"); + dstar_dv_init(); + + std::future readthread; + try { + readthread = std::async(std::launch::async, ReadDVAPThread); + } catch (const std::exception &e) { + printf("Unable to start ReadDVAPThread(). Exception: %s\n", e.what()); + keep_running = false; + } + printf("Started ReadDVAPThread()\n"); + + while (keep_running) { + time(&tnow); + if ((tnow - ackpoint) > 2) { + rc = dongle.KeepAlive(); + if (rc < 0) { + cnt ++; + if (cnt > 5) { + printf("Could not send KEEPALIVE signal to dvap 5 times...exiting\n"); + keep_running = false; + } + } else + cnt = 0; + ackpoint = tnow; + } + readFrom20000(); + } + + readthread.get(); + Gate2Modem.Close(); + printf("dvap_rptr exiting\n"); + return 0; +}