📄 mbxtcl.c
字号:
u16 state;
char str[20];
if (argc != 2) {
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
" port\"", (char *)NULL);
return TCL_ERROR;
}
/* Get port number from the first argument and check it. */
if (Tcl_GetInt(interp, argv[1], &port) != TCL_OK) {
return TCL_ERROR;
}
if (port < 0 || port > 5) {
Tcl_SetResult(interp, "port must be between 0-5", TCL_STATIC);
return TCL_ERROR;
}
state = CMX_ReadAdc(port);
sprintf(str, "%d", state);
Tcl_SetResult(interp, str, TCL_VOLATILE);
return TCL_OK;
}
/****f* MBXTCL/MbxTclDac
* DESCRIPTION
* This function controls the digital-analog converter in the CMX990.
***/
static const char MbxTclDacHelp[] = "This writes the DAC in the CMX990.\n\
The port shall be 0-5.\n\
Syntax to write a value:\n\
dac <port> <value>\n\
Syntax to read the register:\n\
dac <port>";
static int MbxTclDac(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) {
int port;
int value;
char str[20];
if (argc < 2) {
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
" port ?value?\"", (char *)NULL);
return TCL_ERROR;
}
/* Get port number from the first argument and check it. */
if (Tcl_GetInt(interp, argv[1], &port) != TCL_OK) {
return TCL_ERROR;
}
if (port < 0 || port > 5) {
Tcl_SetResult(interp, "port must be between 0-5", TCL_STATIC);
return TCL_ERROR;
}
/* If only 1 argument is given we shall read the register. */
if (argc == 2) {
value = CMX_ReadDac(port);
sprintf(str, "%d", value);
Tcl_SetResult(interp, str, TCL_VOLATILE);
return TCL_OK;
}
if (argc != 3) {
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
" port ?value?\"", (char *)NULL);
return TCL_ERROR;
}
/* Get value from the second argument and check it. */
if (Tcl_GetInt(interp, argv[2], &value) != TCL_OK) {
return TCL_ERROR;
}
if (value < 0 || value > 1023) {
Tcl_SetResult(interp, "value must be between 0-1023", TCL_STATIC);
return TCL_ERROR;
}
CMX_WriteDac(port, (u16)value);
sprintf(str, "%d", value);
Tcl_SetResult(interp, str, TCL_VOLATILE);
return TCL_OK;
}
/****f* MBXTCL/MbxTclPll
* DESCRIPTION
* This function controls the PLL registers in the CMX990.
***/
static const char MbxTclPllHelp[] = "This writes a PLL register in the CMX990.\n\
The reg shall be one of mainM, mainN, auxM and auxN.\n\
The value differs depending on register.\n\
Syntax to write a register:\n\
pll <reg> <value>\n\
Syntax to read a register:\n\
pll <reg>";
static int MbxTclPll(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) {
PllSelect_t reg;
int value;
char str[20];
if (argc < 2) {
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
" reg ?value?\"", (char *)NULL);
return TCL_ERROR;
}
/* Check which register */
if (strcmp(argv[1], "mainM") == 0) {
reg = MAIN_M;
} else if (strcmp(argv[1], "mainN") == 0) {
reg = MAIN_N;
} else if (strcmp(argv[1], "auxM") == 0) {
reg = AUX_M;
} else if (strcmp(argv[1], "auxN") == 0) {
reg = AUX_N;
} else {
Tcl_SetResult(interp, "wrong PLL register, should be one of: mainM mainN auxM auxN",
TCL_STATIC);
return TCL_ERROR;
}
if (argc == 2) {
value = CMX_ReadPll(reg);
sprintf(str, "%d", value);
Tcl_SetResult(interp, str, TCL_VOLATILE);
return TCL_OK;
}
if (argc != 3) {
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
" reg ?value?\"", (char *)NULL);
return TCL_ERROR;
}
/* Get value from the second argument and check it. */
if (Tcl_GetInt(interp, argv[2], &value) != TCL_OK) {
return TCL_ERROR;
}
if (reg == MAIN_N) {
/* mainN is 24 bits register. */
if (value < 0 || value > 16777215) {
Tcl_SetResult(interp, "value must be between 0-16777215", TCL_STATIC);
return TCL_ERROR;
}
} else {
/* All other register is 16 bits. */
if (value < 0 || value > 65535) {
Tcl_SetResult(interp, "value must be between 0-65535", TCL_STATIC);
return TCL_ERROR;
}
}
CMX_WritePll(reg, value);
sprintf(str, "%d", value);
Tcl_SetResult(interp, str, TCL_VOLATILE);
return TCL_OK;
}
/****f* MBXTCL/MbxTclCmx
* DESCRIPTION
* This function controls all register in the CMX990.
***/
static const char MbxTclCmxHelp[] = "This reads and writes register in CMX990.\n\
The reg shall be 0-63 and the value shall be 0-255.\n\
Syntax to write a register:\n\
cmx <reg> <value>\n\
Syntax to read a register:\n\
cmx <reg>\n\
It is possible to read the value from a CMX write register.\n\
Syntax:\n\
cmx -w <reg>\n\
Some CMX write registers are not possible to read from. When using the flag -s it\n\
is possible to read the last value written to such register.\n\
This is handled by the software and only the registers found to be erroneus\n\
are software handled. For all other registers the -s flag are the same as -w.\n\
Syntax:\n\
cmx -s <reg>\n\
To reset CMX990 use the following command.\n\
Syntax:\n\
cmx reset";
static int MbxTclCmx(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) {
int reg;
int value;
int regIndex = 1;
bool cmxRead = TRUE;
char str[20];
if (argc < 2) {
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
" ?option? reg ?value?\"", (char *)NULL);
return TCL_ERROR;
}
if (strcmp(argv[1], "-w") == 0) {
/* Read the value from a write-register. */
if (argc != 3) {
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
" ?option? reg\"", (char *)NULL);
return TCL_ERROR;
}
regIndex = 2;
}
if (strcmp(argv[1], "-s") == 0) {
/* Read the soft value from a write-register. */
if (argc != 3) {
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
" ?option? reg\"", (char *)NULL);
return TCL_ERROR;
}
regIndex = 2;
cmxRead = FALSE;
}
if (strcmp(argv[1], "reset") == 0) {
if (argc != 2) {
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
" reset\"", (char *)NULL);
return TCL_ERROR;
}
CMX_Reset();
return TCL_OK;
}
/* Get port number from the first argument and check it. */
if (Tcl_GetInt(interp, argv[regIndex], ®) != TCL_OK) {
return TCL_ERROR;
}
if (reg < 0 || reg > 63) {
Tcl_SetResult(interp, "reg must be between 0-63", TCL_STATIC);
return TCL_ERROR;
}
if (argc == regIndex+1) {
/* Read value from register */
if (regIndex == 1) {
value = CMX_Read(reg);
} else {
value = CMX_ReadWriteReg(reg, cmxRead);
}
} else {
if (argc != 3) {
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
" reg ?value?\"", (char *)NULL);
return TCL_ERROR;
}
/* Get value from the second argument and check it. */
if (Tcl_GetInt(interp, argv[regIndex+1], &value) != TCL_OK) {
return TCL_ERROR;
}
if (value < 0 || value > 255) {
Tcl_SetResult(interp, "value must be between 0-255", TCL_STATIC);
return TCL_ERROR;
}
CMX_Write(reg, (u8)value);
}
sprintf(str, "%d", value);
Tcl_SetResult(interp, str, TCL_VOLATILE);
return TCL_OK;
}
/****f* MBXTCL/MbxTclPrbs
* DESCRIPTION
* This function returns the current PRBS statistics in the receiver.
***/
static const char MbxTclPrbsHelp[] = "This command returns the current received PRBS statistics.\n\
Syntax:\n\
prbs ?reset?\n\
If reset is given the statistics are reseted.\n\
The command returns 2 values. The first is the total number of bit errors and\n\
the second is the total numbers of bits received.";
static int MbxTclPrbs(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) {
CMX_PrbsStatistics_t prbsStat;
char str1[30], str2[30];
if (argc == 1) {
/* Read PRBS statistics */
CMX_GetPrbsStat(&prbsStat);
sprintf(str1, "%d", (int)prbsStat.errorNoBits);
sprintf(str2, "%d", (int)prbsStat.totalNoBits);
Tcl_AppendResult(interp, str1, " ", str2, (char *)NULL);
return TCL_OK;
}
if (argc != 2) {
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
" ?reset?\"", (char *)NULL);
return TCL_ERROR;
}
if (strcmp(argv[1], "reset") != 0) {
Tcl_AppendResult(interp, "wrong option: should be \"", argv[0],
" reset\"", (char *)NULL);
return TCL_ERROR;
}
CMX_ResetPrbs();
Tcl_AppendResult(interp, "0", " ", "0", (char *)NULL);
return TCL_OK;
}
/****f* MBXTCL/MbxTclRx
* DESCRIPTION
* This function turns the receiver on and off.
***/
static const char MbxTclRxHelp[] = "This command turns the receiver on and off.\n\
All register in CMX990 are automatically set to the correct values for Rx to\n\
work if not otherwise stated.\n\
Syntax to get current rx frequency:\n\
rx\n\
Syntax to stop receiver:\n\
rx off ?min?\n\
Syntax to start receive a PRBS:\n\
rx on <freq> ?min?\n\
The parameter freq defines the frequency to use to receive.\n\
Parameter freq is given in MHz.\n\
Parameter min is given to NOT set all register but a minimum.";
static int MbxTclRx(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) {
double dFreq;
int freq;
s32 minRxFreq, maxRxFreq, minTxFreq, maxTxFreq;
char str[100];
if (argc == 1) {
/* Return current frequency. */
sprintf(str, "%f", (double)CMX_GetRxFreq()/1000000.0);
Tcl_SetResult(interp, str, TCL_VOLATILE);
return TCL_OK;
}
if (argc < 2) {
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
" on|off ?freq? ?min?\"", (char *)NULL);
return TCL_ERROR;
}
if (strcmp(argv[1], "off") == 0) {
if (argc == 2) {
CMX_RxActive(FALSE, FALSE);
return TCL_OK;
}
if (argc != 3) {
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
" off ?min?\"", (char *)NULL);
return TCL_ERROR;
}
if (strcmp(argv[2], "min") != 0) {
Tcl_AppendResult(interp, "wrong option: should be min", (char *)NULL);
return TCL_ERROR;
}
CMX_RxActive(FALSE, TRUE);
return TCL_OK;
}
if (strcmp(argv[1], "on") == 0) {
bool min;
if (argc == 4) {
if (strcmp(argv[3], "min") != 0) {
Tcl_AppendResult(interp, "wrong option: should be min", (char *)NULL);
return TCL_ERROR;
}
min = TRUE;
} else if (argc != 3) {
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
" on freq ?min?\"", (char *)NULL);
return TCL_ERROR;
} else {
min = FALSE;
}
/* Get freq from second argument */
if (Tcl_GetDouble(interp, argv[2], &dFreq) != TCL_OK) {
return TCL_ERROR;
}
freq = (int)(dFreq*1000000.0+0.5);
CMX_GetFreqBand(&minRxFreq, &maxRxFreq, &minTxFreq, &maxTxFreq);
/* Check frequency range. */
if (freq < minRxFreq || freq > maxRxFreq) {
sprintf(str, "freq must be between %d-%d MHz for RX",
(int)(minRxFreq/1000000), (int)(maxRxFreq/1000000));
Tcl_SetResult(interp, str, TCL_VOLATILE);
return TCL_ERROR;
}
CMX_SetRxFreq(freq);
CMX_RxActive(TRUE, min);
Tcl_SetResult(interp, "Rx PRBS started", TCL_STATIC);
return TCL_OK;
}
Tcl_AppendResult(interp, "wrong option: should be on|off", (char *)NULL);
return TCL_ERROR;
}
/****f* MBXTCL/MbxTclTx
* DESCRIPTION
* This function turns the transmitter on and off.
***/
static const char MbxTclTxHelp[] = "This command turns the transmitter on and off.\n\
All register in CMX990 are automatically set to the correct values for Tx to\n\
work if not otherwise stated.\n\
Syntax to get current tx frequency:\n\
tx\n\
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -