kopia lustrzana https://github.com/Hamlib/Hamlib
				
				
				
			* more CI-V addresses, RIG_MODEL_IC820 still missing
* Added icom_[sg]et_channel (untested, not complete) * Added icom_[sg]et_level (30% implemented, get_strength tested and OK) git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@226 7ae35d74-ebe9-4afe-98af-79ac388436b8Hamlib-1.1.0
							rodzic
							
								
									5ebf14a76a
								
							
						
					
					
						commit
						64dee174a5
					
				
							
								
								
									
										278
									
								
								icom/icom.c
								
								
								
								
							
							
						
						
									
										278
									
								
								icom/icom.c
								
								
								
								
							|  | @ -6,7 +6,7 @@ | |||
|  * via serial interface to an ICOM using the "CI-V" interface. | ||||
|  * | ||||
|  * | ||||
|  * $Id: icom.c,v 1.6 2000-10-10 21:58:31 f4cfe Exp $   | ||||
|  * $Id: icom.c,v 1.7 2000-10-16 22:34:22 f4cfe Exp $   | ||||
|  * | ||||
|  * | ||||
|  * | ||||
|  | @ -145,46 +145,46 @@ static const struct icom_addr icom_addr_list[] = { | |||
| 		{ RIG_MODEL_IC706, 0x48 }, | ||||
| 		{ RIG_MODEL_IC706MKII, 0x4e }, | ||||
| 		{ RIG_MODEL_IC706MKIIG, 0x58 }, | ||||
| 		{ RIG_MODEL_IC1271, 0x24 }, | ||||
| 		{ RIG_MODEL_IC1275, 0x18 }, | ||||
| 		{ RIG_MODEL_IC271, 0x20 }, | ||||
| 		{ RIG_MODEL_IC275, 0x10 }, | ||||
| 		{ RIG_MODEL_IC375, 0x12 }, | ||||
| 		{ RIG_MODEL_IC471, 0x22 }, | ||||
| 		{ RIG_MODEL_IC475, 0x14 }, | ||||
| 		{ RIG_MODEL_IC575, 0x16 }, | ||||
| 		{ RIG_MODEL_IC707, 0x3e }, | ||||
| 		{ RIG_MODEL_IC725, 0x28 }, | ||||
| 		{ RIG_MODEL_IC726, 0x30 }, | ||||
| 		{ RIG_MODEL_IC728, 0x38 }, | ||||
| 		{ RIG_MODEL_IC729, 0x3a }, | ||||
| 		{ RIG_MODEL_IC731, 0x04 }, | ||||
| 		{ RIG_MODEL_IC735, 0x04 }, | ||||
| 		{ RIG_MODEL_IC736, 0x40 }, | ||||
| 		{ RIG_MODEL_IC746, 0x56 }, | ||||
| 		{ RIG_MODEL_IC737, 0x3c }, | ||||
| 		{ RIG_MODEL_IC738, 0x44 }, | ||||
| 		{ RIG_MODEL_IC751, 0x1c }, | ||||
| 		{ RIG_MODEL_IC751A, 0x1c }, | ||||
| 		{ RIG_MODEL_IC756, 0x50 }, | ||||
| 		{ RIG_MODEL_IC756PRO, 0x5c }, | ||||
| 		{ RIG_MODEL_IC761, 0x1e }, | ||||
| 		{ RIG_MODEL_IC765, 0x2c }, | ||||
| 		{ RIG_MODEL_IC775, 0x46 }, | ||||
| 		{ RIG_MODEL_IC781, 0x26 }, | ||||
| 		{ RIG_MODEL_IC820, 0x42 }, | ||||
| 		{ RIG_MODEL_IC821, 0x4c }, | ||||
| 		{ RIG_MODEL_IC821H, 0x4c }, | ||||
| 		{ RIG_MODEL_IC970, 0x2e }, | ||||
| 		{ RIG_MODEL_ICR7000, 0x08 }, | ||||
| 		{ RIG_MODEL_IC1271, 0x24 }, | ||||
| 		{ RIG_MODEL_IC1275, 0x18 }, | ||||
| 		{ RIG_MODEL_ICR71, 0x1a }, | ||||
| 		{ RIG_MODEL_ICR7100, 0x34 }, | ||||
| 		{ RIG_MODEL_ICR72, 0x32 }, | ||||
| 		{ RIG_MODEL_ICR75, 0x5a }, | ||||
| 		{ RIG_MODEL_ICR7000, 0x08 }, | ||||
| 		{ RIG_MODEL_ICR7100, 0x34 }, | ||||
| 		{ RIG_MODEL_ICR8500, 0x4a }, | ||||
| 		{ RIG_MODEL_ICR9000, 0x2a }, | ||||
| 		{ RIG_MODEL_ICR75, UNKNOWN_ADDR }, | ||||
| 		{ RIG_MODEL_IC707, UNKNOWN_ADDR }, | ||||
| 		{ RIG_MODEL_MINISCOUT, 0x94 }, | ||||
| 		{ RIG_MODEL_IC718, UNKNOWN_ADDR }, | ||||
| 		{ RIG_MODEL_IC728, UNKNOWN_ADDR }, | ||||
| 		{ RIG_MODEL_IC729, UNKNOWN_ADDR }, | ||||
| 		{ RIG_MODEL_IC731, UNKNOWN_ADDR }, | ||||
| 		{ RIG_MODEL_IC736, UNKNOWN_ADDR }, | ||||
| 		{ RIG_MODEL_IC737, UNKNOWN_ADDR }, | ||||
| 		{ RIG_MODEL_IC738, UNKNOWN_ADDR }, | ||||
| 		{ RIG_MODEL_IC746, UNKNOWN_ADDR }, | ||||
| 		{ RIG_MODEL_IC756PRO, UNKNOWN_ADDR }, | ||||
| 		{ RIG_MODEL_IC820, UNKNOWN_ADDR }, | ||||
| 		{ -1, 0 }, | ||||
| }; | ||||
| 
 | ||||
