kopia lustrzana https://github.com/Hamlib/Hamlib
				
				
				
			yaesu/newcat.c
Added RIG_LEVEL_NR for FT950 Added newcat_scale_float() for newcat_set_level() floating point problem Using rigctl on FT950 I was trying to set RIG_LEVEL_COMP to 12 I kept setting it to 11. I wrote some test software and found out that 0.12 * 100 = 11. Compilier is gcc 4.2.4, CPU is AMD X2 This seems to work. Terry KJ4EED yaesu/ft950.h Added RIG_LEVEL_NR git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@2498 7ae35d74-ebe9-4afe-98af-79ac388436b8Hamlib-1.2.9
							rodzic
							
								
									3b71851086
								
							
						
					
					
						commit
						d0e0a7e188
					
				| 
						 | 
				
			
			@ -8,7 +8,7 @@
 | 
			
		|||
 * via serial interface to an FT-950 using the "CAT" interface
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 *    $Id: ft950.h,v 1.5 2008-12-10 23:53:56 mrtembry Exp $
 | 
			
		||||
 *    $Id: ft950.h,v 1.6 2008-12-13 21:23:31 mrtembry Exp $
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 *  This library is free software; you can redistribute it and/or
 | 
			
		||||
| 
						 | 
				
			
			@ -58,7 +58,7 @@
 | 
			
		|||
               RIG_LEVEL_KEYSPD|RIG_LEVEL_AF|RIG_LEVEL_AGC|\
 | 
			
		||||
               RIG_LEVEL_METER|RIG_LEVEL_BKINDL|RIG_LEVEL_SQL|\
 | 
			
		||||
               RIG_LEVEL_VOXGAIN|RIG_LEVEL_VOXDELAY|RIG_LEVEL_COMP|\
 | 
			
		||||
               RIG_LEVEL_ANTIVOX)
 | 
			
		||||
               RIG_LEVEL_ANTIVOX|RIG_LEVEL_NR)
 | 
			
		||||
 | 
			
		||||
#define FT950_FUNCS (RIG_FUNC_TONE|RIG_FUNC_TSQL|RIG_FUNC_LOCK|\
 | 
			
		||||
               RIG_FUNC_MON|RIG_FUNC_NB|RIG_FUNC_NR|RIG_FUNC_VOX|\
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,7 @@
 | 
			
		|||
 * FT-950, FT-450.  Much testing remains.  -N0NB
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: newcat.c,v 1.17 2008-12-10 23:53:56 mrtembry Exp $
 | 
			
		||||
 * $Id: newcat.c,v 1.18 2008-12-13 21:23:31 mrtembry Exp $
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 *  This library is free software; you can redistribute it and/or
 | 
			
		||||
| 
						 | 
				
			
			@ -200,6 +200,7 @@ int newcat_set_txvfo(RIG * rig, vfo_t txvfo);
 | 
			
		|||
int newcat_get_rxvfo(RIG * rig, vfo_t * rxvfo);
 | 
			
		||||
int newcat_set_rxvfo(RIG * rig, vfo_t rxvfo);
 | 
			
		||||
int newcat_set_vfo_from_alias(RIG * rig, vfo_t * vfo);
 | 
			
		||||
