示例#1
0
static void onActivate(void * /* dummy */)
{
	int i;
	int index;
	int step;

	CalState = 0;
	GfuiLabelSetText(scrHandle2, InstId, Instructions[CalState]);
	glutIdleFunc(Idle2);
	glutPostRedisplay();
	for (index = 0; index < NUM_JOY; index++) {
		if (js[index]) {
			js[index]->read(&rawb[index], &ax[index * _JS_MAX_AXES]); /* initial value */
		}
	}

	for (i = 0; i < 4; i++) {
		if (i > 0) {
			step = i + 2;
		} else {
			step = i + 1;
		}
		if (Cmd[step + OFFSET_CMD].ref.type == GFCTRL_TYPE_JOY_AXIS) {
			GfuiLabelSetText(scrHandle2, LabAxisId[i], GfctrlGetNameByRef(GFCTRL_TYPE_JOY_AXIS, Cmd[step + OFFSET_CMD].ref.index));
		} else {
			GfuiLabelSetText(scrHandle2, LabAxisId[i], "---");
		}
		GfuiLabelSetText(scrHandle2, LabMinId[i], "");
		GfuiLabelSetText(scrHandle2, LabMaxId[i], "");
	}
}
示例#2
0
static void advanceStep (void)
{
    int i;
    int nextAxis = GFCTRL_JOY_NUMBER * GFCTRL_JOY_MAX_AXES;

    AtobCount++;

    if (CalState <= 0) {
	CalState++;
	AtobCount = 0;
    }

    /* scan through cmds looking for the next ATOB on this axis */
    while (AtobCount <= CMD_END_OF_LIST) {
	if (Cmd[AtobCount].ref.type == GFCTRL_TYPE_JOY_ATOB 
		&& Cmd[AtobCount].ref.index == AtobAxis) {
	    GfuiLabelSetText(ScrHandle, AtobCommandID, Cmd[AtobCount].name);
	    return;
	}
	AtobCount++;
    }

    /* Pause briefly to compute thresholds */
    if (CalState ==2) {
	CalState = 3;
	return;
    } 

    /* no more new ATOBs for this axis, scan for next smallest axis */
    AtobCount = 0;

    for (i = 0; i <= CMD_END_OF_LIST; i++) {
	if (Cmd[i].ref.type == GFCTRL_TYPE_JOY_ATOB 
		&& nextAxis > Cmd[i].ref.index && AtobAxis < Cmd[i].ref.index) {
	    nextAxis = Cmd[i].ref.index;
	    AtobCount ++;
	}
    }
    if (AtobCount) {
	AtobAxis = nextAxis;

	/* find first command on new axis */
	for (AtobCount = 0; AtobCount <= CMD_END_OF_LIST; AtobCount++) {
	    if (Cmd[AtobCount].ref.type == GFCTRL_TYPE_JOY_ATOB 
		    && Cmd[AtobCount].ref.index == AtobAxis) {
    		GfuiLabelSetText(ScrHandle, AtobAxisID, GfctrlGetNameByRef(GFCTRL_TYPE_JOY_ATOB, AtobAxis));
		GfuiLabelSetText(ScrHandle, AtobCommandID, Cmd[AtobCount].name);
		CalState = 1;
		return;
	    }
	}
    }

    /* no more ATOBs found, we're done */
}
示例#3
0
static void
onActivate(void * /* dummy */)
{
    int i;
    int index;
    
    // Create and test joysticks ; only keep the up and running ones.
    for (index = 0; index < GFCTRL_JOY_NUMBER; index++) {
	Joystick[index] = new jsJoystick(index);
	if (Joystick[index]->notWorking()) {
	    /* don't configure the joystick */
	    delete Joystick[index];
	    Joystick[index] = 0;
	}
    }

    CalState = 0;
    AtobAxis = GFCTRL_JOY_NUMBER * GFCTRL_JOY_MAX_AXES;;

    /* Find commands which are ATOB */
    for (i = 0; i <= CMD_END_OF_LIST; i++) {
	if (Cmd[i].ref.type == GFCTRL_TYPE_JOY_ATOB) {
	    if (AtobAxis > Cmd[i].ref.index) AtobAxis = Cmd[i].ref.index;
	}
    }
    for (AtobCount = 0; AtobCount <= CMD_END_OF_LIST; AtobCount++) {
	if (Cmd[AtobCount].ref.index == AtobAxis) break;
    }

    /* Set label titles */
    GfuiLabelSetText(ScrHandle, AtobAxisID, GfctrlGetNameByRef(GFCTRL_TYPE_JOY_ATOB, AtobAxis));
    GfuiLabelSetText(ScrHandle, AtobCommandID, "---");

    GfuiLabelSetText(ScrHandle, InstId, Instructions[CalState]);
    GfuiApp().eventLoop().setRecomputeCB(Idle2);
    GfuiApp().eventLoop().postRedisplay();
    for (index = 0; index < GFCTRL_JOY_NUMBER; index++) {
	if (Joystick[index]) {
	    Joystick[index]->read(&JoyButtons[index], &JoyAxis[index * GFCTRL_JOY_MAX_AXES]); /* initial value */
	}
    }

    GfuiEnable(ScrHandle, CancelBut, GFUI_ENABLE);
    if (DoneBut)
	GfuiEnable(ScrHandle, DoneBut, GFUI_DISABLE);
    else
	GfuiEnable(ScrHandle, NextBut, GFUI_DISABLE);
}
示例#4
0
static void
onActivate(void * /* dummy */)
{
    int i;
    int index;
    int step;
    
    // Create and test joysticks ; only keep the up and running ones.
    for (index = 0; index < GFCTRL_JOY_NUMBER; index++) {
	Joystick[index] = new jsJoystick(index);
	if (Joystick[index]->notWorking()) {
	    /* don't configure the joystick */
	    delete Joystick[index];
	    Joystick[index] = 0;
	}
    }

    CalState = 0;
    GfuiLabelSetText(ScrHandle, InstId, Instructions[CalState]);
    GfuiApp().eventLoop().setRecomputeCB(Idle2);
    GfuiApp().eventLoop().postRedisplay();
    for (index = 0; index < GFCTRL_JOY_NUMBER; index++) {
	if (Joystick[index]) {
	    Joystick[index]->read(&JoyButtons[index], &JoyAxis[index * GFCTRL_JOY_MAX_AXES]); /* initial value */
	}
    }

    for (i = 0; i < NbMaxCalAxis; i++) {
	if (i > 0) {
	    step = i + 2;
	} else {
	    step = i + 1;
	}
	if (Cmd[step + CmdOffset].ref.type == GFCTRL_TYPE_JOY_AXIS) {
	    GfuiLabelSetText(ScrHandle, LabAxisId[i], GfctrlGetNameByRef(GFCTRL_TYPE_JOY_AXIS, Cmd[step + CmdOffset].ref.index));
	} else {
	    GfuiLabelSetText(ScrHandle, LabAxisId[i], "---");
	}
	GfuiLabelSetText(ScrHandle, LabMinId[i], "");
 	GfuiLabelSetText(ScrHandle, LabMaxId[i], "");
    }

    GfuiEnable(ScrHandle, CancelBut, GFUI_ENABLE);
    if (DoneBut)
	GfuiEnable(ScrHandle, DoneBut, GFUI_DISABLE);
    else
	GfuiEnable(ScrHandle, NextBut, GFUI_DISABLE);
}
示例#5
0
void
HmReadPrefs(int index)
{
    const char	*prm;
    const char	*defaultSettings;
    char	sstring[1024];
    int		cmd;
    float	tmp;
    tCtrlRef	*ref;
    int		i;
    int		idx = index - 1;
    tControlCmd	*cmdCtrl;

    HCtx[idx]->CmdControl = (tControlCmd *) calloc (nbCmdControl, sizeof (tControlCmd));
    cmdCtrl = HCtx[idx]->CmdControl;
    memcpy(cmdCtrl, CmdControlRef, nbCmdControl * sizeof (tControlCmd));

    sprintf(sstring, "%s%s", GetLocalDir(), HM_PREF_FILE);
    PrefHdle = GfParmReadFile(sstring, GFPARM_RMODE_REREAD | GFPARM_RMODE_CREAT);

    sprintf(sstring, "%s/%s/%d", HM_SECT_PREF, HM_LIST_DRV, index);
    prm = GfParmGetStr(PrefHdle, sstring, HM_ATT_TRANS, HM_VAL_AUTO);
    if (strcmp(prm, HM_VAL_AUTO) == 0) {
	HCtx[idx]->Transmission = 0;
    } else {
	HCtx[idx]->Transmission = 1;
    }

    /* Parameters Settings */
    prm = GfParmGetStr(PrefHdle, sstring, HM_ATT_ABS, Yn[HCtx[idx]->ParamAbs]);
    if (strcmp(prm, Yn[0]) == 0) {
	HCtx[idx]->ParamAbs = 1;
    } else {
	HCtx[idx]->ParamAbs = 0;
    }
    prm = GfParmGetStr(PrefHdle, sstring, HM_ATT_ASR, Yn[HCtx[idx]->ParamAsr]);
    if (strcmp(prm, Yn[0]) == 0) {
	HCtx[idx]->ParamAsr = 1;
    } else {
	HCtx[idx]->ParamAsr = 0;
    }

    prm = GfParmGetStr(PrefHdle, HM_SECT_PREF, HM_ATT_CONTROL, controlList[2].parmName);
    prm = GfParmGetStr(PrefHdle, sstring, HM_ATT_CONTROL, prm);
    for (i = 0; i < nbControl; i++) {
	if (!strcmp(prm, controlList[i].parmName)) {
	    break;
	}
    }
    if (i == nbControl) {
	i = 2;
    }
    if ((i == 0) && !joyPresent) {
	i = 2;
    }

    defaultSettings = controlList[i].settings;

    /* Command Settings */
    for (cmd = 0; cmd < nbCmdControl; cmd++) {
	prm = GfctrlGetNameByRef(cmdCtrl[cmd].type, cmdCtrl[cmd].val);
	prm = GfParmGetStr(PrefHdle, defaultSettings, cmdCtrl[cmd].name, prm);
	prm = GfParmGetStr(PrefHdle, sstring, cmdCtrl[cmd].name, prm);
	if (!prm || (strlen(prm) == 0)) {
	    cmdCtrl[cmd].type = GFCTRL_TYPE_NOT_AFFECTED;
	    GfOut("%s -> NONE (-1)\n", cmdCtrl[cmd].name);
	    continue;
	}
	ref = GfctrlGetRefByName(prm);
	cmdCtrl[cmd].type = ref->type;
	cmdCtrl[cmd].val = ref->index;
	GfOut("%s -> %s\n", cmdCtrl[cmd].name, prm);

	if (cmdCtrl[cmd].minName) {
	    cmdCtrl[cmd].min = (float)GfParmGetNum(PrefHdle, defaultSettings, cmdCtrl[cmd].minName, (char*)NULL, (tdble)cmdCtrl[cmd].min);
	    cmdCtrl[cmd].min = cmdCtrl[cmd].minVal = (float)GfParmGetNum(PrefHdle, sstring, cmdCtrl[cmd].minName, (char*)NULL, (tdble)cmdCtrl[cmd].min);
	}
	if (cmdCtrl[cmd].maxName) {
	    cmdCtrl[cmd].max = (float)GfParmGetNum(PrefHdle, defaultSettings, cmdCtrl[cmd].maxName, (char*)NULL, (tdble)cmdCtrl[cmd].max);
	    cmdCtrl[cmd].max = (float)GfParmGetNum(PrefHdle, sstring,         cmdCtrl[cmd].maxName, (char*)NULL, (tdble)cmdCtrl[cmd].max);
	}	
	if (cmdCtrl[cmd].sensName) {
	    cmdCtrl[cmd].sens = 1.0f / (float)GfParmGetNum(PrefHdle, defaultSettings, cmdCtrl[cmd].sensName, (char*)NULL, 1.0 / (tdble)cmdCtrl[cmd].sens);
	    cmdCtrl[cmd].sens = 1.0f / (float)GfParmGetNum(PrefHdle, sstring,         cmdCtrl[cmd].sensName, (char*)NULL, 1.0 / (tdble)cmdCtrl[cmd].sens);
	}	
	if (cmdCtrl[cmd].powName) {
	    cmdCtrl[cmd].pow = (float)GfParmGetNum(PrefHdle, defaultSettings, cmdCtrl[cmd].powName, (char*)NULL, (tdble)cmdCtrl[cmd].pow);
	    cmdCtrl[cmd].pow = (float)GfParmGetNum(PrefHdle, sstring,         cmdCtrl[cmd].powName, (char*)NULL, (tdble)cmdCtrl[cmd].pow);
	}
	if (cmdCtrl[cmd].spdSensName) {
	    cmdCtrl[cmd].spdSens = (float)GfParmGetNum(PrefHdle, defaultSettings, cmdCtrl[cmd].spdSensName, (char*)NULL, (tdble)cmdCtrl[cmd].spdSens);
	    cmdCtrl[cmd].spdSens = (float)GfParmGetNum(PrefHdle, sstring,         cmdCtrl[cmd].spdSensName, (char*)NULL, (tdble)cmdCtrl[cmd].spdSens);
	    cmdCtrl[cmd].spdSens = cmdCtrl[cmd].spdSens / 100.0;
	}
	if (cmdCtrl[cmd].deadZoneName) {
	    cmdCtrl[cmd].deadZone = (float)GfParmGetNum(PrefHdle, defaultSettings, cmdCtrl[cmd].deadZoneName, (char*)NULL, (tdble)cmdCtrl[cmd].deadZone);
	    cmdCtrl[cmd].deadZone = (float)GfParmGetNum(PrefHdle, sstring,         cmdCtrl[cmd].deadZoneName, (char*)NULL, (tdble)cmdCtrl[cmd].deadZone);
	}
	if (cmdCtrl[cmd].min > cmdCtrl[cmd].max) {
	    tmp = cmdCtrl[cmd].min;
	    cmdCtrl[cmd].min = cmdCtrl[cmd].max;
	    cmdCtrl[cmd].max = tmp;
	}
	cmdCtrl[cmd].deadZone = (cmdCtrl[cmd].max - cmdCtrl[cmd].min) * cmdCtrl[cmd].deadZone;
	if (cmdCtrl[cmd].type == GFCTRL_TYPE_MOUSE_AXIS) {
	    HCtx[idx]->MouseControlUsed = 1;
	}
    }

    prm = GfParmGetStr(PrefHdle, defaultSettings, HM_ATT_REL_BUT_NEUTRAL, Yn[HCtx[idx]->RelButNeutral]);
    prm = GfParmGetStr(PrefHdle, sstring, HM_ATT_REL_BUT_NEUTRAL, prm);
    if (strcmp(prm, Yn[0]) == 0) {
	HCtx[idx]->RelButNeutral = 1;
    } else {
	HCtx[idx]->RelButNeutral = 0;
    }

    prm = GfParmGetStr(PrefHdle, defaultSettings, HM_ATT_SEQSHFT_ALLOW_NEUTRAL, Yn[HCtx[idx]->SeqShftAllowNeutral]);
    prm = GfParmGetStr(PrefHdle, sstring, HM_ATT_SEQSHFT_ALLOW_NEUTRAL, prm);
    if (strcmp(prm, Yn[0]) == 0) {
	HCtx[idx]->SeqShftAllowNeutral = 1;
    } else {
	HCtx[idx]->SeqShftAllowNeutral = 0;
    }

    prm = GfParmGetStr(PrefHdle, sstring, HM_ATT_AUTOREVERSE, Yn[HCtx[idx]->AutoReverse]);
    if (strcmp(prm, Yn[0]) == 0) {
	HCtx[idx]->AutoReverse = 1;
    } else {
	HCtx[idx]->AutoReverse = 0;
    }
}
示例#6
0
static void
Idle2(void)
{
   int		index;
#if SDL_JOYSTICK
   /* Check for activity on Joystick buttons */
   GfctrlJoyGetCurrentStates(&joyInfo);
   for (index = 0; index < GFCTRL_JOY_NUMBER * GFCTRL_JOY_MAX_BUTTONS; index++) {
      if (joyInfo.edgedn[index]) {
         /* Check whether to ignore */
         if(Cmd[CalState + CmdOffset].butIgnore == index)
            break;

         /* Button fired */
         JoyCalAutomaton();
         if (CalState >= NbCalSteps) {
            GfuiApp().eventLoop().setRecomputeCB(0);
         }
         GfuiApp().eventLoop().postRedisplay();
         return;
      }
#else
    int		mask;
    int		b, i;
    

    for (index = 0; index < GFCTRL_JOY_NUMBER; index++) {
	if (Joystick[index]) {
	    Joystick[index]->read(&b, &JoyAxis[index * GFCTRL_JOY_MAX_AXES]);
	    
	    /* Joystick buttons */
	    for (i = 0, mask = 1; i < 32; i++, mask *= 2) {
		if (((b & mask) != 0) && ((JoyButtons[index] & mask) == 0)) {
		    /* Check whether to ignore */
		    if(Cmd[CalState + CmdOffset].butIgnore == i + 32 * index)
			break;

		    /* Button fired */
		    JoyCalAutomaton();
		    if (CalState >= NbCalSteps) {
			GfuiApp().eventLoop().setRecomputeCB(0);
		    }
		    GfuiApp().eventLoop().postRedisplay();
		    JoyButtons[index] = b;
		    return;
		}
	    }
	    JoyButtons[index] = b;
	}
#endif
    }

    /* Let CPU take breath (and fans stay at low and quite speed) */
    GfSleep(0.001);
}


static void
onActivate(void * /* dummy */)
{
    int i;
    int step;
#if SDL_JOYSTICK
    //joyInfo = GfctrlJoyCreate();
    GfctrlJoyGetCurrentStates(&joyInfo);
#else
    int index;

    // Create and test joysticks ; only keep the up and running ones.
    for (index = 0; index < GFCTRL_JOY_NUMBER; index++) {
	Joystick[index] = new jsJoystick(index);
	if (Joystick[index]->notWorking()) {
	    /* don't configure the joystick */
	    delete Joystick[index];
	    Joystick[index] = 0;
	}
    }
#endif

    CalState = 0;
    GfuiLabelSetText(ScrHandle, InstId, Instructions[CalState]);
    GfuiApp().eventLoop().setRecomputeCB(Idle2);
    GfuiApp().eventLoop().postRedisplay();
#ifndef SDL_JOYSTICK
    for (index = 0; index < GFCTRL_JOY_NUMBER; index++) {
	if (Joystick[index]) {
	    Joystick[index]->read(&JoyButtons[index], &JoyAxis[index * GFCTRL_JOY_MAX_AXES]); /* initial value */
	}
    }
#endif

    for (i = 0; i < NbMaxCalAxis; i++) {
	if (i > 0) {
	    step = i + 2;
	} else {
	    step = i + 1;
	}
	if (Cmd[step + CmdOffset].ref.type == GFCTRL_TYPE_JOY_AXIS) {
	    GfuiLabelSetText(ScrHandle, LabAxisId[i], GfctrlGetNameByRef(GFCTRL_TYPE_JOY_AXIS, Cmd[step + CmdOffset].ref.index));
	} else {
	    GfuiLabelSetText(ScrHandle, LabAxisId[i], "---");
	}
	GfuiLabelSetText(ScrHandle, LabMinId[i], "");
 	GfuiLabelSetText(ScrHandle, LabMaxId[i], "");
    }

    GfuiEnable(ScrHandle, CancelBut, GFUI_ENABLE);
    if (DoneBut)
	GfuiEnable(ScrHandle, DoneBut, GFUI_DISABLE);
    else
	GfuiEnable(ScrHandle, NextBut, GFUI_DISABLE);
}
示例#7
0
void
HmReadPrefs(const int index)
{
	const char	*prm;
	const char	*defaultSettings;
	char	sstring[1024];
	tCtrlRef	*ref;
	const int	idx = index - 1;
	tControlCmd	*cmdCtrl;

	cmdCtrl = HCtx[idx]->cmdControl = (tControlCmd *) calloc (NbCmdControl, sizeof (tControlCmd));
	memcpy(cmdCtrl, CmdControlRef, NbCmdControl * sizeof (tControlCmd));

	sprintf(sstring, "%s%s", GfLocalDir(), HM_PREF_FILE);
	PrefHdle = GfParmReadFile(sstring, GFPARM_RMODE_REREAD | GFPARM_RMODE_CREAT);
	sprintf(sstring, "%s/%s/%d", HM_SECT_PREF, HM_LIST_DRV, index);
	prm = GfParmGetStr(PrefHdle, sstring, HM_ATT_TRANS, HM_VAL_AUTO);
	if (!strcmp(prm, HM_VAL_AUTO))
		HCtx[idx]->transmission = eTransAuto;
	else if (!strcmp(prm, HM_VAL_SEQ))
		HCtx[idx]->transmission = eTransSeq;
	else if (!strcmp(prm, HM_VAL_HBOX))
		HCtx[idx]->transmission = eTransHbox;
	else
		HCtx[idx]->transmission = eTransGrid;

	/* Parameters Settings */
	//ABS on/off
	prm = GfParmGetStr(PrefHdle, sstring, HM_ATT_ABS, Yn[HCtx[idx]->paramAbs].c_str());
	HCtx[idx]->paramAbs = (prm == Yn[0]);
	
	//ASR on/off
	prm = GfParmGetStr(PrefHdle, sstring, HM_ATT_ASR, Yn[HCtx[idx]->paramAsr].c_str());
	HCtx[idx]->paramAsr = (prm == Yn[0]);
	
	//Controls
	prm = GfParmGetStr(PrefHdle, HM_SECT_PREF, HM_ATT_CONTROL, controlList[2].parmName);
	prm = GfParmGetStr(PrefHdle, sstring, HM_ATT_CONTROL, prm);
	int i;
	for (i = 0; i < nbControl; i++) {
		if (!strcmp(prm, controlList[i].parmName))
			break;
	}//for i
	
	if (i == nbControl)
		i = 2;
	
	if (i == 0 && !joyPresent)
		i = 2;
	
	defaultSettings = controlList[i].settings;
	
	/* Command Settings */
	GfOut("Command settings :\n");
	for (int cmd = 0; cmd < NbCmdControl; cmd++) {
		
		prm = GfctrlGetNameByRef(cmdCtrl[cmd].type, cmdCtrl[cmd].val);
		prm = GfParmGetStr(PrefHdle, defaultSettings, cmdCtrl[cmd].name, prm);
		prm = GfParmGetStr(PrefHdle, sstring, cmdCtrl[cmd].name, prm);
		if (!prm || strlen(prm) == 0) {
			cmdCtrl[cmd].type = GFCTRL_TYPE_NOT_AFFECTED;
			GfOut("  %s\t: None (-1)\n", cmdCtrl[cmd].name);
			continue;
		}
		
		ref = GfctrlGetRefByName(prm);
		cmdCtrl[cmd].type = ref->type; // GFCTRL_TYPE_XX
		cmdCtrl[cmd].val = ref->index; // Index for joy. axis, buttons ; 1-bytes ASCII code for keys.
		GfOut("  %s\t: %s\n", cmdCtrl[cmd].name, prm);
	
		/* min value < max value */
		if (cmdCtrl[cmd].minName) {
			cmdCtrl[cmd].min = (float)GfParmGetNum(PrefHdle, defaultSettings, cmdCtrl[cmd].minName, (char*)NULL, (tdble)cmdCtrl[cmd].min);
			cmdCtrl[cmd].min = cmdCtrl[cmd].minVal = (float)GfParmGetNum(PrefHdle, sstring, cmdCtrl[cmd].minName, (char*)NULL, (tdble)cmdCtrl[cmd].min);
		}//if minName
	
		/* max value > min value */
		if (cmdCtrl[cmd].maxName) {
			cmdCtrl[cmd].max = (float)GfParmGetNum(PrefHdle, defaultSettings, cmdCtrl[cmd].maxName, (char*)NULL, (tdble)cmdCtrl[cmd].max);
			cmdCtrl[cmd].max = (float)GfParmGetNum(PrefHdle, sstring,		 cmdCtrl[cmd].maxName, (char*)NULL, (tdble)cmdCtrl[cmd].max);
		}//if maxName
	
		/* 0 < sensitivity */
		if (cmdCtrl[cmd].sensName) {
			cmdCtrl[cmd].sens = (float)GfParmGetNum(PrefHdle, defaultSettings, cmdCtrl[cmd].sensName, (char*)NULL, (tdble)cmdCtrl[cmd].sens);
			cmdCtrl[cmd].sens = (float)GfParmGetNum(PrefHdle, sstring,		 cmdCtrl[cmd].sensName, (char*)NULL, (tdble)cmdCtrl[cmd].sens);
			if (cmdCtrl[cmd].sens <= 0.0)
				cmdCtrl[cmd].sens = 1.0e-6;
		}//if sensName
	
		/* 0 < power (1 = linear) */
		if (cmdCtrl[cmd].powName) {
			cmdCtrl[cmd].pow = (float)GfParmGetNum(PrefHdle, defaultSettings, cmdCtrl[cmd].powName, (char*)NULL, (tdble)cmdCtrl[cmd].pow);
			cmdCtrl[cmd].pow = (float)GfParmGetNum(PrefHdle, sstring,		 cmdCtrl[cmd].powName, (char*)NULL, (tdble)cmdCtrl[cmd].pow);
		}//if powName

		/* 0 <= sensitivity to car speed */
		if (cmdCtrl[cmd].spdSensName) {
			cmdCtrl[cmd].spdSens = (float)GfParmGetNum(PrefHdle, defaultSettings, cmdCtrl[cmd].spdSensName, (char*)NULL, (tdble)cmdCtrl[cmd].spdSens);
			cmdCtrl[cmd].spdSens = (float)GfParmGetNum(PrefHdle, sstring,		 cmdCtrl[cmd].spdSensName, (char*)NULL, (tdble)cmdCtrl[cmd].spdSens);
			if (cmdCtrl[cmd].spdSens < 0.0)
				cmdCtrl[cmd].spdSens = 0.0;
		}//if spdSendName

		/* 0 =< dead zone < max value - min value (not used for on/off controls like keyboard / mouse buttons / joystick buttons) */
		if (cmdCtrl[cmd].deadZoneName) {
			cmdCtrl[cmd].deadZone = (float)GfParmGetNum(PrefHdle, defaultSettings, cmdCtrl[cmd].deadZoneName, (char*)NULL, (tdble)cmdCtrl[cmd].deadZone);
			cmdCtrl[cmd].deadZone = (float)GfParmGetNum(PrefHdle, sstring,		 cmdCtrl[cmd].deadZoneName, (char*)NULL, (tdble)cmdCtrl[cmd].deadZone);
			if (cmdCtrl[cmd].deadZone < 0.0)
				cmdCtrl[cmd].deadZone = 0.0;
			else if (cmdCtrl[cmd].deadZone > 1.0)
				cmdCtrl[cmd].deadZone = 1.0;
		}//if deadZoneName
	
		if (cmdCtrl[cmd].min > cmdCtrl[cmd].max)
			std::swap(cmdCtrl[cmd].min, cmdCtrl[cmd].max);
	
		//cmdCtrl[cmd].deadZone = (cmdCtrl[cmd].max - cmdCtrl[cmd].min) * cmdCtrl[cmd].deadZone;
		
		if (cmdCtrl[cmd].type == GFCTRL_TYPE_MOUSE_AXIS)
			HCtx[idx]->mouseControlUsed = 1;
		
	}//for cmd

	prm = GfParmGetStr(PrefHdle, defaultSettings, HM_ATT_REL_BUT_NEUTRAL, Yn[HCtx[idx]->relButNeutral].c_str());
	prm = GfParmGetStr(PrefHdle, sstring, HM_ATT_REL_BUT_NEUTRAL, prm);
	HCtx[idx]->relButNeutral = (prm == Yn[0]);
	
	prm = GfParmGetStr(PrefHdle, defaultSettings, HM_ATT_SEQSHFT_ALLOW_NEUTRAL, Yn[HCtx[idx]->seqShftAllowNeutral].c_str());
	prm = GfParmGetStr(PrefHdle, sstring, HM_ATT_SEQSHFT_ALLOW_NEUTRAL, prm);
	HCtx[idx]->seqShftAllowNeutral = (prm == Yn[0]);

	prm = GfParmGetStr(PrefHdle, defaultSettings, HM_ATT_SEQSHFT_ALLOW_REVERSE, Yn[HCtx[idx]->seqShftAllowReverse].c_str());
	prm = GfParmGetStr(PrefHdle, sstring, HM_ATT_SEQSHFT_ALLOW_REVERSE, prm);
	HCtx[idx]->seqShftAllowReverse = (prm == Yn[0]);
	
	prm = GfParmGetStr(PrefHdle, sstring, HM_ATT_AUTOREVERSE, Yn[HCtx[idx]->autoReverse].c_str());
	HCtx[idx]->autoReverse = (prm == Yn[0]);
}//HmReadPrefs