diff --git a/icom/frame.c b/icom/frame.c index 2ffc73a4d..8e7ba0c51 100644 --- a/icom/frame.c +++ b/icom/frame.c @@ -2,7 +2,7 @@ * Hamlib CI-V backend - low level communication routines * Copyright (c) 2000-2003 by Stephane Fillod * - * $Id: frame.c,v 1.23 2003-08-17 22:39:07 fillods Exp $ + * $Id: frame.c,v 1.24 2004-08-21 23:53:38 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -293,10 +293,13 @@ int rig2icom_mode(RIG *rig, rmode_t mode, pbwidth_t width, switch (mode) { case RIG_MODE_AM: icmode = S_AM; break; + case RIG_MODE_AMS: icmode = S_AMS; break; case RIG_MODE_CW: icmode = S_CW; break; + case RIG_MODE_CWR: icmode = S_CWR; break; case RIG_MODE_USB: icmode = S_USB; break; case RIG_MODE_LSB: icmode = S_LSB; break; case RIG_MODE_RTTY: icmode = S_RTTY; break; + case RIG_MODE_RTTYR:icmode = S_RTTYR; break; case RIG_MODE_FM: icmode = S_FM; break; case RIG_MODE_WFM: icmode = S_WFM; break; default: @@ -335,7 +338,9 @@ void icom2rig_mode(RIG *rig, unsigned char md, int pd, rmode_t *mode, pbwidth_t switch (md) { case S_AM: *mode = RIG_MODE_AM; break; + case S_AMS: *mode = RIG_MODE_AMS; break; case S_CW: *mode = RIG_MODE_CW; break; + case S_CWR: *mode = RIG_MODE_CWR; break; case S_FM: if (rig->caps->rig_model == RIG_MODEL_ICR7000 && pd == 0x00) { *mode = RIG_MODE_USB; @@ -348,6 +353,7 @@ void icom2rig_mode(RIG *rig, unsigned char md, int pd, rmode_t *mode, pbwidth_t case S_USB: *mode = RIG_MODE_USB; break; case S_LSB: *mode = RIG_MODE_LSB; break; case S_RTTY: *mode = RIG_MODE_RTTY; break; + case S_RTTYR: *mode = RIG_MODE_RTTYR; break; case 0xff: *mode = RIG_MODE_NONE; break; /* blank mem channel */ default: @@ -355,6 +361,11 @@ void icom2rig_mode(RIG *rig, unsigned char md, int pd, rmode_t *mode, pbwidth_t md); *mode = RIG_MODE_NONE; } + + /* IC-R75 returns passband indexes 1-wide, 2-normal,3-narrow */ + if (rig->caps->rig_model == RIG_MODEL_ICR75) + pd = 3-pd; + switch (pd) { case 0x00: *width = rig_passband_narrow(rig, *mode); break; case 0x01: *width = rig_passband_normal(rig, *mode); break; diff --git a/icom/icom.c b/icom/icom.c index b58c152c4..2ee1eac41 100644 --- a/icom/icom.c +++ b/icom/icom.c @@ -2,7 +2,7 @@ * Hamlib CI-V backend - main file * Copyright (c) 2000-2004 by Stephane Fillod * - * $Id: icom.c,v 1.86 2004-05-18 06:55:05 fillods Exp $ + * $Id: icom.c,v 1.87 2004-08-21 23:53:39 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -608,6 +608,26 @@ int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) else icom_val = val.i; + /* convert values to 0 .. 255 range */ + if (rig->caps->rig_model == RIG_MODEL_ICR75) { + switch (level) { + case RIG_LEVEL_NR: + icom_val = val.f * 240; + break; + case RIG_LEVEL_CWPITCH: + icom_val = ((float)val.i - 300.0) / 600.0 * 255; + break; + case RIG_LEVEL_PBT_IN: + case RIG_LEVEL_PBT_OUT: + icom_val = (val.f / 10.0) + 128; + if (icom_val > 255) + icom_val = 255; + break; + default: + break; + } + } + /* * Most of the time, the data field is a 3 digit BCD, * but in *big endian* order: 0000..0255 @@ -704,6 +724,10 @@ int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) case RIG_LEVEL_AGC: lvl_cn = C_CTL_FUNC; lvl_sc = S_FUNC_AGC; + if (rig->caps->rig_model == RIG_MODEL_ICR75) { + lvl_len = 1; + lvlbuf[0] = val.i; + } break; case RIG_LEVEL_BKINDL: lvl_cn = C_CTL_LVL; @@ -767,6 +791,7 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) * sort the switch cases with the most frequent first */ switch (level) { + case RIG_LEVEL_STRENGTH: case RIG_LEVEL_RAWSTR: lvl_cn = C_RD_SQSM; lvl_sc = S_SML; @@ -775,7 +800,6 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) lvl_cn = C_RD_SQSM; lvl_sc = S_SQL; break; - case RIG_LEVEL_PREAMP: lvl_cn = C_CTL_FUNC; lvl_sc = S_FUNC_PAMP; @@ -892,18 +916,19 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) */ icom_val = from_bcd_be(lvlbuf+cmdhead, lvl_len*2); - switch (level) { case RIG_LEVEL_RAWSTR: val->i = icom_val; break; + case RIG_LEVEL_STRENGTH: + val->i = (int)rig_raw2val(icom_val,&rig->caps->str_cal); + break; case RIG_LEVEL_SQLSTAT: /* * 0x00=sql closed, 0x01=sql open */ val->i = icom_val; break; - case RIG_LEVEL_PREAMP: if (icom_val == 0) { val->i = 0; @@ -924,6 +949,27 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) val->i = icom_val; } + /* convert values from 0 .. 255 range */ + if (rig->caps->rig_model == RIG_MODEL_ICR75) { + switch (level) { + case RIG_LEVEL_NR: + val->f = (float)icom_val / 240; + break; + case RIG_LEVEL_CWPITCH: + val->i = ((float)icom_val / 255.0 * 600.0) + 300.0; + break; + case RIG_LEVEL_PBT_IN: + case RIG_LEVEL_PBT_OUT: + if (icom_val == 255) + val->f = 1280.0; + else + val->f = (float)(icom_val - 128) * 10.0; + break; + default: + break; + } + } + rig_debug(RIG_DEBUG_TRACE,"icom_get_level: %d %d %d %f\n", lvl_len, icom_val, val->i, val->f); @@ -1837,6 +1883,185 @@ int icom_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) return RIG_OK; } +/* + * icom_set_parm + * Assumes rig!=NULL + */ +int icom_set_parm(RIG *rig, setting_t parm, value_t val) +{ + unsigned char prmbuf[MAXFRAMELEN], ackbuf[MAXFRAMELEN]; + int ack_len, prm_len; + int prm_cn, prm_sc; + int icom_val; + int retval; + int min,hr,sec; + + switch (parm) { + case RIG_PARM_ANN: + if ((val.i == RIG_ANN_FREQ) || (val.i == RIG_ANN_RXMODE)) { + prm_cn = C_CTL_ANN; + prm_sc = val.i; + prm_len = 0; + } + else { + if ((val.i == RIG_ANN_ENG)||(val.i == RIG_ANN_JAP)) { + prm_cn = C_CTL_MEM; + prm_sc = S_MEM_MODE_SLCT; + prm_len = 2; + prmbuf[0] = S_PRM_LANG; + prmbuf[1] = (val.i == RIG_ANN_ENG ? 0 : 1); + } + else { + rig_debug(RIG_DEBUG_ERR,"Unsupported set_parm_ann %d\n", val.i); + return -RIG_EINVAL; + } + } + break; + case RIG_PARM_APO: + prm_cn = C_CTL_MEM; + prm_sc = S_MEM_MODE_SLCT; + hr = (float)val.i/60.0; + min = val.i - (hr*60); + prm_len = 3; + prmbuf[0] = S_PRM_SLPTM; + to_bcd_be(prmbuf+1, (long long)hr, 2); + to_bcd_be(prmbuf+2, (long long)min, 2); + break; + case RIG_PARM_BACKLIGHT: + prm_cn = C_CTL_MEM; + prm_sc = S_MEM_MODE_SLCT; + icom_val = val.f * 255; + prm_len = 3; + prmbuf[0] = S_PRM_BACKLT; + to_bcd_be(prmbuf+1, (long long)icom_val, (prm_len-1)*2); + break; + case RIG_PARM_BEEP: + prm_cn = C_CTL_MEM; + prm_sc = S_MEM_MODE_SLCT; + prm_len = 2; + prmbuf[0] = S_PRM_BEEP; + prmbuf[1] = val.i; + break; + case RIG_PARM_TIME: + prm_cn = C_CTL_MEM; + prm_sc = S_MEM_MODE_SLCT; + hr = (float)val.i/3600.0; + min = (float)(val.i - (hr*3600))/60.0; + sec = (val.i - (hr*3600) - (min*60)); + prm_len = 4; + prmbuf[0] = S_PRM_TIME; + to_bcd_be(prmbuf+1, (long long)hr, 2); + to_bcd_be(prmbuf+2, (long long)min, 2); + to_bcd_be(prmbuf+3, (long long)sec, 2); + break; + default: + rig_debug(RIG_DEBUG_ERR,"Unsupported set_parm %d\n", parm); + return -RIG_EINVAL; + } + + retval = icom_transaction(rig, prm_cn, prm_sc, prmbuf, prm_len, + ackbuf, &ack_len); + if (retval != RIG_OK) + return retval; + + if (ack_len != 1) { + rig_debug(RIG_DEBUG_ERR,"icom_set_parm: wrong frame len=%d\n", + ack_len); + return -RIG_EPROTO; + } + + return RIG_OK; +} + +/* + * icom_get_parm + * Assumes rig!=NULL + */ +int icom_get_parm(RIG *rig, setting_t parm, value_t *val) +{ + unsigned char prmbuf[MAXFRAMELEN], resbuf[MAXFRAMELEN]; + int prm_len, res_len; + int prm_cn, prm_sc; + int icom_val; + int cmdhead; + int retval; + int min,hr,sec; + + switch (parm) { + case RIG_PARM_APO: + prm_cn = C_CTL_MEM; + prm_sc = S_MEM_MODE_SLCT; + prm_len = 1; + prmbuf[0] = S_PRM_SLPTM; + break; + case RIG_PARM_BACKLIGHT: + prm_cn = C_CTL_MEM; + prm_sc = S_MEM_MODE_SLCT; + prm_len = 1; + prmbuf[0] = S_PRM_BACKLT; + break; + case RIG_PARM_BEEP: + prm_cn = C_CTL_MEM; + prm_sc = S_MEM_MODE_SLCT; + prm_len = 1; + prmbuf[0] = S_PRM_BEEP; + break; + case RIG_PARM_TIME: + prm_cn = C_CTL_MEM; + prm_sc = S_MEM_MODE_SLCT; + prm_len = 1; + prmbuf[0] = S_PRM_TIME; + break; + default: + rig_debug(RIG_DEBUG_ERR,"Unsupported get_parm %d", parm); + return -RIG_EINVAL; + } + + retval = icom_transaction (rig, prm_cn, prm_sc, prmbuf, prm_len, + resbuf, &res_len); + if (retval != RIG_OK) + return retval; + + /* + * strbuf should contain Cn,Sc,[pn],Data area + */ + cmdhead = (prm_sc == -1) ? 1:3; + res_len -= cmdhead; + + if (resbuf[0] != ACK && resbuf[0] != prm_cn) { + rig_debug(RIG_DEBUG_ERR,"icom_get_level: ack NG (%#.2x), " + "len=%d\n", resbuf[0],res_len); + return -RIG_ERJCTED; + } + + switch (parm) { + case RIG_PARM_APO: + hr = from_bcd_be(resbuf+cmdhead, 2); + min = from_bcd_be(resbuf+cmdhead+1, 2); + icom_val = (hr*60)+min; + val->i = icom_val; + break; + case RIG_PARM_TIME: + hr = from_bcd_be(resbuf+cmdhead, 2); + min = from_bcd_be(resbuf+cmdhead+1, 2); + sec = from_bcd_be(resbuf+cmdhead+2, 2); + icom_val = (hr*3600)+(min*60)+sec; + val->i = icom_val; + break; + default: + icom_val = from_bcd_be(resbuf+cmdhead, res_len*2); + if (RIG_PARM_IS_FLOAT(parm)) + val->f = (float)icom_val/255; + else + val->i = icom_val; + } + + rig_debug(RIG_DEBUG_TRACE,"icom_get_parm: %d %d %d %f\n", res_len, + icom_val, val->i, val->f); + + return RIG_OK; +} + /* * icom_set_ctcss_tone * Assumes rig!=NULL, rig->state.priv!=NULL @@ -2054,6 +2279,19 @@ int icom_get_powerstat(RIG *rig, powerstat_t *status) unsigned char ackbuf[MAXFRAMELEN]; int ack_len, retval; + /* r75 has no way to get power status, so fake it */ + if (rig->caps->rig_model == RIG_MODEL_ICR75) { + retval = icom_transaction(rig, C_RD_MODE, -1, NULL, 0, + ackbuf, &ack_len); + if (retval != RIG_OK) + return retval; + + *status = ((ack_len == 3)&&(ackbuf[0] == C_RD_MODE)) ? + RIG_POWER_ON : RIG_POWER_OFF; + + return RIG_OK; + } + retval = icom_transaction(rig, C_SET_PWR, -1, NULL, 0, ackbuf, &ack_len); if (retval != RIG_OK) @@ -2144,6 +2382,7 @@ int icom_set_ant(RIG * rig, vfo_t vfo, ant_t ant) unsigned char antarg; unsigned char ackbuf[MAXFRAMELEN]; int ack_len, retval, i_ant; + int ant_len; rs = &rig->state; priv = (struct icom_priv_data*)rs->priv; @@ -2154,8 +2393,9 @@ int icom_set_ant(RIG * rig, vfo_t vfo, ant_t ant) i_ant = ant == RIG_ANT_1 ? 0: 1; antarg = 0; + ant_len = (rig->caps->rig_model == RIG_MODEL_ICR75) ? 0 : 1; retval = icom_transaction (rig, C_CTL_ANT, i_ant, - &antarg, 1, ackbuf, &ack_len); + &antarg, ant_len, ackbuf, &ack_len); if (retval != RIG_OK) return retval; @@ -2182,6 +2422,14 @@ int icom_get_ant(RIG *rig, vfo_t vfo, ant_t *ant) if (retval != RIG_OK) return retval; + if (rig->caps->rig_model == RIG_MODEL_ICR75) { + if (ack_len != 2 || ackbuf[0] != C_CTL_ANT) { + rig_debug(RIG_DEBUG_ERR,"icom_get_ant: ack NG (%#.2x), " + "len=%d\n", ackbuf[0],ack_len); + return -RIG_ERJCTED; + } + } + else if (ack_len != 1 || ackbuf[0] != ACK) { rig_debug(RIG_DEBUG_ERR,"icom_get_ant: ack NG (%#.2x), " "len=%d\n", ackbuf[0],ack_len); diff --git a/icom/icom.h b/icom/icom.h index b53769264..0ba4d33f9 100644 --- a/icom/icom.h +++ b/icom/icom.h @@ -2,7 +2,7 @@ * Hamlib CI-V backend - main header * Copyright (c) 2000-2004 by Stephane Fillod * - * $Id: icom.h,v 1.67 2004-08-16 20:57:37 fillods Exp $ + * $Id: icom.h,v 1.68 2004-08-21 23:53:39 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -147,6 +147,8 @@ int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val); int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val); int icom_set_func(RIG *rig, vfo_t vfo, setting_t func, int status); int icom_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status); +int icom_set_parm(RIG *rig, setting_t parm, value_t val); +int icom_get_parm(RIG *rig, setting_t parm, value_t *val); int icom_set_conf(RIG *rig, token_t token, const char *val); int icom_get_conf(RIG *rig, token_t token, char *val); int icom_set_powerstat(RIG *rig, powerstat_t status); diff --git a/icom/icom_defs.h b/icom/icom_defs.h index 989e86f12..873d2418b 100644 --- a/icom/icom_defs.h +++ b/icom/icom_defs.h @@ -2,7 +2,7 @@ * Hamlib CI-V backend - defines for the ICOM "CI-V" interface. * Copyright (c) 2000-2002 by Stephane Fillod * - * $Id: icom_defs.h,v 1.14 2002-03-10 23:39:35 fillods Exp $ + * $Id: icom_defs.h,v 1.15 2004-08-21 23:53:39 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -102,6 +102,9 @@ #define S_RTTY 0x04 /* Set to RTTY */ #define S_FM 0x05 /* Set to FM */ #define S_WFM 0x06 /* Set to Wide FM */ +#define S_CWR 0x07 /* Set to CW Reverse */ +#define S_RTTYR 0x08 /* Set to RTTY Reverse */ +#define S_AMS 0x11 /* Set to AMS */ #define S_R7000_SSB 0x05 /* Set to SSB on R-7000 */ #define PD_WIDE 0x01 /* Wide */ @@ -141,6 +144,8 @@ #define S_SCAN_SLCTN 0x23 /* Selected number memory scan */ #define S_SCAN_SLCTM 0x24 /* Selected mode memory scan */ #define S_SCAN_PRIO 0x42 /* Priority / window scan */ +#define S_SCAN_NSLCT 0xB0 /* Set as non select channel */ +#define S_SCAN_SLCT 0xB1 /* Set as select channel */ #define S_SCAN_RSMOFF 0xD0 /* Set scan resume OFF */ #define S_SCAN_RSMON 0xD3 /* Set scan resume ON */ @@ -260,6 +265,8 @@ */ #define S_MEM_CNTNT 0x00 #define S_MEM_CNTNT_SLCT 0x01 +#define S_MEM_FILT_SLCT 0x01 +#define S_MEM_MODE_SLCT 0x02 /* For IC-910H rig. */ #define S_MEM_RDWR_MEM 0x00 /* Read/write memory channel */ #define S_MEM_SATMEM 0x01 /* Satellite memory */ @@ -302,4 +309,14 @@ #define S_OPTO_SCON 0x0f #define S_OPTO_SCOFF 0x10 +/* + * C_CTL_MODE Misc CI-V Mode settings + */ +#define S_PRM_BEEP 0x02 +#define S_PRM_LANG 0x15 +#define S_PRM_BACKLT 0x21 +#define S_PRM_SLEEP 0x32 +#define S_PRM_SLPTM 0x33 +#define S_PRM_TIME 0x27 + #endif /* _ICOM_DEFS_H */ diff --git a/icom/icr75.c b/icom/icr75.c index 45422d46f..e62302e12 100644 --- a/icom/icr75.c +++ b/icom/icr75.c @@ -1,8 +1,8 @@ /* * Hamlib CI-V backend - description of IC-R75 - * Copyright (c) 2000-2003 by Stephane Fillod + * Copyright (c) 2000-2004 by Stephane Fillod * - * $Id: icr75.c,v 1.2 2003-12-08 08:33:58 fillods Exp $ + * $Id: icr75.c,v 1.3 2004-08-21 23:53:39 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -44,26 +44,39 @@ * - set_parm, set_trn, IF filter setting, etc. */ -#define ICR75_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_SSB|RIG_MODE_FM|RIG_MODE_RTTY|RIG_MODE_AMS) +#define ICR75_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_FM|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_AMS) -#define ICR75_FUNC_ALL (RIG_FUNC_NB|RIG_FUNC_NR|RIG_FUNC_ANF|RIG_FUNC_APF) +#define ICR75_FUNC_ALL (RIG_FUNC_NB|RIG_FUNC_ANF|RIG_FUNC_NR) -#define ICR75_LEVEL_ALL (RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_NOTCHF|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR) +#define ICR75_LEVEL_ALL (RIG_LEVEL_ATT|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_SQL|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_PREAMP|RIG_LEVEL_AGC|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH) -#define ICR75_VFO_ALL (RIG_VFO_A) +#define ICR75_PARM_ALL (RIG_PARM_ANN|RIG_PARM_APO|RIG_PARM_BACKLIGHT|RIG_PARM_BEEP|RIG_PARM_TIME) + +#define ICR75_VFO_ALL (RIG_VFO_VFO|RIG_VFO_MEM) #define ICR75_VFO_OPS (RIG_OP_FROM_VFO|RIG_OP_TO_VFO|RIG_OP_MCL) #define ICR75_SCAN_OPS (RIG_SCAN_MEM|RIG_SCAN_VFO) #define ICR75_ANTS (RIG_ANT_1|RIG_ANT_2) -/* - * FIXME: S-meter measurement - */ -#define ICR75_STR_CAL { 2, \ - { \ - { 0, -60 }, /* S0 */ \ - { 255, 60 } /* +60 */ \ +#define ICR75_STR_CAL { 17, { \ + { 0, -60 }, \ + { 37, -54 }, \ + { 52, -48 }, \ + { 61, -42 }, \ + { 72, -36 }, \ + { 86, -30 }, \ + { 95, -24 }, \ + { 109, -18 }, \ + { 124, -12 }, \ + { 128, -6 }, \ + { 146, 0 }, \ + { 166, 10 }, \ + { 186, 20 }, \ + { 199, 30 }, \ + { 225, 40 }, \ + { 233, 50 }, \ + { 255, 60 }, \ } } /* @@ -92,9 +105,9 @@ const struct rig_caps icr75_caps = { .rig_model = RIG_MODEL_ICR75, .model_name = "IC-R75", .mfg_name = "Icom", -.version = "0.2", +.version = "0.3", .copyright = "LGPL", -.status = RIG_STATUS_UNTESTED, +.status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_RECEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_RIG, @@ -106,19 +119,25 @@ const struct rig_caps icr75_caps = { .serial_parity = RIG_PARITY_NONE, .serial_handshake = RIG_HANDSHAKE_NONE, .write_delay = 0, -.post_write_delay = 0, +.post_write_delay = 1, .timeout = 200, .retry = 3, .has_get_func = ICR75_FUNC_ALL, .has_set_func = ICR75_FUNC_ALL, .has_get_level = ICR75_LEVEL_ALL, .has_set_level = RIG_LEVEL_SET(ICR75_LEVEL_ALL), -.has_get_parm = RIG_PARM_ANN, -.has_set_parm = RIG_PARM_ANN, /* FIXME: parms */ +.has_get_parm = ICR75_PARM_ALL, +.has_set_parm = RIG_PARM_SET(ICR75_PARM_ALL), .level_gran = { [LVL_RAWSTR] = { .min = { .i = 0 }, .max = { .i = 255 } }, + [LVL_PBT_IN] = { .min = { .f = -1280 }, .max = { .f = +1280 } }, + [LVL_PBT_OUT] = { .min = { .f = -1280 }, .max = { .f = +1280 } }, + [LVL_CWPITCH] = { .min = { .i = 300 }, .max = { .i = 900 } }, +}, +.parm_gran = { + [PARM_APO] = { .min = { .i = 1 }, .max = { .i = 1439} }, + [PARM_TIME] = { .min = { .i = 0 }, .max = { .i = 86399} }, }, -.parm_gran = {}, .ctcss_list = NULL, .dcs_list = NULL, .preamp = { 20, RIG_DBLST_END, }, /* TBC */ @@ -166,8 +185,12 @@ const struct rig_caps icr75_caps = { }, /* mode/filter list, remember: order matters! */ .filters = { - {RIG_MODE_SSB|RIG_MODE_CW|RIG_MODE_RTTY, kHz(2.4)}, + {RIG_MODE_SSB|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_RTTY|RIG_MODE_RTTYR, kHz(2.4)}, + {RIG_MODE_SSB|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_RTTY|RIG_MODE_RTTYR, kHz(1.9)}, + {RIG_MODE_SSB|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_RTTY|RIG_MODE_RTTYR, kHz(6)}, {RIG_MODE_AM|RIG_MODE_AMS, kHz(6)}, + {RIG_MODE_AM|RIG_MODE_AMS, kHz(2.4)}, + {RIG_MODE_AM|RIG_MODE_AMS, kHz(15)}, {RIG_MODE_FM, kHz(15)}, RIG_FLT_END, }, @@ -196,12 +219,14 @@ const struct rig_caps icr75_caps = { .get_func = icom_get_func, .set_level = icom_set_level, .get_level = icom_get_level, +.set_parm = icom_set_parm, +.get_parm = icom_get_parm, .get_dcd = icom_get_dcd, .set_mem = icom_set_mem, .vfo_op = icom_vfo_op, .scan = icom_scan, .set_ts = icom_set_ts, -.get_ts = icom_get_ts, +/*.get_ts = icom_get_ts,*/ .set_powerstat = icom_set_powerstat, .get_powerstat = icom_get_powerstat,