/*************************************************************************** file : pref.cpp created : Sat Apr 29 16:51:03 CEST 2000 copyright : (C) 2000 by Eric Espie email : torcs@free.fr version : $Id: pref.cpp,v 1.19 2003/11/23 20:21:11 torcs Exp $ ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ /** @file @author Eric Espie @version $Id: pref.cpp,v 1.19 2003/11/23 20:21:11 torcs Exp $ */ #include #include #include #include #include #include #include #include #include #include #include #include #include "pref.h" #include "human.h" void *PrefHdle; /* int Transmission; */ /* int NbPitStopProg = 0; */ /* int ParamAsr = 0; anti-slip accel */ /* int ParamAbs = 1; anti-lock brake */ /* int RelButNeutral = 0; */ /* int SeqShftAllowNeutral = 0; */ /* int AutoReverse = 0; */ tControlCmd CmdControlRef[] = { {HM_ATT_UP_SHFT, GFCTRL_TYPE_JOY_BUT, 0, NULL, 0.0, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, {HM_ATT_DN_SHFT, GFCTRL_TYPE_JOY_BUT, 1, NULL, 0.0, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, {HM_ATT_ASR_CMD, GFCTRL_TYPE_JOY_BUT, 2, NULL, 0.0, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, {HM_ATT_ABS_CMD, GFCTRL_TYPE_JOY_BUT, 3, NULL, 0.0, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, {HM_ATT_GEAR_R, GFCTRL_TYPE_NOT_AFFECTED, -1, NULL, 0.0, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, {HM_ATT_GEAR_N, GFCTRL_TYPE_NOT_AFFECTED, -1, NULL, 0.0, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, {HM_ATT_GEAR_1, GFCTRL_TYPE_NOT_AFFECTED, -1, NULL, 0.0, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, {HM_ATT_GEAR_2, GFCTRL_TYPE_NOT_AFFECTED, -1, NULL, 0.0, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, {HM_ATT_GEAR_3, GFCTRL_TYPE_NOT_AFFECTED, -1, NULL, 0.0, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, {HM_ATT_GEAR_4, GFCTRL_TYPE_NOT_AFFECTED, -1, NULL, 0.0, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, {HM_ATT_GEAR_5, GFCTRL_TYPE_NOT_AFFECTED, -1, NULL, 0.0, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, {HM_ATT_GEAR_6, GFCTRL_TYPE_NOT_AFFECTED, -1, NULL, 0.0, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, {HM_ATT_THROTTLE, GFCTRL_TYPE_JOY_AXIS, 1, HM_ATT_THROTTLE_MIN, 0.0, 0.0, HM_ATT_THROTTLE_MAX, 1.0, HM_ATT_THROTTLE_SENS, 1.0, HM_ATT_THROTTLE_POW, 2.0, NULL, 0.0, NULL, 0.0}, {HM_ATT_BRAKE, GFCTRL_TYPE_JOY_AXIS, 1, HM_ATT_BRAKE_MIN, 0.0, 0.0, HM_ATT_BRAKE_MAX, 1.0, HM_ATT_BRAKE_SENS, 1.0, HM_ATT_BRAKE_POW, 2.0, NULL, 0.0, NULL, 0.0}, {HM_ATT_LEFTSTEER, GFCTRL_TYPE_JOY_AXIS, 0, HM_ATT_LEFTSTEER_MIN, 0.0, 0.0, HM_ATT_LEFTSTEER_MAX, 1.0, HM_ATT_STEER_SENS, 2.0, HM_ATT_LEFTSTEER_POW, 1.0, HM_ATT_STEER_SPD, 0.0, HM_ATT_STEER_DEAD, 0.0}, {HM_ATT_RIGHTSTEER, GFCTRL_TYPE_JOY_AXIS, 0, HM_ATT_RIGHTSTEER_MIN, 0.0, 0.0, HM_ATT_RIGHTSTEER_MAX, 1.0, HM_ATT_STEER_SENS, 2.0, HM_ATT_RIGHTSTEER_POW, 1.0, HM_ATT_STEER_SPD, 0.0, HM_ATT_STEER_DEAD, 0.0}, {HM_ATT_LIGHT1_CMD, GFCTRL_TYPE_NOT_AFFECTED, -1, NULL, 0.0, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0}, {HM_ATT_CLUTCH, GFCTRL_TYPE_JOY_AXIS, 1, HM_ATT_CLUTCH_MIN, 0.0, 0.0, HM_ATT_CLUTCH_MAX, 1.0, HM_ATT_CLUTCH_SENS, 1.0, HM_ATT_CLUTCH_POW, 2.0, NULL, 0.0, NULL, 0.0}, {HM_ATT_SPDLIM_CMD, GFCTRL_TYPE_NOT_AFFECTED, -1, NULL, 0.0, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0, NULL, 0.0} }; const int nbCmdControl = sizeof(CmdControlRef) / sizeof(CmdControlRef[0]); typedef struct { char *settings; char *parmName; } tCtrl; static tCtrl controlList[] = { {HM_SECT_JSPREF, HM_VAL_JOYSTICK}, {HM_SECT_KEYBPREF, HM_VAL_KEYBOARD}, {HM_SECT_MOUSEPREF, HM_VAL_MOUSE} }; static const int nbControl = sizeof(controlList) / sizeof(controlList[0]); char *Yn[] = {HM_VAL_YES, HM_VAL_NO}; /* int MouseControlUsed = 0; */ void HmReadPrefs(int index) { char *prm; 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; } }