|  | @ -434,41 +434,161 @@ int icom_set_vfo(RIG *rig, vfo_t vfo) | |||
| 
 | ||||
| /*
 | ||||
|  * icom_get_strength | ||||
|  * Assumes rig!=NULL, rig->state.priv!=NULL, freq!=NULL | ||||
|  * Assumes rig!=NULL, rig->state.priv!=NULL | ||||
|  */ | ||||
| int icom_get_strength(RIG *rig, int *strength) | ||||
| int icom_set_level(RIG *rig, setting_t set, value_t val) | ||||
| { | ||||
| 			return -RIG_ENIMPL; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * icom_get_strength | ||||
|  * Assumes rig!=NULL, rig->state.priv!=NULL, val!=NULL | ||||
|  */ | ||||
| int icom_get_level(RIG *rig, setting_t set, value_t *val) | ||||
| { | ||||
| 		struct icom_priv_data *priv; | ||||
| 		struct rig_state *rig_s; | ||||
| 		unsigned char strbuf[16]; | ||||
| 		int str_len; | ||||
| 		float str; | ||||
| 		unsigned char lvlbuf[16]; | ||||
| 		int lvl_len; | ||||
| 		int lvl_cn, lvl_sc;		/* Command Number, Subcommand */ | ||||
| 		int icom_val; | ||||
| 
 | ||||
| 		rig_s = &rig->state; | ||||
| 		priv = (struct icom_priv_data*)rig_s->priv; | ||||
| 
 | ||||
| 		icom_transaction (rig, C_RD_SQSM, S_SML, NULL, 0, strbuf, &str_len); | ||||
| 
 | ||||
| 		switch (set) { | ||||
| 		case RIG_LEVEL_PREAMP: | ||||
| 			lvl_cn = C_CTL_FUNC; | ||||
| 			lvl_sc = S_FUNC_PAMP; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_ATT: | ||||
| 			lvl_cn = C_CTL_ATT; | ||||
| 			lvl_sc = -1; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_ANT: | ||||
| 			lvl_cn = C_CTL_ANT; | ||||
| 			lvl_sc = -1; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_AF: | ||||
| 			lvl_cn = C_CTL_LVL; | ||||
| 			lvl_sc = S_LVL_AF; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_RF: | ||||
| 			lvl_cn = C_CTL_LVL; | ||||
| 			lvl_sc = S_LVL_RF; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_SQL: | ||||
| 			lvl_cn = C_CTL_LVL; | ||||
| 			lvl_sc = S_LVL_SQL; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_IF: | ||||
| 			lvl_cn = C_CTL_LVL; | ||||
| 			lvl_sc = S_LVL_IF; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_APF: | ||||
| 			lvl_cn = C_CTL_LVL; | ||||
| 			lvl_sc = S_LVL_APF; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_NR: | ||||
| 			lvl_cn = C_CTL_LVL; | ||||
| 			lvl_sc = S_LVL_NR; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_PBT_IN: | ||||
| 			lvl_cn = C_CTL_LVL; | ||||
| 			lvl_sc = S_LVL_PBTIN; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_PBT_OUT: | ||||
| 			lvl_cn = C_CTL_LVL; | ||||
| 			lvl_sc = S_LVL_PBTOUT; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_CWPITCH: | ||||
| 			lvl_cn = C_CTL_LVL; | ||||
| 			lvl_sc = S_LVL_CWPITCH; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_RFPOWER: | ||||
| 			lvl_cn = C_CTL_LVL; | ||||
| 			lvl_sc = S_LVL_RFPOWER; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_MICGAIN: | ||||
| 			lvl_cn = C_CTL_LVL; | ||||
| 			lvl_sc = S_LVL_MICGAIN; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_KEYSPD: | ||||
| 			lvl_cn = C_CTL_LVL; | ||||
| 			lvl_sc = S_LVL_KEYSPD; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_NOTCHF: | ||||
| 			lvl_cn = C_CTL_LVL; | ||||
| 			lvl_sc = S_LVL_NOTCHF; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_COMP: | ||||
| 			lvl_cn = C_CTL_LVL; | ||||
| 			lvl_sc = S_LVL_COMP; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_AGC: | ||||
| 			lvl_cn = C_CTL_FUNC; | ||||
| 			lvl_sc = S_FUNC_AGC; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_BKINDL: | ||||
| 			lvl_cn = C_CTL_LVL; | ||||
| 			lvl_sc = S_LVL_BKINDL; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_BALANCE: | ||||
| 			lvl_cn = C_CTL_LVL; | ||||
| 			lvl_sc = S_LVL_BALANCE; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_ANN: | ||||
| 			lvl_cn = C_CTL_ANN; | ||||
| 			lvl_sc = -1; | ||||
| 			break; | ||||
| 
 | ||||
| 		case RIG_LEVEL_SQLSTAT: | ||||
| 			lvl_cn = C_RD_SQSM; | ||||
| 			lvl_sc = S_SQL; | ||||
| 			break; | ||||
| 		case RIG_LEVEL_STRENGTH: | ||||
| 			lvl_cn = C_RD_SQSM; | ||||
| 			lvl_sc = S_SML; | ||||
| 			break; | ||||
| 		default: | ||||
| 			rig_debug(RIG_DEBUG_ERR,"Unsupported get level %d", set); | ||||
| 			return -RIG_EINVAL; | ||||
| 		} | ||||
| 
 | ||||
| 		icom_transaction (rig, lvl_cn, lvl_sc, NULL, 0, lvlbuf, &lvl_len); | ||||
| 
 | ||||
| 		/*
 | ||||
| 		 * strbuf should contain Cn,Sc,Data area | ||||
| 		 */ | ||||
| 		str_len-=2; | ||||
| 		if (str_len != 2) { | ||||
| 				rig_debug(RIG_DEBUG_ERR,"icom_get_strength: wrong frame len=%d\n", | ||||
| 								str_len); | ||||
| 		lvl_len-=2; | ||||
| #if 0 | ||||
| 		if (lvl_len != 2) { | ||||
| 				rig_debug(RIG_DEBUG_ERR,"icom_get_level: wrong frame len=%d\n", | ||||
| 								lvl_len); | ||||
| 				return -RIG_EPROTO; | ||||
| 		} | ||||
| #endif | ||||
| 
 | ||||
| 		/*	
 | ||||
| 		 * The result is a 3 digit BCD, but in *big endian* order: 0000..0255 | ||||
| 		 * (from_bcd is little endian) | ||||
| 		 */ | ||||
| 		str = (strbuf[2]&0x0f)*100+ (strbuf[3]>>4)*10 + (strbuf[3]&0x0f); | ||||
| #ifndef DONT_WANT_STR_DB | ||||
| 		/* translate it to dBs */ | ||||
| 		str = (str-47)*114/(223-47); | ||||
| 		icom_val = from_bcd_be(lvlbuf+2, lvl_len*2); | ||||
| 
 | ||||
| #define STR_FLOOR 44.0 | ||||
| #define STR_CEILING 223.0 | ||||
| #define STR_MAX 114.0	/* S9+60db */ | ||||
| #ifndef max | ||||
| #define max(a,b) ((a)>(b)?(a):(b)) | ||||
| #endif | ||||
| 		*strength = rint(str); | ||||
| 		/* translate to db */ | ||||
| 		if (set == RIG_LEVEL_STRENGTH) | ||||
| 			val->i = rint(STR_MAX/(STR_CEILING-STR_FLOOR)*max(icom_val-STR_FLOOR,0)); | ||||
| 		else | ||||
| 			val->i = icom_val; | ||||
| 		rig_debug(RIG_DEBUG_VERBOSE,"%d %d %d\n",lvl_len,icom_val,val->i); | ||||
| 
 | ||||
| 		return RIG_OK; | ||||
| } | ||||
|  | @ -692,6 +812,102 @@ int icom_get_ts(RIG *rig, unsigned long *ts) | |||
| 		return RIG_OK; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * icom_set_channel | ||||
|  * Assumes rig!=NULL, rig->state.priv!=NULL, chan!=NULL | ||||
|  */ | ||||
| int icom_set_channel(RIG *rig, const channel_t *chan) | ||||
| { | ||||
| 		struct icom_priv_data *priv; | ||||
| 		struct rig_state *rig_s; | ||||
| 		unsigned char chanbuf[24], ackbuf[16]; | ||||
| 		int chan_len,freq_len,ack_len; | ||||
| 		int icmode; | ||||
| 
 | ||||
| 		rig_s = &rig->state; | ||||
| 		priv = (struct icom_priv_data*)rig_s->priv; | ||||
| 
 | ||||
| 		to_bcd_be(chanbuf,chan->channel_num,4); | ||||
| 
 | ||||
| 		chanbuf[2] = S_MEM_CNTNT_SLCT; | ||||
| 
 | ||||
| 		freq_len = priv->civ_731_mode ? 4:5; | ||||
| 		/*	
 | ||||
| 		 * to_bcd requires nibble len | ||||
| 		 */ | ||||
| 		to_bcd(chanbuf+3, chan->freq, freq_len*2); | ||||
| 
 | ||||
| 		chan_len = 3+freq_len+1; | ||||
| 
 | ||||
| 		icmode = hamlib2icom_mode(chan->mode); | ||||
| 		chanbuf[chan_len++] = icmode&0xff; | ||||
| 		chanbuf[chan_len++] = icmode>>8; | ||||
| 		to_bcd_be(chanbuf+chan_len++,chan->att,2); | ||||
| 		to_bcd_be(chanbuf+chan_len++,chan->preamp,2); | ||||
| 		to_bcd_be(chanbuf+chan_len++,chan->ant,2); | ||||
| 		memset(chanbuf+chan_len, 0, 8); | ||||
| 		strncpy(chanbuf+chan_len, chan->channel_desc, 8); | ||||
| 		chan_len += 8; | ||||
| 
 | ||||
| 		icom_transaction (rig, C_CTL_MEM, S_MEM_CNTNT, chanbuf, chan_len, ackbuf, &ack_len); | ||||
| 
 | ||||
| 		if (ack_len != 1 || ackbuf[0] != ACK) { | ||||
| 				rig_debug(RIG_DEBUG_ERR,"icom_set_channel: ack NG (%#.2x), | ||||
| 								len=%d\n", ackbuf[0],ack_len); | ||||
| 				return -RIG_ERJCTED; | ||||
| 		} | ||||
| 
 | ||||
| 		return RIG_OK; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * icom_get_channel | ||||
|  * Assumes rig!=NULL, rig->state.priv!=NULL, chan!=NULL | ||||
|  */ | ||||
| int icom_get_channel(RIG *rig, channel_t *chan) | ||||
| { | ||||
| 		struct icom_priv_data *priv; | ||||
| 		struct rig_state *rig_s; | ||||
| 		unsigned char chanbuf[24]; | ||||
| 		int chan_len,freq_len; | ||||
| 
 | ||||
| 		rig_s = &rig->state; | ||||
| 		priv = (struct icom_priv_data*)rig_s->priv; | ||||
| 
 | ||||
| 		to_bcd_be(chanbuf,chan->channel_num,4); | ||||
| 		chan_len = 2; | ||||
| 
 | ||||
| 		freq_len = priv->civ_731_mode ? 4:5; | ||||
| 
 | ||||
| 		icom_transaction (rig, C_CTL_MEM, S_MEM_CNTNT, chanbuf, chan_len, chanbuf, &chan_len); | ||||
| 
 | ||||
| 		/*
 | ||||
| 		 * freqbuf should contain Cn,Data area | ||||
| 		 */ | ||||
| 		chan_len--; | ||||
| 		if (freq_len != freq_len+16) { | ||||
| 				rig_debug(RIG_DEBUG_ERR,"icom_get_channel: wrong frame len=%d\n", | ||||
| 								chan_len); | ||||
| 				return -RIG_ERJCTED; | ||||
| 		} | ||||
| 
 | ||||
| 		/*	
 | ||||
| 		 * from_bcd requires nibble len | ||||
| 		 */ | ||||
| 		chan->freq = from_bcd(chanbuf+4, freq_len*2); | ||||
| 
 | ||||
| 		chan_len = 4+freq_len+1; | ||||
| 
 | ||||
| 		chan->mode = icom2hamlib_mode(chanbuf[chan_len] | chanbuf[chan_len+1]); | ||||
| 		chan_len += 2; | ||||
| 		chan->att = from_bcd_be(chanbuf+chan_len++,2); | ||||
| 		chan->preamp = from_bcd_be(chanbuf+chan_len++,2); | ||||
| 		chan->ant = from_bcd_be(chanbuf+chan_len++,2); | ||||
| 		strncpy(chan->channel_desc, chanbuf+chan_len, 8); | ||||
| 
 | ||||
| 		return RIG_OK; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Stéphane Fillod, F8CFE
						Stéphane Fillod, F8CFE