///* \file status_processor.c // * \brief Main SmartSDR DSP API Entry point // * // * \copyright Copyright 2011-2013 FlexRadio Systems. All Rights Reserved. // * Unauthorized use, duplication or distribution of this software is // * strictly prohibited by law. // * // * \date 31-AUG-2014 // * \author Stephen Hicks, N5AC // */ /* ***************************************************************************** * * Copyright (C) 2014 FlexRadio Systems. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Contact Information: * email: gplflexradiosystems.com * Mail: FlexRadio Systems, Suite 1-150, 4616 W. Howard LN, Austin, TX 78728 * * ************************************************************************** */ #include #include #include #include #include "common.h" #include "traffic_cop.h" #include "sched_waveform.h" static void _handle_status(char* string) { int argc; uint32 slc; // slice number char *argv[MAX_ARGC_STATUS + 1]; //Add one extra so we can null terminate the array // get the actual status message -- we don't care about the handle char* save = 0; char* start = strtok_r(string,"|",&save); start = strtok_r(NULL,"|",&save); // first let's look for a slice status -- these are most important if (strncmp(start, "slice", strlen("slice")) == 0) { tokenize(start, &argc, argv, MAX_ARGC); if (argc < 3) { // bad slice status ... ignoring it return; } errno = 0; slc = strtoul(argv[1], NULL, 0); if(errno) { output(ANSI_RED "Unable to parse slice number (%s)\n", argv[1]); return; } int i; for (i = 2; i < argc; i++) { if(strncmp(argv[i], "mode", strlen("mode")) == 0) { errno = 0; char* smode = argv[i]+strlen("mode")+1; if (strncmp(smode,"FDV",3) == 0) { // we are now in FDV mode output(ANSI_MAGENTA "slice %d is now in FDV mode - sendig commands\n",slc); char cmd[512] = {0}; sprintf(cmd, "slice s %d digu_offset=1500", slc); tc_sendSmartSDRcommand(cmd, FALSE, NULL); sprintf(cmd, "audio client 0 slice %d gain 90", slc); tc_sendSmartSDRcommand(cmd, FALSE, NULL); } else { // we have left FDV mode output(ANSI_MAGENTA "slice %d is in %s mode\n",slc,smode); } } if(strncmp(argv[i], "in_use", strlen("in_use")) == 0) { errno = 0; int in_use = strtoul(argv[i]+strlen("in_use")+1, NULL, 0); if (!in_use) { output(ANSI_MAGENTA "slice %d has been removed\n",slc); } } if(strncmp(argv[i], "tx", strlen("tx")) == 0) { errno = 0; int tx = strtoul(argv[i]+strlen("tx")+1, NULL, 0); if (tx) { output(ANSI_MAGENTA "slice %d is the transmit slice\n",slc); } else { output(ANSI_MAGENTA "slice %d is NOT transmit slice\n",slc); } } } } else if (strncmp(start, "interlock", strlen("interlock")) == 0) { tokenize(start, &argc, argv, MAX_ARGC); if (argc < 2) { // bad interlock status ... ignoring it return; } int i; for (i = 1; i < argc; i++) { if(strncmp(argv[i], "state", strlen("state")) == 0) { errno = 0; char* state = argv[i]+strlen("state")+1; if (strncmp(state,"PTT_REQUESTED",strlen("PTT_REQUESTED")) == 0) { output(ANSI_MAGENTA "we are transmitting\n"); } else if (strncmp(state,"READY",strlen("READY")) == 0 || strncmp(state,"NOT_READY",strlen("NOT_READY")) == 0) { output(ANSI_MAGENTA "we are receiving\n"); } else if ( strncmp(state, "UNKEY_REQUESTED", strlen("UNKEY_REQUESTED")) == 0 ) { output(ANSI_MAGENTA "unkey requested \n"); sched_waveform_setEndOfTX(TRUE); } } } } // now we could check for other statuses that were interesting } void status_processor(char* string) { switch (*string) { case 'V': // version { string++; uint32 version = getIP(string); api_setVersion(version); break; } case 'H': // handle { string++; uint32 val; sscanf(string, "%08X", &val); api_setHandle(val); break; } case 'R': // response { char* save = NULL; string++; uint32 val; sscanf(string, "%i", &val); char* response = strtok_r(string, "|", &save); response = strtok_r(NULL, "", &save); tc_commandList_respond(val, response); break; } case 'C': // command { char* save = NULL; string++; uint32 val; sscanf(string, "%i", &val); char* cmd = strtok_r(string, "|", &save); cmd = strtok_r(NULL, "", &save); #ifdef DEBUG output("\033[32mExecuting command from SmartSDR: \033[m%s\n",cmd); #endif uint32 ret = process_command(cmd); char response[1024]; sprintf(response, "waveform response %d|%d", val, ret); tc_sendSmartSDRcommand(response, FALSE, NULL ); break; } case 'S': // status { // here we translate from SmartSDR status message we are interested in // and the corresponding commands we want to execute _handle_status(string); break; } case 'M': // message break; default: output(ANSI_YELLOW "Status Processor: unknown status \033[m%s\n",string); break; } }