int newcat_scale_float(int scale, float fval);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			@ -1499,6 +1500,7 @@ int newcat_set_level(RIG * rig, vfo_t vfo, setting_t level, value_t val)
 | 
			
		|||
	int i;
 | 
			
		||||
	char cmdstr[16];
 | 
			
		||||
	int scale;
 | 
			
		||||
	int fpf;
 | 
			
		||||
 | 
			
		||||
	rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1511,10 +1513,14 @@ int newcat_set_level(RIG * rig, vfo_t vfo, setting_t level, value_t val)
 | 
			
		|||
	switch (level) {
 | 
			
		||||
		case RIG_LEVEL_RFPOWER:
 | 
			
		||||
			scale = (newcat_is_rig(rig, RIG_MODEL_FT950)) ? 100 : 255;
 | 
			
		||||
			sprintf(cmdstr, "PC%03d%c", (int)(scale * val.f), cat_term);
 | 
			
		||||
			// sprintf(cmdstr, "PC%03d%c", (int)(scale * val.f), cat_term);
 | 
			
		||||
			fpf = newcat_scale_float(scale, val.f);
 | 
			
		||||
			sprintf(cmdstr, "PC%03d%c", fpf, cat_term);
 | 
			
		||||
			break;
 | 
			
		||||
		case RIG_LEVEL_AF:
 | 
			
		||||
			sprintf(cmdstr, "AG0%03d%c", (int)(255*val.f), cat_term);
 | 
			
		||||
			// sprintf(cmdstr, "AG0%03d%c", (int)(255*val.f), cat_term);
 | 
			
		||||
			fpf = newcat_scale_float(255, val.f);
 | 
			
		||||
			sprintf(cmdstr, "AG0%03d%c", fpf, cat_term);
 | 
			
		||||
			break;
 | 
			
		||||
		case RIG_LEVEL_AGC:
 | 
			
		||||
			switch (val.i) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1544,7 +1550,9 @@ int newcat_set_level(RIG * rig, vfo_t vfo, setting_t level, value_t val)
 | 
			
		|||
			sprintf(cmdstr, "KS%03d;", val.i);
 | 
			
		||||
			break;
 | 
			
		||||
		case RIG_LEVEL_MICGAIN:
 | 
			
		||||
			sprintf(cmdstr, "MG%03d;", (int)(255*val.f));
 | 
			
		||||
			// sprintf(cmdstr, "MG%03d;", (int)(255*val.f));
 | 
			
		||||
			fpf = newcat_scale_float(255, val.f);
 | 
			
		||||
			sprintf(cmdstr, "MG%03d;", fpf);
 | 
			
		||||
			break;
 | 
			
		||||
		case RIG_LEVEL_METER:
 | 
			
		||||
			switch (val.i) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1585,14 +1593,28 @@ int newcat_set_level(RIG * rig, vfo_t vfo, setting_t level, value_t val)
 | 
			
		|||
 | 
			
		||||
			return -RIG_EINVAL;
 | 
			
		||||
		case RIG_LEVEL_RF:
 | 
			
		||||
			sprintf(cmdstr, "RG0%03d;", (int)(255*val.f));
 | 
			
		||||
			// sprintf(cmdstr, "RG0%03d;", (int)(255*val.f));
 | 
			
		||||
			fpf = newcat_scale_float(255, val.f);
 | 
			
		||||
			sprintf(cmdstr, "RG0%03d;", fpf);
 | 
			
		||||
			break;
 | 
			
		||||
		case RIG_LEVEL_NR:
 | 
			
		||||
			sprintf(cmdstr, "RL0%02d;", (int)(10*val.f)+1);
 | 
			
		||||
			if (newcat_is_rig(rig, RIG_MODEL_FT450)) {
 | 
			
		||||
				// sprintf(cmdstr, "RL0%02d;", (int)(10*val.f)+1);
 | 
			
		||||
				fpf = newcat_scale_float(10, val.f);
 | 
			
		||||
				sprintf(cmdstr, "RL0%02d;", fpf+1);
 | 
			
		||||
			} else {
 | 
			
		||||
				// sprintf(cmdstr, "RL0%02d;", (int)(100*val.f));
 | 
			
		||||
				fpf = newcat_scale_float(100, val.f);
 | 
			
		||||
				sprintf(cmdstr, "RL0%02d;", fpf);
 | 
			
		||||
				if (fpf < 1 || fpf > 15)
 | 
			
		||||
					return -RIG_EINVAL;
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
		case RIG_LEVEL_COMP:
 | 
			
		||||
			scale = (newcat_is_rig(rig, RIG_MODEL_FT950)) ? 100 : 255;
 | 
			
		||||
			sprintf(cmdstr, "PL%03d;", (int)(scale * val.f));
 | 
			
		||||
			// sprintf(cmdstr, "PL%03d;", (int)(scale * val.f));
 | 
			
		||||
			fpf = newcat_scale_float(scale, val.f);
 | 
			
		||||
			sprintf(cmdstr, "PL%03d;", fpf);
 | 
			
		||||
			break;
 | 
			
		||||
		case RIG_LEVEL_BKINDL:
 | 
			
		||||
			/* FIXME: should be tenth of dots, newcat expects ms */
 | 
			
		||||
| 
						 | 
				
			
			@ -1605,7 +1627,9 @@ int newcat_set_level(RIG * rig, vfo_t vfo, setting_t level, value_t val)
 | 
			
		|||
				sprintf(cmdstr, "SD%04d;", val.i);
 | 
			
		||||
			break;
 | 
			
		||||
		case RIG_LEVEL_SQL:
 | 
			
		||||
			sprintf(cmdstr, "SQ0%03d;", (int)(255*val.f));
 | 
			
		||||
			// sprintf(cmdstr, "SQ0%03d;", (int)(255*val.f));
 | 
			
		||||
			fpf = newcat_scale_float(255, val.f);
 | 
			
		||||
			sprintf(cmdstr, "SQ0%03d;", fpf);
 | 
			
		||||
			break;
 | 
			
		||||
		case RIG_LEVEL_VOX:
 | 
			
		||||
			/* VOX delay, arg int (tenth of seconds), expects ms */
 | 
			
		||||
| 
						 | 
				
			
			@ -1623,12 +1647,16 @@ int newcat_set_level(RIG * rig, vfo_t vfo, setting_t level, value_t val)
 | 
			
		|||
			break;
 | 
			
		||||
		case RIG_LEVEL_VOXGAIN:
 | 
			
		||||
			scale = (newcat_is_rig(rig, RIG_MODEL_FT950)) ? 100 : 255;
 | 
			
		||||
			sprintf(cmdstr, "VG%03d;", (int)(scale * val.f));
 | 
			
		||||
			// sprintf(cmdstr, "VG%03d;", (int)(scale * val.f));
 | 
			
		||||
			fpf = newcat_scale_float(scale, val.f);
 | 
			
		||||
			sprintf(cmdstr, "VG%03d;", fpf);
 | 
			
		||||
			break;
 | 
			
		||||
		case RIG_LEVEL_ANTIVOX:
 | 
			
		||||
			if (newcat_is_rig(rig, RIG_MODEL_FT950))
 | 
			
		||||
				sprintf(cmdstr, "EX117%03d;", (int)(100 * val.f));
 | 
			
		||||
			else
 | 
			
		||||
			if (newcat_is_rig(rig, RIG_MODEL_FT950)) {
 | 
			
		||||
				// sprintf(cmdstr, "EX117%03d;", (int)(100 * val.f));
 | 
			
		||||
				fpf = newcat_scale_float(100, val.f);
 | 
			
		||||
				sprintf(cmdstr, "EX117%03d;", fpf);
 | 
			
		||||
			} else
 | 
			
		||||
				return -RIG_EINVAL;
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
| 
						 | 
				
			
			@ -1782,7 +1810,10 @@ int newcat_get_level(RIG * rig, vfo_t vfo, setting_t level, value_t * val)
 | 
			
		|||
			val->i = atoi(retlvl);
 | 
			
		||||
			break;
 | 
			
		||||
		case RIG_LEVEL_NR:
 | 
			
		||||
			val->f = (float)(atoi(retlvl)-1)/10.;
 | 
			
		||||
			if (newcat_is_rig(rig, RIG_MODEL_FT450))
 | 
			
		||||
				val->f = (float)(atoi(retlvl)-1)/10.;
 | 
			
		||||
			else
 | 
			
		||||
				val->f = (float)(atoi(retlvl))/100.;
 | 
			
		||||
			break;
 | 
			
		||||
		case RIG_LEVEL_VOX:
 | 
			
		||||
			if (newcat_is_rig(rig, RIG_MODEL_FT950) || newcat_is_rig(rig, RIG_MODEL_FT450)) {
 | 
			
		||||
| 
						 | 
				
			
			@ -2733,3 +2764,26 @@ int newcat_set_vfo_from_alias(RIG * rig, vfo_t * vfo) {
 | 
			
		|||
 | 
			
		||||
	return RIG_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *	Found newcat_set_level() floating point math problem
 | 
			
		||||
 *	Using rigctl on FT950 I was trying to set RIG_LEVEL_COMP to 12
 | 
			
		||||
 *	I kept setting it to 11.  I wrote some test software and 
 | 
			
		||||
 *	found out that 0.12 * 100 = 11 with my setup.
 | 
			
		||||
 *  Compilier is gcc 4.2.4, CPU is AMD X2
 | 
			
		||||
 *  This works but Find a better way.
 | 
			
		||||
 *  The newcat_get_level() seems to work correctly.
 | 
			
		||||
 *  Terry KJ4EED
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
int newcat_scale_float(int scale, float fval) {
 | 
			
		||||
	float f;
 | 
			
		||||
	float fudge = 0.003;
 | 
			
		||||
    
 | 
			
		||||
	if ((fval + fudge) > 1.0)
 | 
			
		||||
		f = scale * fval;
 | 
			
		||||
	else 
 | 
			
		||||
		f = scale * (fval + fudge);
 | 
			
		||||
 | 
			
		||||
	return (int) f;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue