mirror of
https://github.com/Hamlib/Hamlib
synced 2026-08-13 17:32:05 -04:00
'p BANDSELECT' returns current band of VFOA 'P BANDSELECT BAND160M' example selects the 160M band 'P BANDSELECT ?' shows bands available for the rig Kenwood rigs will be next Icom rigs TBD when Icom explains the return from 0x1a 0x01 -- no bandselect possible so manual setting of rig values https://github.com/Hamlib/Hamlib/issues/1353
311 lines
7.4 KiB
C
311 lines
7.4 KiB
C
// can run this using rigctl/rigctld and socat pty devices
|
|
// gcc -o simyaesu simyaesu.c
|
|
#define _XOPEN_SOURCE 700
|
|
// since we are POSIX here we need this
|
|
struct ip_mreq
|
|
{
|
|
int dummy;
|
|
};
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <fcntl.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include "../include/hamlib/rig.h"
|
|
|
|
#define BUFSIZE 256
|
|
|
|
float freqA = 14074000;
|
|
float freqB = 14074500;
|
|
char tx_vfo = '0';
|
|
char rx_vfo = '0';
|
|
char modeA = '0';
|
|
char modeB = '0';
|
|
int keyspd = 20;
|
|
int bandselect = 5;
|
|
|
|
// ID 0310 == 310, Must drop leading zero
|
|
typedef enum nc_rigid_e
|
|
{
|
|
NC_RIGID_NONE = 0,
|
|
NC_RIGID_FT450 = 241,
|
|
NC_RIGID_FT450D = 244,
|
|
NC_RIGID_FT950 = 310,
|
|
NC_RIGID_FT891 = 135,
|
|
NC_RIGID_FT991 = 135,
|
|
NC_RIGID_FT2000 = 251,
|
|
NC_RIGID_FT2000D = 252,
|
|
NC_RIGID_FTDX1200 = 583,
|
|
NC_RIGID_FTDX9000D = 101,
|
|
NC_RIGID_FTDX9000Contest = 102,
|
|
NC_RIGID_FTDX9000MP = 103,
|
|
NC_RIGID_FTDX5000 = 362,
|
|
NC_RIGID_FTDX3000 = 460,
|
|
NC_RIGID_FTDX101D = 681,
|
|
NC_RIGID_FTDX101MP = 682
|
|
} nc_rigid_t;
|
|
|
|
int
|
|
getmyline(int fd, char *buf)
|
|
{
|
|
char c;
|
|
int i = 0;
|
|
memset(buf, 0, BUFSIZE);
|
|
|
|
while (read(fd, &c, 1) > 0)
|
|
{
|
|
buf[i++] = c;
|
|
|
|
if (c == ';') { return strlen(buf); }
|
|
}
|
|
|
|
return strlen(buf);
|
|
}
|
|
|
|
#if defined(WIN32) || defined(_WIN32)
|
|
int openPort(char *comport) // doesn't matter for using pts devices
|
|
{
|
|
int fd;
|
|
fd = open(comport, O_RDWR);
|
|
|
|
if (fd < 0)
|
|
{
|
|
perror(comport);
|
|
}
|
|
|
|
return fd;
|
|
}
|
|
|
|
#else
|
|
int openPort(char *comport) // doesn't matter for using pts devices
|
|
{
|
|
int fd = posix_openpt(O_RDWR);
|
|
char *name = ptsname(fd);
|
|
|
|
if (name == NULL)
|
|
{
|
|
perror("pstname");
|
|
return -1;
|
|
}
|
|
|
|
printf("name=%s\n", name);
|
|
|
|
if (fd == -1 || grantpt(fd) == -1 || unlockpt(fd) == -1)
|
|
{
|
|
perror("posix_openpt");
|
|
return -1;
|
|
}
|
|
|
|
return fd;
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
char buf[256];
|
|
char *pbuf;
|
|
int n;
|
|
int fd = openPort(argv[1]);
|
|
|
|
while (1)
|
|
{
|
|
if (getmyline(fd, buf))
|
|
{
|
|
printf("Cmd:%s\n", buf);
|
|
}
|
|
else { continue; }
|
|
|
|
if (strcmp(buf, ";") == 0)
|
|
{
|
|
pbuf = "?;";
|
|
n = write(fd, pbuf, strlen(pbuf));
|
|
printf("n=%d\n", n);
|
|
}
|
|
else if (strcmp(buf, "RM5;") == 0)
|
|
{
|
|
printf("%s\n", buf);
|
|
hl_usleep(50 * 1000);
|
|
pbuf = "RM5100000;";
|
|
n = write(fd, pbuf, strlen(pbuf));
|
|
printf("n=%d\n", n);
|
|
|
|
if (n <= 0) { perror("RM5"); }
|
|
}
|
|
|
|
if (strcmp(buf, "AN0;") == 0)
|
|
{
|
|
printf("%s\n", buf);
|
|
hl_usleep(50 * 1000);
|
|
pbuf = "AN030;";
|
|
n = write(fd, pbuf, strlen(pbuf));
|
|
printf("n=%d\n", n);
|
|
|
|
if (n <= 0) { perror("AN"); }
|
|
}
|
|
else if (strcmp(buf, "IF;") == 0)
|
|
{
|
|
printf("%s\n", buf);
|
|
hl_usleep(50 * 1000);
|
|
pbuf = "IF059014200000+000000700000;";
|
|
n = write(fd, pbuf, strlen(pbuf));
|
|
printf("n=%d\n", n);
|
|
|
|
if (n <= 0) { perror("IF"); }
|
|
}
|
|
else if (strcmp(buf, "FA;") == 0)
|
|
{
|
|
SNPRINTF(buf, sizeof(buf), "FA%08.0f;", freqA);
|
|
n = write(fd, buf, strlen(buf));
|
|
}
|
|
else if (strncmp(buf, "FA", 2) == 0)
|
|
{
|
|
sscanf(buf, "FA%f", &freqA);
|
|
}
|
|
else if (strcmp(buf, "FB;") == 0)
|
|
{
|
|
SNPRINTF(buf, sizeof(buf), "FB%08.0f;", freqB);
|
|
n = write(fd, buf, strlen(buf));
|
|
}
|
|
else if (strncmp(buf, "FB", 2) == 0)
|
|
{
|
|
sscanf(buf, "FB%f", &freqB);
|
|
}
|
|
else if (strcmp(buf, "ID;") == 0)
|
|
{
|
|
printf("%s\n", buf);
|
|
hl_usleep(50 * 1000);
|
|
int id = NC_RIGID_FTDX3000;
|
|
SNPRINTF(buf, sizeof(buf), "ID%03d;", id);
|
|
n = write(fd, buf, strlen(buf));
|
|
printf("n=%d\n", n);
|
|
|
|
if (n <= 0) { perror("ID"); }
|
|
}
|
|
else if (strcmp(buf, "PS;") == 0)
|
|
{
|
|
SNPRINTF(buf, sizeof(buf), "PS1;");
|
|
n = write(fd, buf, strlen(buf));
|
|
}
|
|
else if (strcmp(buf, "AI;") == 0)
|
|
{
|
|
printf("%s\n", buf);
|
|
hl_usleep(50 * 1000);
|
|
SNPRINTF(buf, sizeof(buf), "AI0;");
|
|
n = write(fd, buf, strlen(buf));
|
|
printf("n=%d\n", n);
|
|
|
|
if (n <= 0) { perror("ID"); }
|
|
}
|
|
else if (strcmp(buf, "AI0;") == 0)
|
|
{
|
|
hl_usleep(50 * 1000);
|
|
}
|
|
else if (strcmp(buf, "FT;") == 0)
|
|
{
|
|
hl_usleep(50 * 1000);
|
|
SNPRINTF(buf, sizeof(buf), "FT%c;", tx_vfo);
|
|
printf(" FT response#1=%s, tx_vfo=%c\n", buf, tx_vfo);
|
|
n = write(fd, buf, strlen(buf));
|
|
printf(" FT response#2=%s\n", buf);
|
|
|
|
if (n < 0) { perror("FT"); }
|
|
}
|
|
else if (strncmp(buf, "FT", 2) == 0)
|
|
{
|
|
tx_vfo = buf[2];
|
|
|
|
if (tx_vfo == '3') { tx_vfo = '1'; }
|
|
else if (tx_vfo == '2') { tx_vfo = '0'; }
|
|
else { perror("Expected 2 or 3"); }
|
|
}
|
|
else if (strcmp(buf, "MD0;") == 0)
|
|
{
|
|
hl_usleep(50 * 1000);
|
|
SNPRINTF(buf, sizeof(buf), "MD0%c;", modeA);
|
|
n = write(fd, buf, strlen(buf));
|
|
|
|
if (n < 0) { perror("MD0;"); }
|
|
}
|
|
else if (strncmp(buf, "MD0", 3) == 0)
|
|
{
|
|
modeA = buf[3];
|
|
}
|
|
else if (strcmp(buf, "MD1;") == 0)
|
|
{
|
|
hl_usleep(50 * 1000);
|
|
SNPRINTF(buf, sizeof(buf), "MD1%c;", modeB);
|
|
n = write(fd, buf, strlen(buf));
|
|
|
|
if (n < 0) { perror("MD0;"); }
|
|
}
|
|
else if (strncmp(buf, "MD1", 3) == 0)
|
|
{
|
|
modeB = buf[3];
|
|
}
|
|
|
|
|
|
|
|
#if 0
|
|
else if (strncmp(buf, "AI", 2) == 0)
|
|
{
|
|
if (strcmp(buf, "AI;"))
|
|
{
|
|
printf("%s\n", buf);
|
|
hl_usleep(50 * 1000);
|
|
n = fprintf(fp, "%s", "AI0;");
|
|
printf("n=%d\n", n);
|
|
|
|
if (n <= 0) { perror("AI"); }
|
|
}
|
|
}
|
|
|
|
#endif
|
|
else if (strcmp(buf, "VS;") == 0)
|
|
{
|
|
printf("%s\n", buf);
|
|
hl_usleep(50 * 1000);
|
|
pbuf = "VS0;";
|
|
n = write(fd, pbuf, strlen(pbuf));
|
|
printf("n=%d\n", n);
|
|
|
|
if (n < 0) { perror("VS"); }
|
|
}
|
|
else if (strcmp(buf, "EX032;") == 0)
|
|
{
|
|
static int ant = 0;
|
|
ant = (ant + 1) % 3;
|
|
printf("%s\n", buf);
|
|
hl_usleep(50 * 1000);
|
|
SNPRINTF(buf, sizeof(buf), "EX032%1d;", ant);
|
|
n = write(fd, buf, strlen(buf));
|
|
printf("n=%d\n", n);
|
|
|
|
if (n < 0) { perror("EX032"); }
|
|
}
|
|
else if (strncmp(buf, "KS;", 3) == 0)
|
|
{
|
|
sprintf(buf,"KS%d;", keyspd);
|
|
n = write(fd, buf, strlen(buf));
|
|
}
|
|
else if (strncmp(buf,"KS",2) == 0)
|
|
{
|
|
sscanf(buf,"KS%03d", &keyspd);
|
|
}
|
|
else if (strncmp(buf, "BS;", 3) == 0) // cannot query BS
|
|
{
|
|
sprintf(buf,"BS%02d;", bandselect);
|
|
n = write(fd, buf, strlen(buf));
|
|
}
|
|
|
|
else if (strlen(buf) > 0)
|
|
{
|
|
fprintf(stderr, "Unknown command: %s\n", buf);
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
}
|