view cmu200/signalgen.c @ 69:4e263849b064

fc-cmu200d: CMU200 external attenuation setting implemented in signal gen mode
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 14 Jul 2017 04:52:03 +0000
parents 34c6fbe38daa
children
line wrap: on
line source

/*
 * This module implements the signal generator functionality.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include "mode.h"
#include "band.h"
#include "secaddr.h"

extern char *cmu200_tx_name;
extern int cmu200_rf_port;

extern char *client_cmd_fields[];
extern int client_cmd_nfields;

extern int current_mode;
extern struct band *current_band;

stop_signal_gen()
{
	char cmdstr[80];

	if (current_mode == OP_MODE_SIGNAL_GEN) {
		sprintf(cmdstr, "ABORT:RFG:%s\n", cmu200_tx_name);
		send_scpi_cmd(cmdstr);
	}
}

cmd_signal_gen_setup()
{
	int rc;
	char cmdstr[80];

	if (client_cmd_nfields != 2) {
		send_socket_response("-Wrong number of arguments\n");
		return(0);
	}
	stop_signal_gen();
	current_mode = OP_MODE_UNDEF;
	rc = find_named_band(client_cmd_fields[1]);
	if (rc < 0) {
		send_socket_response("-Invalid band argument\n");
		return(0);
	}
	sprintf(cmdstr, "*SEC %d\n", SECADDR_RF_NSIG);
	send_scpi_cmd(cmdstr);
	sprintf(cmdstr, "OUTP:%s RF%d\n", cmu200_tx_name, cmu200_rf_port);
	send_scpi_cmd(cmdstr);
	sprintf(cmdstr, "CORR:LOSS:OUTP%d:%s %u.%u\n", cmu200_rf_port,
		cmu200_tx_name, current_band->dl_cable_loss / 10,
		current_band->dl_cable_loss % 10);
	send_scpi_cmd(cmdstr);
	current_mode = OP_MODE_SIGNAL_GEN;
	send_socket_response("+OK\n");
	return(0);
}

cmd_signal_gen_sine()
{
	unsigned arfcn, freq_khz;
	int offset;
	char cmdstr[128];

	if (current_mode != OP_MODE_SIGNAL_GEN) {
		send_socket_response("-Wrong mode\n");
		return(0);
	}
	if (client_cmd_nfields != 4) {
		send_socket_response("-Wrong number of arguments\n");
		return(0);
	}
	arfcn = atoi(client_cmd_fields[1]);
	if (verify_arfcn(arfcn, 0, &freq_khz) < 0) {
		send_socket_response("-Invalid ARFCN\n");
		return(0);
	}
	offset = atoi(client_cmd_fields[2]);
	freq_khz += offset;
	sprintf(cmdstr, "SOUR:RFG:%s:LEV %s\n", cmu200_tx_name,
		client_cmd_fields[3]);
	send_scpi_cmd(cmdstr);
	sprintf(cmdstr, "SOUR:RFG:%s:FREQ %u000\n", cmu200_tx_name, freq_khz);
	send_scpi_cmd(cmdstr);
	sprintf(cmdstr, "INIT:RFG:%s\n", cmu200_tx_name);
	send_scpi_cmd(cmdstr);
	send_scpi_cmd("*OPC?\n");
	collect_staropc_response();
	send_socket_response("+OK\n");
	return(0);
}

cmd_signal_gen_off()
{
	stop_signal_gen();
	send_socket_response("+OK\n");
	return(0);
}