float BiquadFilter::get(float _x) { switch (type) { case kBiquadFilter_BPF: setBPF(); break; case kBiquadFilter_Notch: setNotch(); break; } float ret = (b0 / a0) * _x + (b1 / a0) * x1 + (b2 / a0) * x2 - (a1 / a0) * y1 - (a2 / a0) * y2; x2 = x1; x1 = _x; y2 = y1; y1 = ret; return ret; }
/** * Main routine. Parse commandline args and trigger actions. */ int main(int argc, char **argv) { usb_dev_handle *handle = NULL; char * usbSerialID = NULL; int c; // moved this malloc() here instead of within the while(1) loop // to prevent memory leakage problem // as *args is not free'ed. char **args = malloc(MAX_COMMAND_ARGS * sizeof(char *)); int port = 19004; int daemon = 0; // Read options while ( (c = getopt(argc, argv, "adhi:m:p:s:u:vx:")) != -1) { switch (c) { case 'i': i2cAddress = atoi(optarg); break; case 'a': setByValue = 1; break; case 'd': daemon = 1; break; case 'h': firmware_PTT = 1; break; case 'm': multiplier = atof(optarg); break; case 'p': port = atoi(optarg); break; case 's': startupFreq = atof(optarg); break; case 'x': fXtall = atof(optarg); break; case 'u': usbSerialID = optarg; break; case 'v': verbose++; break; default: /* '?' */ usage(argv[0]); exit(EXIT_FAILURE); } } if (verbose) { printf("I2C Address = %X\n", i2cAddress); printf("fXtall = %f\n", fXtall); printf("multiplier = %f\n", multiplier); printf("startupFreq = %f\n", startupFreq); } if((argc <= optind) && (daemon == 0)){ usage(argv[0]); exit(1); } usb_init(); char attempt=0, error=0; do { attempt++; error=usbOpenDevice(&handle, USBDEV_SHARED_VENDOR, VENDOR_NAME, USBDEV_SHARED_PRODUCT, PRODUCT_NAME, usbSerialID); if(error != 0){ fprintf(stderr, "Could not open USB device \"%s\" with vid=0x%x pid=0x%x, retrying\n", PRODUCT_NAME, USBDEV_SHARED_VENDOR, USBDEV_SHARED_PRODUCT); sleep(2*attempt); } } while (error && attempt < USB_MAX_RETRIES); if (error) { fprintf(stderr, "Permanent problem opening usb device. Giving up.\n"); exit(1); } unsigned short version = readVersion(handle); major = (version & 0xFF00) >> 8; minor = (version & 0xFF); /* Relocate lower later */ if (daemon) { printf("Starting daemon...\n"); int socket_desc; socket_desc=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); if (socket_desc==-1) perror("Create socket"); struct sockaddr_in address; /* type of socket created in socket() */ address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(port); /* bind the socket to the port specified above */ int retval; if (bind(socket_desc,(struct sockaddr *)&address,sizeof(address)) != 0) { fprintf(stderr, "Error binding to port %d\n", port); exit(0); } while (1) { ssize_t bytes; char buffer[1024]; struct sockaddr_in clnt; socklen_t clnt_len; clnt_len = sizeof(clnt); bytes = recvfrom (socket_desc, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&clnt, &clnt_len); if (bytes > 0) { buffer[bytes] = 0; if (verbose >= 2) printf("Returned %d bytes from %s: %s\n", bytes, inet_ntoa(clnt.sin_addr), buffer); if (strncmp(buffer, "quit", 4) == 0) { if (verbose) printf("Quit command received\n"); exit(0); } char *saveptr; char *token; int argn = 0; for (int i=0; i < MAX_COMMAND_ARGS;i++) args[i] = NULL; token = strtok_r(buffer, " ", &saveptr); while (token != NULL) { args[argn] = strcpy(malloc(strlen(token) + 1), token); argn++; token = strtok_r(NULL, " ", &saveptr); } // Execute command here char result[100]; do_command(handle, args, argn, result); // Cleanup for (int i=0; i < MAX_COMMAND_ARGS;i++) { if (args[i] != NULL) free(args[i]); } int retlen = strlen(result); if (sendto(socket_desc, result, retlen,0, (struct sockaddr *) &clnt, clnt_len) != retlen) { perror("Failed to send ack"); exit(1); } } else { fprintf(stderr, "recvfrom returned %d\n", bytes); } } close(socket_desc); exit(0); } /* Device has been opened - perform the requested operation */ if (strcmp(argv[optind], "getregisters") == 0) { getRegisters(handle); } else if(strcmp(argv[optind], "getfreq") == 0){ double freq; if (setByValue) freq = readFrequencyByValue(handle); else freq = getFrequency(handle); if (freq != 0.00) printf("Frequency : %f (x %.2f)\n", freq / multiplier, multiplier); #ifdef HAVE_LIBNCURSES } else if (strcmp(argv[optind], "interactive") == 0) { run_interactive(handle); #endif } else if (strcmp(argv[optind], "getptt") == 0){ if (firmware_PTT) PTT = getPTT(handle); printf("PTT : %d\n", PTT); } else if (strcmp(argv[optind], "getkeys") == 0){ keys = getkeys(handle); printf("Paddles: %d\n", keys); } else if (strcmp(argv[optind], "gettone") == 0){ printf("CW Tone: %d\n", CW_tone); } else if ((strcmp(argv[optind], "ptt") == 0) && (argc >= optind + 1)) { PTT = (strcmp(argv[optind+1],"on") == 0) ? 1: 0; setPTT(handle, PTT); printf("PTT set to %d\n", PTT); } else if (strcmp(argv[optind], "calibrate") == 0) { calibrate(handle); } else if ((strcmp(argv[optind], "set") == 0) && (argc >= optind + 2)) { if ((strcmp(argv[optind+1], "bpf_addr") == 0) && (argc >= optind + 3)) { // set bpf_addr index value setBPFAddress(handle, atoi(argv[optind+2]), atoi(argv[optind+3])); } else if ((strcmp(argv[optind+1], "bpf_point") == 0) && (argc >= optind + 3)) { // set bpf_point index (int) value (float) setBPFCrossOver(handle, atoi(argv[optind+2]), atof(argv[optind+3])); } else if ((strcmp(argv[optind+1], "bpf") == 0) && (argc >= optind + 2)) { setBPF(handle, (strcmp(argv[optind+2],"on") == 0) ? 1 : 0); } else if ((strcmp(argv[optind+1], "lpf") == 0) && (argc >= optind + 2)) { setLPF(handle, (strcmp(argv[optind+2],"on") == 0) ? 1 : 0); } else if ((strcmp(argv[optind+1], "lpf_addr") == 0) && (argc >= optind + 3)) { // set bpf_addr index value setBPFAddress(handle, atoi(argv[optind+2]), atoi(argv[optind+3])); displayLPFs(handle); } else if ((strcmp(argv[optind+1], "lpf_point") == 0) && (argc >= optind + 3)) { // set lpf_point index (int) value (float) setLPFCrossOver(handle, atoi(argv[optind+2]), atof(argv[optind+3])); } else if (strcmp(argv[optind+1], "freq") == 0) { if (setByValue) setFreqByValue(handle, atof(argv[optind+2])); else setFrequency(handle, atof(argv[optind+2])); } else if ((strcmp(argv[optind+1], "registers") == 0 || strcmp(argv[optind+1], "regs") == 0) && argc == optind+8) { unsigned char regs[6]; int i; for (i = 0; i < 6; i += 1) regs[i] = strtol(argv[optind+2+i], NULL, 0); setRegisters(handle, regs); } else if ((strcmp(argv[optind+1], "si570_addr") == 0) && (argc >= optind + 2)) { setSi570Address(handle, atoi(argv[optind+2])); } else if (strcmp(argv[optind+1], "si570_multiplier") == 0) { int index = 0; int valueIndex = optind+2; // If there are 2 args after the variable name, one is index if (argc >= optind + 3) { index = atoi(argv[optind+2]); valueIndex++; } double sub, mul; readMultiplyLO(handle, index, &mul, &sub); mul = atof(argv[valueIndex]); setMultiplyLo(handle, index, mul, sub); if (verbose) printf("Set multiply [%d] to : %f\n", index, mul); } else if (strcmp(argv[optind+1], "xtall") == 0) { setXtallFrequency(handle, atof(argv[optind+2])); } else if (strcmp(argv[optind+1], "startup") == 0) { setStartupFrequency(handle, atof(argv[optind+2])); } else { usage(argv[0]); exit(1); } } else if (strcmp(argv[optind], "solutions") == 0) { solveRegisters(handle); } else if (strcmp(argv[optind], "status") == 0) { printf("USB SerialID: %s\n", serialNumberString); if (major >= 15) { readFrequencyByValue(handle); readStartupFreq(handle); readXtallFreq(handle); readSmoothTunePPM(handle); if (major >= 16 || minor >= 12) { readSi570Address(handle); } displayBands(handle); displayLPFs(handle); /* if (major >= 16 || ((major >= 15) && (minor >= 12))) { displayBands(handle); } else if (minor >= 10) { double sub, mul; readMultiplyLO(handle, 0, &mul, &sub); printf("LO Subtract : %f\n", sub); printf("Multiply : %f\n", mul); } //displayBPFFilters(handle); //displayLPFFilters(handle);*/ } } else if (strcmp(argv[optind], "tweak") == 0) { tweakRegisters(handle); } else { usage(argv[0]); exit(1); } usb_close(handle); return 0; }
int do_command(usb_dev_handle *handle, char **argv, int argc, char *result) { sprintf(result, "ok"); if (strcmp(argv[0], "get") == 0) { if(argv[1][0] == 'p'){ if (firmware_PTT) PTT = getPTT(handle); // this reads the PTT status from the connected Mobo sprintf(result, "ok %d", PTT); } else if (argv[1][0] == 'k'){ keys = getkeys(handle); sprintf(result, "ok %d", keys); } else if(argv[1][0] == 'f'){ double freq; if (setByValue) freq = readFrequencyByValue(handle); else freq = getFrequency(handle); if (freq != 0.00) { if (verbose >= 2) printf("Frequency : %f (x %.2f)\n", freq / multiplier, multiplier); sprintf(result, "ok %f", freq / multiplier); } else { sprintf(result, "error"); return -1; } } else if(argv[1][0] == 't'){ sprintf(result, "ok %d", CW_tone); } else if (strcmp(argv[1], "si570_multiplier") == 0) { double sub, mul; // Just works for non per-band multipliers if (readMultiplyLO(handle, 0, &mul, &sub) == 0) sprintf(result, "ok %f", mul); else { sprintf(result, "error"); return -1; } } else if (strcmp(argv[1], "local_multiplier") == 0) { sprintf(result, "ok %f", multiplier); } else { sprintf(result, "error"); return -1; } // end if "local multiplier" } // end if "get" else if ((strcmp(argv[0], "set") == 0) && (argc >= 2)) { if ((strcmp(argv[1], "ptt") == 0) && (argc >= 1)) { PTT = (strncmp(argv[2],"on",2) == 0) ? 1 : 0; setPTT(handle, PTT); } else if ((strcmp(argv[1], "bpf") == 0)) { setBPF(handle, (strncmp(argv[2],"on",2) == 0) ? 1 : 0); } else if (strcmp(argv[1], "freq") == 0) { if (setByValue) setFreqByValue(handle, atof(argv[2])); else setFrequency(handle, atof(argv[2])); } else if (strcmp(argv[1], "tone") == 0) { CW_tone = atof(argv[2]); } else if (strcmp(argv[1], "local_multiplier") == 0) { multiplier = atof(argv[2]); } else if (strcmp(argv[1], "registers") == 0 || strcmp(argv[1], "regs") == 0 && argc == 8) { unsigned char regs[6]; int i; for (i = 0; i < 6; i += 1) regs[i] = strtol(argv[2+i], NULL, 0); setRegisters(handle, regs); } else if (strcmp(argv[1], "tweak") == 0) { tweakRegisters(handle); } else { sprintf(result, "error"); return -1; } } else { sprintf(result, "error"); return -1; } return 0; }
int do_command(usb_dev_handle *handle, char **argv, int argc, char *result) { sprintf(result, "ok"); if ((strcmp(argv[0], "get") == 0) && (argc >= 1)) { if(strcmp(argv[1], "freq") == 0){ double freq; if (setByValue) freq = readFrequencyByValue(handle); else freq = getFrequency(handle); if (freq != 0.00) { if (verbose >= 2) printf("Frequency : %f (x %.2f)\n", freq / multiplier, multiplier); sprintf(result, "ok %f", freq / multiplier); } else { sprintf(result, "error"); return -1; } } else if (strcmp(argv[1], "si570_multiplier") == 0) { double sub, mul; // Just works for non per-band multipliers if (readMultiplyLO(handle, 0, &mul, &sub) == 0) sprintf(result, "ok %f", mul); else sprintf(result, "error"); } else if (strcmp(argv[1], "local_multiplier")) { sprintf(result, "ok %f", multiplier); } else { sprintf(result, "error"); } } else if ((strcmp(argv[0], "set") == 0) && (argc >= 2)) { if ((strcmp(argv[1], "ptt") == 0) && (argc >= 1)) { setPTT(handle, (strncmp(argv[2],"on",2) == 0) ? 1 : 0); } else if ((strcmp(argv[1], "bpf") == 0)) { setBPF(handle, (strncmp(argv[2],"on",2) == 0) ? 1 : 0); } else if (strcmp(argv[1], "freq") == 0) { if (setByValue) setFreqByValue(handle, atof(argv[2])); else setFrequency(handle, atof(argv[2])); } else if (strcmp(argv[1], "local_multiplier")) { multiplier = atof(argv[2]); } else { sprintf(result, "error"); return -1; } } else { sprintf(result, "error"); return -1; } return 0; }