Esempio n. 1
0
short xlw::XlfOper4::AsShort(const std::string& ErrorId, int * pxlret) const
{
    short s;
    int xlret = ConvertToShort(s);
    if (pxlret)
        *pxlret=xlret;
    else
        ThrowOnError(xlret,ErrorId+" conversion to short failed");
    return s;
};
Esempio n. 2
0
short xlw::XlfOper4::AsShort(int * pxlret) const
{
    short s;
    int xlret = ConvertToShort(s);
    if (pxlret)
        *pxlret=xlret;
    else
        ThrowOnError(xlret);
    return s;
};
Esempio n. 3
0
int ConvertReadShort(int fp,int16 *val) {
  unsigned char tmp[2];
  int s=0,o=0,l=2;
  while (o<2) {
    s=read(fp,tmp+o,l);
    o=o+s;
    l=l-s;
    if (s==0) return -1;
    if (s==-1) return -1;
  }
  ConvertToShort(tmp,val);
  return 0;
}
Esempio n. 4
0
DWORD Controller::GetState(XINPUT_STATE* pState)
{
	// Passthrough?
	if (m_passthrough)
		return XInputModuleManager::Get().XInputGetState(m_passthroughindex, pState);

	if (!ControllerManager::Get().XInputEnabled())
	{
		// Clear state
		if (pState) ZeroMemory(pState, sizeof(XINPUT_STATE));
		return ERROR_SUCCESS;
	}

	// If state haven't changed yet then...
	HRESULT hr = UpdateState();

#if 0
	PrintLog("UpdateState %u %u", dwUserIndex, hr);
#endif

	if (FAILED(hr)) return
		ERROR_DEVICE_NOT_CONNECTED;

	pState->Gamepad.wButtons = 0;
	pState->Gamepad.bLeftTrigger = 0;
	pState->Gamepad.bRightTrigger = 0;
	pState->Gamepad.sThumbLX = 0;
	pState->Gamepad.sThumbLY = 0;
	pState->Gamepad.sThumbRX = 0;
	pState->Gamepad.sThumbRY = 0;

	// timestamp packet
	pState->dwPacketNumber = GetTickCount();

	if (m_stateChanged != true)
	{
		// If first state is not aquired yet.
		if (m_emptyStateIsSet != true)
		{
			m_emptyState = m_state;
			m_emptyStateIsSet = true;
		}
		// Compare two states.
		int compareResult = memcmp(&m_emptyState, &m_state, sizeof(struct DIJOYSTATE2));
		// If nothing changed then...
		if (compareResult == 0)
		{
			// Return.
			return ERROR_SUCCESS;
		}
		else
		{
			// Allow to use values.
			m_stateChanged = true;
		}
	}

	bool dPadButtons[16];
	for (int i = 0; i < _countof(dPadButtons); ++i) dPadButtons[i] = false;
	// Loop trough D-Pad button states.
	for (int d = 0; d < _countof(m_state.rgdwPOV); ++d)
	{
		// No more than 4 D-Pads.
		if (d >= 4) break;
		int povdeg = m_state.rgdwPOV[d];
		if (povdeg >= 0)
		{
			// Split PoV degrees into 8 groups by
			// converting PoV degree from 0 to 36000 to number from 0 to 7.
			// This will allow to have more flexible degree values mapped to buttons.
			s8 y = ((2250 + povdeg) / 4500) % 8;
			// XINPUT_GAMEPAD_DPAD_UP
			dPadButtons[d * 4 + 0] = (y >= 0 && y <= 1) || y == 7;
			// XINPUT_GAMEPAD_DPAD_RIGHT
			dPadButtons[d * 4 + 1] = (y >= 1 && y <= 3);
			// XINPUT_GAMEPAD_DPAD_DOWN
			dPadButtons[d * 4 + 2] = (y >= 3 && y <= 5);
			// XINPUT_GAMEPAD_DPAD_LEFT
			dPadButtons[d * 4 + 3] = (y >= 5 && y <= 7);
		}
	}

	// --- Map POV to the D-pad ---
	if (m_mapping.DpadPOV > 0 && m_mapping.PovIsButton == false)
	{
		//INT pov = POVState(m_mapping.DpadPOV,dwUserIndex,Gamepad[dwUserIndex].povrotation);
		s8 dPadIndex = m_mapping.DpadPOV - 1;
		if (dPadButtons[dPadIndex * 4 + 0]) pState->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_UP;
		if (dPadButtons[dPadIndex * 4 + 1]) pState->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_RIGHT;
		if (dPadButtons[dPadIndex * 4 + 2]) pState->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_DOWN;
		if (dPadButtons[dPadIndex * 4 + 3]) pState->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_LEFT;
	}
	//else if (m_mapping.DpadPOV > 0 && m_mapping.PovIsButton == true)
	//{
	//	for (int i = 0; i < _countof(m_mapping.pov); ++i)
	//	{
	//		if (ButtonPressed(m_mapping.pov[i]))
	//		{
	//			pState->Gamepad.wButtons |= Config::povIDs[i];
	//		}
	//	}
	//}

	// Created so we can refer to each axis with an ID
	s32 axis[] =
	{
		m_state.lX,
		m_state.lY,
		m_state.lZ,
		m_state.lRx,
		m_state.lRy,
		m_state.lRz
	};

	s32 slider[] =
	{
		m_state.rglSlider[0],
		m_state.rglSlider[1]
	};


	// --- Map buttons ---
	if (ButtonPressed(m_mapping.guide))
		pState->Gamepad.wButtons |= 0x400;

	for (u32 i = 0; i < _countof(m_mapping.Button); ++i)
	{
		s8 mapId = m_mapping.Button[i].id;
		// Skip invalid mappings
		if (mapId == 0)
			continue;

		u32 mapIndex = std::abs(mapId) - 1;

		Config::MappingType buttonType = m_mapping.Button[i].type;

		if (buttonType == Config::DIGITAL)
		{
			if (ButtonPressed(mapId - 1))
				pState->Gamepad.wButtons |= Config::buttonIDs[i];
		}
		// D-Pad button to normal button.
		else if (buttonType == Config::DPADBUTTON)
		{
			if (mapIndex < _countof(dPadButtons) && dPadButtons[mapIndex])
				pState->Gamepad.wButtons |= Config::buttonIDs[i];
		}
		else
		{
			s32 *values;

			bool isRange = false;
			bool isHalf = false;

			switch (buttonType)
			{
			case Config::AXIS:
			case Config::HAXIS:
			case Config::CBUT:
				values = axis;
				break;
			case Config::SLIDER:
			case Config::HSLIDER:
				values = slider;
				break;
			default:
				values = axis;
				break;
			}

			switch (buttonType)
			{
				// Full range
			case Config::AXIS:
			case Config::SLIDER:
				isRange = true;
				break;
				// Half range
			case Config::HAXIS:
			case Config::HSLIDER:
			case Config::CBUT:
				isRange = true;
				isHalf = true;
				break;
			default:
				break;
			}


			s32 v = 0;
			s8 id = m_mapping.Button[i].id;
			u32 index = std::abs(id) - 1;
			if (id != 0)
			{
				v = values[index];
			}

			//        [  32768 steps | 32768 steps ]
			// DInput [      0 32767 | 32768 65535 ] 
			// XInput [ -32768    -1 |     0 32767 ]
			//
			u16 deadZone = (u16)m_mapping.Button[i].buttondz;
			bool invert = id < 0;
			s32 min = -32768;
			s32 max = 32767;
			s32 diValue;
			if (isHalf)
			{
				diValue = (invert) ? -1 - v : v;
			}
			else
			{
				diValue = (invert) ? max - v : v - min;
				deadZone = deadZone * 2;
			}
			if (isRange)
			{
				PrintLog("Axis/Slider: %d, invert = %d, half = %d, deadZone %d diValue %d", v, invert, isHalf, deadZone, diValue);
				if (diValue > deadZone)
				{
					pState->Gamepad.wButtons |= Config::buttonIDs[i];
				}
			}
		}
	}

	// --- Map triggers ---
	u8 *targetTrigger[] =
	{
		&pState->Gamepad.bLeftTrigger,
		&pState->Gamepad.bRightTrigger
	};

	for (u32 i = 0; i < _countof(m_mapping.Trigger); ++i)
	{
		s8 triggerMapId = m_mapping.Trigger[i].id;
		// Skip invalid mappings
		if (triggerMapId == 0)
			continue;

		s8 triggerMapIndex = (s8)std::abs(triggerMapId) - 1;

		Config::MappingType triggerType = m_mapping.Trigger[i].type;

		if (triggerType == Config::DIGITAL)
		{
			if (ButtonPressed(triggerMapIndex))
				*(targetTrigger[i]) = 255;
		}
		else if (triggerType == Config::DPADBUTTON)
		{
			if (triggerMapIndex < _countof(dPadButtons) && dPadButtons[triggerMapIndex])
				*(targetTrigger[i]) = 255;
		}
		else
		{
			s32 *values;

			switch (triggerType)
			{
			case Config::AXIS:
			case Config::HAXIS:
			case Config::CBUT:
				values = axis;
				break;

			case Config::SLIDER:
			case Config::HSLIDER:
				values = slider;
				break;

			default:
				values = axis;
				break;
			}

			s32 v = 0;

			if (m_mapping.Trigger[i].id > 0)
			{
				v = values[m_mapping.Trigger[i].id - 1];
			}
			else if (m_mapping.Trigger[i].id < 0)
			{
				v = -values[-m_mapping.Trigger[i].id - 1] - 1;
			}

			/* FIXME: axis negative max should be -32768
			--- v is the full range (-32768 .. +32767) that should be projected to 0...255

			--- Full ranges
			AXIS:	(	0 to 255 from -32768 to 32767) using axis
			SLIDER:	(	0 to 255 from -32768 to 32767) using slider
			------------------------------------------------------------------------------
			--- Half ranges
			HAXIS:	(	0 to 255 from 0 to 32767) using axis
			HSLIDER:	(	0 to 255 from 0 to 32767) using slider
			*/

			s32 v2 = 0;
			s32 offset = 0;
			s32 scaling = 1;

			switch (triggerType)
			{
				// Full range
			case Config::AXIS:
			case Config::SLIDER:
				scaling = 255;
				offset = 32767;
				break;

				// Half range
			case Config::HAXIS:
			case Config::HSLIDER:
			case Config::CBUT: // add /////////////////////////////////////////////////////////
				scaling = 127;
				offset = 0;
				break;

			default:
				scaling = 1;
				offset = 0;
				break;
			}

			//v2 = (v + offset) / scaling;
			// Add deadzones
			//*(targetTrigger[i]) = (BYTE) deadzone(v2, 0, 255, pController->triggerdz, 255);

			/////////////////////////////////////////////////////////////////////////////////////////
			if (triggerType == Config::CBUT)
			{

				if (ButtonPressed(m_mapping.Trigger[0].but)
					&& ButtonPressed(m_mapping.Trigger[1].but))
				{
					*(targetTrigger[0]) = 255;
					*(targetTrigger[1]) = 255;
				}

				if (ButtonPressed(m_mapping.Trigger[0].but)
					&& !ButtonPressed(m_mapping.Trigger[1].but))
				{
					v2 = (offset - v) / scaling;
					*(targetTrigger[0]) = 255;
					*(targetTrigger[1]) = 255 - (u8)deadzone(v2, 0, 255, m_mapping.Trigger[1].triggerdz, 255);
				}

				if (!ButtonPressed(m_mapping.Trigger[0].but)
					&& ButtonPressed(m_mapping.Trigger[1].but))
				{
					v2 = (offset + v) / scaling;
					*(targetTrigger[0]) = 255 - (u8)deadzone(v2, 0, 255, m_mapping.Trigger[0].triggerdz, 255);
					*(targetTrigger[1]) = 255;
				}

				if (!ButtonPressed(m_mapping.Trigger[0].but)
					&& !ButtonPressed(m_mapping.Trigger[1].but))
				{
					v2 = (offset + v) / scaling;
					*(targetTrigger[i]) = (u8)deadzone(v2, 0, 255, m_mapping.Trigger[i].triggerdz, 255);
				}

			}
			else
			{
				v2 = (offset + v) / scaling;
				*(targetTrigger[i]) = (u8)deadzone(v2, 0, 255, m_mapping.Trigger[i].triggerdz, 255);
			}

			/////////////////////////////////////////////////////////////////////////////////////////
		}
	}

	// --- Map thumbsticks ---

	// Created so we can refer to each axis with an ID
	SHORT *targetAxis[4] =
	{
		&pState->Gamepad.sThumbLX,
		&pState->Gamepad.sThumbLY,
		&pState->Gamepad.sThumbRX,
		&pState->Gamepad.sThumbRY
	};

	for (u32 i = 0; i < _countof(m_mapping.Axis); ++i)
	{

		if (m_mapping.Axis[i].axistodpad == 0)
		{
			s8 axisMapId = m_mapping.Axis[i].id;
			// Skip invalid mappings
			if (axisMapId != 0)
			{
				u32 index = std::abs(axisMapId) - 1;
				s32 value = axis[index];

				// Analog input
				if (m_mapping.Axis[i].analogType == Config::AXIS) value = axis[index];
				if (m_mapping.Axis[i].analogType == Config::SLIDER) value = slider[index];
				if (m_mapping.Axis[i].analogType != Config::NONE)
				{
					//        [  32768 steps | 32768 steps ]
					// DInput [      0 32767 | 32768 65535 ] 
					// XInput [ -32768    -1 |     0 32767 ]
					//
					//int xInput = dInputValue;
					s32 xInput = value;
					s32 deadZone = (s32)m_mapping.Axis[i].axisdeadzone;
					s32 antiDeadZone = (s32)m_mapping.Axis[i].antideadzone;
					s32 linear = (s32)m_mapping.Axis[i].axislinear;
					s32 min = -32768;
					s32 max = 32767;

					bool invert = axisMapId < 0;

					// If axis should be inverted, convert [-32768;32767] -> [32767;-32768]
					if (invert) xInput = -1 - xInput;

					// The following sections expect xInput values in range [0;32767]
					// So, convert to positive: [-32768;-1] -> [32767;0]
					bool negative = xInput < 0;
					if (negative) xInput = -1 - xInput;

					// If deadzone value is set then...
					if (deadZone > 0)
					{
						if (xInput > deadZone)
						{
							// [deadZone;32767] => [0;32767];
							xInput = (s32)((float)(xInput - deadZone) / (float)(max - deadZone) * (float)max);
						}
						else
						{
							xInput = 0;
						}
					}
					// If anti-deadzone value is set then...
					if (antiDeadZone > 0)
					{
						if (xInput > 0)
						{
							// [0;32767] => [antiDeadZone;32767];
							xInput = (s32)((float)(xInput) / (float)max * (float)(max - antiDeadZone) + antiDeadZone);
						}
					}
					// If linear value is set then...
					if (linear != 0 && xInput > 0)
					{
						// [antiDeadZone;32767] => [0;32767];
						float xInputF = (float)(xInput - antiDeadZone) / (float)(max - antiDeadZone) * (float)max;
						float linearF = (float)linear / 100.f;
						xInputF = ConvertToFloat((short)xInputF);
						float x = -xInputF;
						if (linearF < 0.f) x = 1.f + x;
						float v = ((float)sqrt(1.f - x * x));
						if (linearF < 0.f) v = 1.f - v;
						xInputF = xInputF + (2.f - v - xInputF - 1.f) * abs(linearF);
						xInput = ConvertToShort(xInputF);
						// [0;32767] => [antiDeadZone;32767];
						xInput = (s32)((float)(xInput) / (float)max * (float)(max - antiDeadZone) + antiDeadZone);
					}

					// If originally negative, convert back: [32767;0] -> [-32768;-1]
					if (negative) xInput = -1 - xInput;

					*(targetAxis[i]) = (s16)clamp(xInput, min, max);
					//return (short)xInput;
				}

			}


			Config::MappingType posType = m_mapping.Axis[i].positiveType;
			Config::MappingType negType = m_mapping.Axis[i].negativeType;
			s8 posMapId = m_mapping.Axis[i].positiveButtonID - 1;
			s8 negMapId = m_mapping.Axis[i].negativeButtonID - 1;
			// Map button to positive axis direction.
			if (posType == Config::DIGITAL && posMapId >= 0 && ButtonPressed(posMapId))
				*(targetAxis[i]) = 32767;
			// Map button to negative axis direction.
			if (negType == Config::DIGITAL && negMapId >= 0 && ButtonPressed(negMapId))
				*(targetAxis[i]) = -32768;
			// Map D-Pad button to positive axis direction.
			if (posType == Config::DPADBUTTON && posMapId >= 0 && posMapId < _countof(dPadButtons) && dPadButtons[posMapId])
				*(targetAxis[i]) = 32767;
			// Map D-Pad button to negative axis direction.
			if (negType == Config::DPADBUTTON && negMapId >= 0 && negMapId < _countof(dPadButtons) && dPadButtons[negMapId])
				*(targetAxis[i]) = -32768;

		}
		else
		{
			//PrintLog("x: %d, y: %d, z: %d",Gamepad[dwUserIndex].state.lX,Gamepad[dwUserIndex].state.lY,Gamepad[dwUserIndex].state.lZ);

			if (m_state.lX - m_mapping.Axis[i].a2doffset > m_mapping.Axis[i].a2ddeadzone)
				pState->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_LEFT;

			if (m_state.lX - m_mapping.Axis[i].a2doffset < -m_mapping.Axis[i].a2ddeadzone)
				pState->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_RIGHT;

			if (m_state.lY - m_mapping.Axis[i].a2doffset < -m_mapping.Axis[i].a2ddeadzone)
				pState->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_UP;

			if (m_state.lY - m_mapping.Axis[i].a2doffset > m_mapping.Axis[i].a2ddeadzone)
				pState->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_DOWN;
		}
	}

	// prevent sleep
	SetThreadExecutionState(ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED);

	return ERROR_SUCCESS;
}
Esempio n. 5
0
struct fitfp *fit_open(char *fitfile,char *inxfile) {

  
  int r1_pat[]={4,2,1,2,2,17,4,2,2,14,4,4,2,4,
                2,PULSE_PAT_LEN,2,2*LAG_TAB_LEN,1,ORIG_COMBF_SIZE,4,3,
		2,2*ORIG_MAX_RANGE,1,ORIG_MAX_RANGE,0,0};
  int status=0;
  union fit_out r;
  struct fitfp *ptr=NULL;
  int16 tmp,i,j;
  int32 inx_buf[4];
  struct radar_parms *prms=NULL;
  char *tmpbuf;
  ptr=malloc(sizeof(struct fitfp));
  if (ptr==NULL) return NULL;
 
  ptr->fitfp=-1;
  ptr->inxfp=-1;
  ptr->ibuf=NULL;
  ptr->fbuf=NULL;
  ptr->iptr=0;
  ptr->fptr=0;
  ptr->ctime=-1;
  ptr->stime=-1;
  ptr->etime=-1;
  ptr->fitfp=open(fitfile,O_RDONLY);
  if (ptr->fitfp==-1) {
    free(ptr);
    return NULL;
  }

  fstat(ptr->fitfp,&ptr->fstat);
  

  /* buffering disabled as it is actually slower to load into memory!  
  ptr->fbuf=malloc(ptr->fstat.st_size);
  if (ptr->fbuf !=NULL) {
    if (read(ptr->fitfp,ptr->fbuf,
             ptr->fstat.st_size) !=ptr->fstat.st_size) {
       close(ptr->fitfp);
       free(ptr->fbuf);
       free(ptr);
       return NULL;
    }
    close(ptr->fitfp);
    ptr->fitfp=-1;
  }
  */
  
  if (inxfile !=NULL) { /* open the index file */
    ptr->inxfp=open(inxfile,O_RDONLY);
    if (ptr->inxfp !=-1) { 
      fstat(ptr->inxfp,&ptr->istat);
      ptr->ibuf=malloc(ptr->istat.st_size);
      if ((ptr->ibuf !=NULL) &&
          (read(ptr->inxfp,ptr->ibuf,ptr->istat.st_size) 
           !=ptr->istat.st_size)) free(ptr->ibuf);
       close(ptr->inxfp);
       ptr->inxfp=-1;
    }
  } 

  if (ptr->fitfp !=-1) {
    ConvertReadShort(ptr->fitfp,&tmp);
    ptr->fit_recl=tmp;
    ConvertReadShort(ptr->fitfp,&tmp);
    ptr->inx_recl=tmp;
  
    tmpbuf=malloc(ptr->fit_recl);
    if (tmpbuf !=NULL) { /* get the header information */
       memset(tmpbuf,0,ptr->fit_recl);
       status=(read(ptr->fitfp,tmpbuf,ptr->fit_recl) !=ptr->fit_recl);
       /* now decode the header information */
       if (status==0) {
          for (i=0;(tmpbuf[i] !='\n') && (tmpbuf[i] !=0) && (i<80);i++) 
            ptr->header[i]=tmpbuf[i];
          ptr->header[i]=0;
          j=i+1;
          for (i=0;(tmpbuf[j+i] !='\n') && (tmpbuf[j+i] !=0) && (i<32);i++) 
            ptr->date[i]=tmpbuf[j+i];
          ptr->date[i]=0;
          j+=i+1;
          for (i=0;(tmpbuf[j+i] !=0) && (i<256);i++) 
            ptr->extra[i]=tmpbuf[j+i];
          ptr->extra[i]=0;
         
          /* okay extra the version information - look for the '.' */

          for (i=0;(ptr->header[i] !='.') && (ptr->header[i] !=0);i++);
          if (ptr->header[i] !=0) { 
             tmpbuf[i]=0; /* work backwards for the major number */
             for (j=0;(ptr->header[i-1-j] !=' ') && ((i-1-j)>0);j++)
               tmpbuf[i-1-j]=ptr->header[i-1-j];
             ptr->major_rev=atoi(tmpbuf+i-j);
             for (j=0;(ptr->header[i+1+j] !=' ') && 
                 (ptr->header[i+1+j] !=0);i++) tmpbuf[j]=ptr->header[i+1+j]; 
             tmpbuf[j]=0;
             ptr->minor_rev=atoi(tmpbuf);
             
          }
       }
       free(tmpbuf);
    }
    
    lseek(ptr->fitfp,ptr->fit_recl,SEEK_SET);

    /* read the first parameter block se we can determine the year */
    status=(read(ptr->fitfp,&r,sizeof(union fit_out)) !=sizeof(union fit_out));
    if (status==0) {
      ConvertBlock( (unsigned char *) &r,r1_pat);
      status=(r.r1.rrn !=0);
      prms=(struct radar_parms *) &(r.r1.plist[0]);
    }
    lseek(ptr->fitfp,ptr->fit_recl,SEEK_SET);
  } else {
    ConvertToShort(ptr->fbuf,&tmp);
    ptr->fit_recl=tmp;
    ConvertToShort(ptr->fbuf+2,&tmp);
    ptr->inx_recl=tmp;
    ptr->fptr=ptr->fit_recl;
    memcpy( (unsigned char *) &r,
            ptr->fbuf+ptr->fit_recl,sizeof(union fit_out));
    ConvertBlock( (unsigned char *) &r,r1_pat);
    status=(r.r1.rrn !=0);
    prms=(struct radar_parms *) &(r.r1.plist[0]);
  }

  if (status !=0) {
    if (ptr->fitfp !=-1) close(ptr->fitfp);
    if (ptr->fbuf !=NULL) free(ptr->fbuf);
    if (ptr->inxfp !=-1) close(ptr->inxfp);
    if (ptr->ibuf !=NULL) free(ptr->ibuf);
    free(ptr);
    return NULL; 
  }

  ptr->ctime=TimeYMDHMSToEpoch(prms->YEAR,prms->MONTH,prms->DAY,
			prms->HOUR,prms->MINUT,prms->SEC);

  ptr->stime=ptr->ctime;  
  


  if (fit_read_inx(ptr,inx_buf,-1)==0) {

    if (inx_buf[0] > inx_buf[1]) prms->YEAR++;
    /* generate the end time of the file */
 
    ptr->etime=TimeYMDHMSToEpoch(prms->YEAR,1,1,0,0,0)
                +inx_buf[1];   
    ptr->inx_srec=inx_buf[2]-2;
    ptr->inx_erec=inx_buf[3];     
  } else { /* corrupt index file */
    if (ptr->inxfp !=-1) close(ptr->inxfp);
    if (ptr->ibuf !=NULL) free(ptr->ibuf);
    ptr->ibuf=NULL;
    ptr->inxfp=-1;
  } 
  ptr->fitread=fit_read_current;
  return ptr;        
}
Esempio n. 6
0
struct DataMap *DataMapDecodeBuffer(char *buf,int size) {
  int c,x,n,i,e;
  int32 sn,an;
  int32 code,sze;
  char *name;
  char *tmp;
  char type;
  unsigned int off=0;  
  int32 tsze;

  struct DataMap *ptr;
  struct DataMapScalar *s;
  struct DataMapArray *a;
  
  ptr=DataMapMake();
  if (ptr==NULL) return NULL;
  ConvertToInt(buf+off,&code);
  off+=sizeof(int32);
  ConvertToInt(buf+off,&sze);
  off+=sizeof(int32);
  ConvertToInt(buf+off,&sn);
  off+=sizeof(int32);
  ConvertToInt(buf+off,&an);
  off+=sizeof(int32);
  if (sn>0) {
    ptr->snum=sn;
    ptr->scl=malloc(sizeof(struct DataMapScalar *)*sn); 
    if (ptr->scl==NULL) {
      DataMapFree(ptr);
      return NULL;
    }
    for (c=0;c<sn;c++) ptr->scl[c]=NULL;
  }

  if (an>0) {
    ptr->anum=an;
    ptr->arr=malloc(sizeof(struct DataMapArray *)*an);
    if (ptr->arr==NULL) {
      DataMapFree(ptr);
      return NULL;
    }
    for (c=0;c<an;c++) ptr->arr[c]=NULL;
  }

  for (c=0;c<sn;c++) {
    e=0;
    n=0; 
    while ((buf[off+n] !=0) && (off+n<size)) n++;
    if (off+n>=size) break;
    name=malloc(n+1);
    if (name==NULL) break;
    memcpy(name,buf+off,n+1);
    off+=n+1;
    type=buf[off];
    off++;
    s=malloc(sizeof(struct DataMapScalar));
    if (s==NULL) {
      free(name);
      break;
    }

    s->name=name;
    s->mode=6;
    s->type=type;
    ptr->scl[c]=s;   

    switch (s->type) {
    case DATACHAR:
      s->data.vptr=malloc(sizeof(char));
      if (s->data.vptr==NULL) {
        e=1;
        break;
      }
      s->data.cptr[0]=buf[off];
      off++;
      break;
    case DATASHORT:
      s->data.vptr=malloc(sizeof(int16));
      if (s->data.vptr==NULL) {
        e=1;
        break;
      }
      ConvertToShort(buf+off,s->data.sptr);
      off+=sizeof(int16);
      break;
    case DATAINT:
      s->data.vptr=malloc(sizeof(int32));
      if (s->data.vptr==NULL) {
        e=1;
        break;
      }
      ConvertToInt(buf+off,s->data.iptr);
      off+=sizeof(int32); 
      break;
    case DATALONG:
      s->data.vptr=malloc(sizeof(int64));
      if (s->data.vptr==NULL) {
        e=1;
        break;
      }
      ConvertToLong(buf+off,s->data.lptr);
      off+=sizeof(int64);
      break;
    case DATAUCHAR:
      s->data.vptr=malloc(sizeof(unsigned char));
      if (s->data.vptr==NULL) {
        e=1;
        break;
      }
      s->data.ucptr[0]=buf[off];
      off++;
      break;
    case DATAUSHORT:
      s->data.vptr=malloc(sizeof(uint16));
      if (s->data.vptr==NULL) {
        e=1;
        break;
      }
      ConvertToUShort(buf+off,s->data.usptr);
      off+=sizeof(uint16);
      break;
    case DATAUINT:
      s->data.vptr=malloc(sizeof(uint32));
      if (s->data.vptr==NULL) {
        e=1;
        break;
      }
      ConvertToUInt(buf+off,s->data.uiptr);
      off+=sizeof(uint32);
      break;
    case DATAULONG:
      s->data.vptr=malloc(sizeof(uint64));
      if (s->data.vptr==NULL) {
        e=1;
        break;
      }
      ConvertToULong(buf+off,s->data.ulptr);
      off+=sizeof(uint64);
      break;
    case DATAFLOAT:
      s->data.vptr=malloc(sizeof(float));
      if (s->data.vptr==NULL) {
        e=1;
        break;
      }
      ConvertToFloat(buf+off,s->data.fptr);
      off+=sizeof(float);
      break;
    case DATADOUBLE:
      s->data.vptr=malloc(sizeof(double));
      if (s->data.vptr==NULL) {
  	e=1;
        break;
      }
      ConvertToDouble(buf+off,s->data.dptr);
      off+=sizeof(double);
      break;
    case DATASTRING:
      n=0;
      while ((buf[off+n] !=0) && (off+n<size)) n++;
      if (off+n>=size) {
        e=1;
        break;
      }
 
      s->data.vptr=malloc(sizeof(char *));
      if (s->data.vptr==NULL) {
        e=1;
        break;
      }
      if (n !=0) {
        tmp=malloc(n+1);
        if (tmp==NULL) {
          e=1;
          break;
	}
        memcpy(tmp,buf+off,n+1);
        off+=n+1;
        *( (char **) s->data.vptr)=tmp;
      } else {
        *( (char **) s->data.vptr)=NULL;
        off++;
      }
      break;
    default:

      s->data.vptr=malloc(sizeof(struct DataMap *));
      if (s->data.vptr==NULL) {
  	e=1;
        break;
      }
      ConvertToInt(buf+off,&tsze);
      off+=sizeof(int32); 
      if (tsze !=0) { 
        *s->data.mptr=DataMapDecodeBuffer(buf+off,tsze);
        off+=tsze;
      } else *s->data.mptr=NULL;
    }
    if (e==1) break;
  }

  if (c !=sn) {
    DataMapFree(ptr);
    return NULL;
  }
  for (c=0;c<an;c++) {
    e=0;
    n=0;
    while ((buf[off+n] !=0) && (off+n<size)) n++;
    if (off+n>=size) break;
    name=malloc(n+1);
    if (name==NULL) break;
    memcpy(name,buf+off,n+1);
    off+=n+1;
    type=buf[off];
    off++;
    a=malloc(sizeof(struct DataMapArray));
    if (a==NULL) {
      free(name);
      break;
    }
    a->name=name;
    a->mode=7;
    a->type=type;
    ptr->arr[c]=a;   
    ConvertToInt(buf+off,(int32 *) &(a->dim));
    off+=sizeof(int32);
    a->rng=malloc(a->dim*sizeof(int32));
    if (a->rng==NULL) break;
    for (x=0;x<a->dim;x++)  {
       ConvertToInt(buf+off,&a->rng[x]);
       off+=sizeof(int32);
    }
    if (x!=a->dim) break;
    n=1;
    for (x=0;x<a->dim;x++) n=a->rng[x]*n;
    switch (a->type) {
    case DATACHAR:
      a->data.vptr=malloc(sizeof(char)*n);
      if (a->data.vptr==NULL) {
        e=1;
        break;
      }
      memcpy(a->data.cptr,buf+off,sizeof(char)*n);
      off+=sizeof(char)*n;
      break;
    case DATASHORT:
      a->data.vptr=malloc(sizeof(int16)*n);
      if (a->data.vptr==NULL) {
        e=1;
        break;
      }
      for (x=0;x<n;x++) {
        ConvertToShort(buf+off,&a->data.sptr[x]);
        off+=sizeof(int16);
      }
      break;
    case DATAINT:
      a->data.vptr=malloc(sizeof(int32)*n);
      if (a->data.vptr==NULL) {
        break;
        e=1;
      }
      for (x=0;x<n;x++) {
        ConvertToInt(buf+off,&a->data.iptr[x]);
        off+=sizeof(int32);
      }
      break;
    case DATALONG:
      a->data.vptr=malloc(sizeof(int64)*n);
      if (a->data.vptr==NULL) {
        e=1;
        break;
      }
      for (x=0;x<n;x++) {
        ConvertToLong(buf+off,&a->data.lptr[x]);
        off+=sizeof(int64);
      }
      break;

    case DATAUCHAR:
      a->data.vptr=malloc(sizeof(unsigned char)*n);
      if (a->data.vptr==NULL) {
        e=1;
        break;
      }
      memcpy(a->data.cptr,buf+off,sizeof(unsigned char)*n);
      off+=sizeof(unsigned char)*n;
      break;
    case DATAUSHORT:
      a->data.vptr=malloc(sizeof(uint16)*n);
      if (a->data.vptr==NULL) {
        e=1;
        break;
      }
      for (x=0;x<n;x++) {
        ConvertToUShort(buf+off,&a->data.usptr[x]);
        off+=sizeof(uint16);
      }
      break;
    case DATAUINT:
      a->data.vptr=malloc(sizeof(uint32)*n);
      if (a->data.vptr==NULL) {
        e=1;
        break;
      }
      for (x=0;x<n;x++) {
        ConvertToUInt(buf+off,&a->data.uiptr[x]);
        off+=sizeof(uint32);
      }
      break;
    case DATAULONG:
      a->data.vptr=malloc(sizeof(uint64)*n);
      if (a->data.vptr==NULL) {
        e=1;
        break;
      }
      for (x=0;x<n;x++) {
        ConvertToULong(buf+off,&a->data.ulptr[x]);
        off+=sizeof(uint64);
      }
      break;
    case DATAFLOAT:
      a->data.vptr=malloc(sizeof(float)*n);
      if (a->data.vptr==NULL) {
        e=1;
        break;
      }
      for (x=0;x<n;x++) {
        ConvertToFloat(buf+off,&a->data.fptr[x]);
        off+=sizeof(float);
      }
      break;
    case DATADOUBLE:
      a->data.vptr=malloc(sizeof(double)*n);
      if (a->data.vptr==NULL) {
        e=1;
        break;
      }
      for (x=0;x<n;x++) {
	ConvertToDouble(buf+off,&a->data.dptr[x]);
	off+=sizeof(double);
      }
      break;
    case DATASTRING:
      a->data.vptr=malloc(sizeof(char *)*n);
      if (a->data.vptr==NULL) {
        e=1;
        break;
      }  
      for (x=0;x<n;x++) {
         i=0;          
         while ((buf[off+i] !=0) && (off+i<size)) i++;
         if (off+i>=size) break;
         if (i !=0) {
           tmp=malloc(i+1);
           if (tmp==NULL) break;
           memcpy(tmp,buf+off,i+1); 
           ((char **) a->data.vptr)[x]=tmp;
	 } else ((char **) a->data.vptr)[x]=NULL;
         off+=i+1;
      }
      if (x !=n) e=1;
      break;
    default:
      a->data.mptr=malloc(sizeof(struct DataMap *)*n);
      if (a->data.vptr==NULL) {
	e=1;
        break;
      }
      for (x=0;x<n;x++) {
        ConvertToInt(buf+off,&tsze);
        off+=sizeof(int32);
        if (tsze !=0) {
          a->data.mptr[x]=DataMapDecodeBuffer(buf+off,tsze);
          off+=tsze;
	} else a->data.mptr[x]=0;      
      }
    }
    if (e==1) break;
  }

  if (c !=an) {
    DataMapFree(ptr);
    return NULL;
  }
 
  return ptr;
}
Esempio n. 7
0
DWORD Controller::GetState(XINPUT_STATE* pState)
{
	// Passthrough?
	if (m_passthrough)
		return XInputModuleManager::Get().XInputGetState(m_passthroughindex, pState);

	if (!ControllerManager::Get().XInputEnabled())
	{
		// Clear state
		if (pState) ZeroMemory(pState, sizeof(XINPUT_STATE));
		return ERROR_SUCCESS;
	}

	HRESULT hr = UpdateState();
#if 0
	PrintLog("UpdateState %u %u", dwUserIndex, hr);
#endif

	if (FAILED(hr)) return
		ERROR_DEVICE_NOT_CONNECTED;

	pState->Gamepad.wButtons = 0;
	pState->Gamepad.bLeftTrigger = 0;
	pState->Gamepad.bRightTrigger = 0;
	pState->Gamepad.sThumbLX = 0;
	pState->Gamepad.sThumbLY = 0;
	pState->Gamepad.sThumbRX = 0;
	pState->Gamepad.sThumbRY = 0;

	// timestamp packet
	pState->dwPacketNumber = GetTickCount();


	// --- Map POV to the D-pad ---
	if (m_mapping.DpadPOV > 0 && m_mapping.PovIsButton == false)
	{
		//INT pov = POVState(m_mapping.DpadPOV,dwUserIndex,Gamepad[dwUserIndex].povrotation);

		int povdeg = m_state.rgdwPOV[m_mapping.DpadPOV - 1];
		if (povdeg >= 0)
		{
			// Up-left, up, up-right, up (at 360 degrees)
			if (IN_RANGE2(povdeg, m_mapping.pov[Config::DPAD_LEFT] + 1, m_mapping.pov[Config::DPAD_UP]) || IN_RANGE2(povdeg, 0, m_mapping.pov[Config::DPAD_RIGHT] - 1))
				pState->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_UP;

			// Up-right, right, down-right
			if (IN_RANGE(povdeg, 0, m_mapping.pov[Config::DPAD_DOWN]))
				pState->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_RIGHT;

			// Down-right, down, down-left
			if (IN_RANGE(povdeg, m_mapping.pov[Config::DPAD_RIGHT], m_mapping.pov[Config::DPAD_LEFT]))
				pState->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_DOWN;

			// Down-left, left, up-left
			if (IN_RANGE(povdeg, m_mapping.pov[Config::DPAD_DOWN], m_mapping.pov[Config::DPAD_UP]))
				pState->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_LEFT;
		}
	}
	else if (m_mapping.PovIsButton == true)
	{
		for (int i = 0; i < _countof(m_mapping.pov); ++i)
		{
			if (ButtonPressed(m_mapping.pov[i]))
			{
				pState->Gamepad.wButtons |= Config::povIDs[i];
			}
		}
	}

	// Created so we can refer to each axis with an ID
	s32 axis[] =
	{
		m_state.lX,
		m_state.lY,
		m_state.lZ,
		m_state.lRx,
		m_state.lRy,
		m_state.lRz
	};

	s32 slider[] =
	{
		m_state.rglSlider[0],
		m_state.rglSlider[1]
	};









	// --- Map buttons ---
	if (ButtonPressed(m_mapping.guide))
		pState->Gamepad.wButtons |= 0x400;

	for (u32 i = 0; i < _countof(m_mapping.Button); ++i)
	{
		// Skip invalid mappings
		if (m_mapping.Button[i].id == 0)
			continue;

		Config::MappingType buttonType = m_mapping.Button[i].type;

		if (buttonType == Config::DIGITAL)
		{
			if (ButtonPressed(m_mapping.Button[i].id -1))
				pState->Gamepad.wButtons |= Config::buttonIDs[i];
		}
		else
		{
			s32 *values;

			switch (buttonType)
			{
			case Config::AXIS:
			case Config::HAXIS:
			case Config::CBUT:
				values = axis;
				break;

			case Config::SLIDER:
			case Config::HSLIDER:
				values = slider;
				break;

			default:
				values = axis;
				break;
			}

			s32 v = 0;

			if (m_mapping.Button[i].id > 0)
			{
				v = values[m_mapping.Button[i].id - 1];
			}
			else if (m_mapping.Button[i].id < 0)
			{
				v = -values[-m_mapping.Button[i].id - 1] - 1;
			}

			s32 v2 = 0;
			s32 offset = 0;
			s32 scaling = 1;

			switch (buttonType)
			{
				// Full range
			case Config::AXIS:
			case Config::SLIDER:
				scaling = 255;
				offset = 32767;
				break;

				// Half range
			case Config::HAXIS:
			case Config::HSLIDER:
			case Config::CBUT:
				scaling = 127;
				offset = 0;
				break;

			default:
				scaling = 1;
				offset = 0;
				break;
			}

			v2 = (offset + v) / scaling;
			if (deadzone(v2, 0, 1, m_mapping.Button[i].buttondz, 1) > 0)
			{
				pState->Gamepad.wButtons |= Config::buttonIDs[i];
			}
		}
	}

	// --- Map triggers ---
	u8 *targetTrigger[] =
	{
		&pState->Gamepad.bLeftTrigger,
		&pState->Gamepad.bRightTrigger
	};

	for (u32 i = 0; i < _countof(m_mapping.Trigger); ++i)
	{
		// Skip invalid mappings
		if (m_mapping.Trigger[i].id == 0)
			continue;

		Config::MappingType triggerType = m_mapping.Trigger[i].type;

		if (triggerType == Config::DIGITAL)
		{
			if (ButtonPressed(m_mapping.Trigger[i].id - 1))*(targetTrigger[i]) = 255;
		}
		else
		{
			s32 *values;

			switch (triggerType)
			{
			case Config::AXIS:
			case Config::HAXIS:
			case Config::CBUT:
				values = axis;
				break;

			case Config::SLIDER:
			case Config::HSLIDER:
				values = slider;
				break;

			default:
				values = axis;
				break;
			}

			s32 v = 0;

			if (m_mapping.Trigger[i].id > 0)
			{
				v = values[m_mapping.Trigger[i].id - 1];
			}
			else if (m_mapping.Trigger[i].id < 0)
			{
				v = -values[-m_mapping.Trigger[i].id - 1] - 1;
			}

			/* FIXME: axis negative max should be -32768
			--- v is the full range (-32768 .. +32767) that should be projected to 0...255

			--- Full ranges
			AXIS:	(	0 to 255 from -32768 to 32767) using axis
			SLIDER:	(	0 to 255 from -32768 to 32767) using slider
			------------------------------------------------------------------------------
			--- Half ranges
			HAXIS:	(	0 to 255 from 0 to 32767) using axis
			HSLIDER:	(	0 to 255 from 0 to 32767) using slider
			*/

			s32 v2 = 0;
			s32 offset = 0;
			s32 scaling = 1;

			switch (triggerType)
			{
				// Full range
			case Config::AXIS:
			case Config::SLIDER:
				scaling = 255;
				offset = 32767;
				break;

				// Half range
			case Config::HAXIS:
			case Config::HSLIDER:
			case Config::CBUT: // add /////////////////////////////////////////////////////////
				scaling = 127;
				offset = 0;
				break;

			default:
				scaling = 1;
				offset = 0;
				break;
			}

			//v2 = (v + offset) / scaling;
			// Add deadzones
			//*(targetTrigger[i]) = (BYTE) deadzone(v2, 0, 255, pController->triggerdz, 255);

			/////////////////////////////////////////////////////////////////////////////////////////
			if (triggerType == Config::CBUT)
			{

				if (ButtonPressed(m_mapping.Trigger[0].but)
					&& ButtonPressed(m_mapping.Trigger[1].but))
				{
					*(targetTrigger[0]) = 255;
					*(targetTrigger[1]) = 255;
				}

				if (ButtonPressed(m_mapping.Trigger[0].but)
					&& !ButtonPressed(m_mapping.Trigger[1].but))
				{
					v2 = (offset - v) / scaling;
					*(targetTrigger[0]) = 255;
					*(targetTrigger[1]) = 255 - (u8)deadzone(v2, 0, 255, m_mapping.Trigger[1].triggerdz, 255);
				}

				if (!ButtonPressed(m_mapping.Trigger[0].but)
					&& ButtonPressed(m_mapping.Trigger[1].but))
				{
					v2 = (offset + v) / scaling;
					*(targetTrigger[0]) = 255 - (u8)deadzone(v2, 0, 255, m_mapping.Trigger[0].triggerdz, 255);
					*(targetTrigger[1]) = 255;
				}

				if (!ButtonPressed(m_mapping.Trigger[0].but)
					&& !ButtonPressed(m_mapping.Trigger[1].but))
				{
					v2 = (offset + v) / scaling;
					*(targetTrigger[i]) = (u8)deadzone(v2, 0, 255, m_mapping.Trigger[i].triggerdz, 255);
				}

			}
			else
			{
				v2 = (offset + v) / scaling;
				*(targetTrigger[i]) = (u8)deadzone(v2, 0, 255, m_mapping.Trigger[i].triggerdz, 255);
			}

			/////////////////////////////////////////////////////////////////////////////////////////
		}
	}

	// --- Map thumbsticks ---

	// Created so we can refer to each axis with an ID
	SHORT *targetAxis[4] =
	{
		&pState->Gamepad.sThumbLX,
		&pState->Gamepad.sThumbLY,
		&pState->Gamepad.sThumbRX,
		&pState->Gamepad.sThumbRY
	};

	for (u32 i = 0; i < _countof(m_mapping.Axis); ++i)
	{

		if (m_mapping.Axis[i].axistodpad == 0)
		{
			// Skip invalid mappings
			if (m_mapping.Axis[i].id != 0)
			{
				u32 index = std::abs(m_mapping.Axis[i].id) - 1;
				s32 value = axis[index];

				// Analog input
				if (m_mapping.Axis[i].analogType == Config::AXIS) value = axis[index];
				if (m_mapping.Axis[i].analogType == Config::SLIDER) value = slider[index];

				if (m_mapping.Axis[i].analogType != Config::NONE)
				{
					//        [ 32768 steps | 32768 steps ]
					// DInput [ 0     32767 | 32768 65535 ] 
					// XInput [ 32768    -1 | 0     32767 ]
					//
					//int xInput = dInputValue;
					s32 xInput = value;
					s32 deadZone = (s32)m_mapping.Axis[i].axisdeadzone;
					s32 antiDeadZone = (s32)m_mapping.Axis[i].antideadzone;
					s32 linear = (s32)m_mapping.Axis[i].axislinear;
					s32 min = -32768;
					s32 max = 32767;

					bool invert = m_mapping.Axis[i].id < 0;

					// If axis should be inverted, convert [-32768;32767] -> [32767;-32768]
					if (invert) xInput = -1 - xInput;

					// The following sections expect xInput values in range [0;32767]
					// So, convert to positive: [-32768;-1] -> [32767;0]
					bool negative = xInput < 0;
					if (negative) xInput = -1 - xInput;

					// If deadzone value is set then...
					if (deadZone > 0)
					{
						if (xInput > deadZone)
						{
							// [deadZone;32767] => [0;32767];
							xInput = (s32)((float)(xInput - deadZone) / (float)(max - deadZone) * (float)max);
						}
						else
						{
							xInput = 0;
						}
					}
					// If anti-deadzone value is set then...
					if (antiDeadZone > 0)
					{
						if (xInput > 0)
						{
							// [0;32767] => [antiDeadZone;32767];
							xInput = (s32)((float)(xInput) / (float)max * (float)(max - antiDeadZone) + antiDeadZone);
						}
					}
					// If linear value is set then...
					if (linear != 0 && xInput > 0)
					{
						// [antiDeadZone;32767] => [0;32767];
						float xInputF = (float)(xInput - antiDeadZone) / (float)(max - antiDeadZone) * (float)max;
						float linearF = (float)linear / 100.f;
						xInputF = ConvertToFloat((short)xInputF);
						float x = -xInputF;
						if (linearF < 0.f) x = 1.f + x;
						float v = ((float)sqrt(1.f - x * x));
						if (linearF < 0.f) v = 1.f - v;
						xInputF = xInputF + (2.f - v - xInputF - 1.f) * abs(linearF);
						xInput = ConvertToShort(xInputF);
						// [0;32767] => [antiDeadZone;32767];
						xInput = (s32)((float)(xInput) / (float)max * (float)(max - antiDeadZone) + antiDeadZone);
					}

					// If originally negative, convert back: [32767;0] -> [-32768;-1]
					if (negative) xInput = -1 - xInput;

					*(targetAxis[i]) = (s16)clamp(xInput, min, max);
					//return (short)xInput;
				}
			}

			// Map axis to Button: Digital input, positive direction
			if (m_mapping.Axis[i].hasDigital && m_mapping.Axis[i].positiveButtonID >= 0)
			{
				if (ButtonPressed(m_mapping.Axis[i].positiveButtonID))
					*(targetAxis[i]) = 32767;
			}

			// Map axis to Button: Digital input, negative direction
			if (m_mapping.Axis[i].hasDigital && m_mapping.Axis[i].negativeButtonID >= 0)
			{
				if (ButtonPressed(m_mapping.Axis[i].negativeButtonID))
					*(targetAxis[i]) = -32768;
			}
		}
		else
		{
			//PrintLog("x: %d, y: %d, z: %d",Gamepad[dwUserIndex].state.lX,Gamepad[dwUserIndex].state.lY,Gamepad[dwUserIndex].state.lZ);

			if (m_state.lX - m_mapping.Axis[i].a2doffset > m_mapping.Axis[i].a2ddeadzone)
				pState->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_LEFT;

			if (m_state.lX - m_mapping.Axis[i].a2doffset < -m_mapping.Axis[i].a2ddeadzone)
				pState->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_RIGHT;

			if (m_state.lY - m_mapping.Axis[i].a2doffset < -m_mapping.Axis[i].a2ddeadzone)
				pState->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_UP;

			if (m_state.lY - m_mapping.Axis[i].a2doffset > m_mapping.Axis[i].a2ddeadzone)
				pState->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_DOWN;
		}
	}

	return ERROR_SUCCESS;
}
Esempio n. 8
0
struct DataMap *DataMapDecodeBuffer(unsigned char *buf,int size) {
  int c,x,n,i;
  int32 sn,an;
  int32 code,sze;
  char *name;
  unsigned char *tmp;
  char type;
  unsigned int off=0;  

  struct DataMap *ptr;
  struct DataMapScalar *s;
  struct DataMapArray *a;
  
  ptr=DataMapMake();
  if (ptr==NULL) return NULL;
  ConvertToInt(buf+off,&code);
  off+=sizeof(int32);
  ConvertToInt(buf+off,&sze);
  off+=sizeof(int32);
  ConvertToInt(buf+off,&sn);
  off+=sizeof(int32);
  ConvertToInt(buf+off,&an);
  off+=sizeof(int32);
  if (sn>0) {
    ptr->snum=sn;
    ptr->scl=malloc(sizeof(struct DataMapScalar *)*sn); 
    if (ptr->scl==NULL) {
      DataMapFree(ptr);
      return NULL;
    }
    for (c=0;c<sn;c++) ptr->scl[c]=NULL;
  }

  if (an>0) {
    ptr->anum=an;
    ptr->arr=malloc(sizeof(struct DataMapArray *)*an);
    if (ptr->arr==NULL) {
      DataMapFree(ptr);
      return NULL;
    }
    for (c=0;c<an;c++) ptr->arr[c]=NULL;
  }

  for (c=0;c<sn;c++) {
    n=0;
    while ((buf[off+n] !=0) && (off+n<size)) n++;
    if (off+n>=size) break;
    name=malloc(n+1);
    if (name==NULL) break;
    memcpy(name,buf+off,n+1);
    off+=n+1;
    type=buf[off];
    off++;
    s=malloc(sizeof(struct DataMapScalar));
    if (s==NULL) {
      free(name);
      break;
    }

    s->name=name;
    s->mode=1;
    s->type=type;
    ptr->scl[c]=s;   

    switch (s->type) {
    case DATACHAR:
      s->data.vptr=malloc(sizeof(char));
      if (s->data.vptr==NULL) break;
      s->data.cptr[0]=buf[off];
      off++;
      break;
    case DATASHORT:
      s->data.vptr=malloc(sizeof(int16));
      if (s->data.vptr==NULL) break;
      ConvertToShort(buf+off,s->data.sptr);
      off+=sizeof(int16);
      break;
    case DATAINT:
      s->data.vptr=malloc(sizeof(int32));
      if (s->data.vptr==NULL) break;
      ConvertToInt(buf+off,s->data.iptr);
      off+=sizeof(int32); 
      break;
    case DATAFLOAT:
      s->data.vptr=malloc(sizeof(float));
      if (s->data.vptr==NULL) break;
      ConvertToFloat(buf+off,s->data.fptr);
      off+=sizeof(float);
      break;
    case DATADOUBLE:
      s->data.vptr=malloc(sizeof(double));
      if (s->data.vptr==NULL) break;
      ConvertToDouble(buf+off,s->data.dptr);
      off+=sizeof(double);
      break;
    default:
      n=0;
      while ((buf[off+n] !=0) && (off+n<size)) n++;
      if (off+n>=size) break;
      s->data.vptr=malloc(sizeof(char *));
      if (s->data.vptr==NULL) break;
      tmp=realloc(ptr->buf,ptr->sze+n+1);
      if (tmp==NULL) break;
      ptr->buf=tmp;
      memcpy(ptr->buf+ptr->sze,buf+off,n+1);
      off+=n+1;
      *(s->data.optr)=ptr->sze;
      ptr->sze+=n+1;
      break;
    }
  }

  if (c !=sn) {
    DataMapFree(ptr);
    return NULL;
  }
  for (c=0;c<an;c++) {
    n=0;
    while ((buf[off+n] !=0) && (off+n<size)) n++;
    if (off+n>=size) break;
    name=malloc(n+1);
    if (name==NULL) break;
    memcpy(name,buf+off,n+1);
    off+=n+1;
    type=buf[off];
    off++;
    a=malloc(sizeof(struct DataMapArray));
    if (a==NULL) {
      free(name);
      break;
    }
    a->name=name;
    a->mode=3;
    a->type=type;
    ptr->arr[c]=a;   
    ConvertToInt(buf+off,(int32 *) &(a->dim));
    off+=sizeof(int32);
    a->rng=malloc(a->dim*sizeof(int32));
    if (a->rng==NULL) break;
    for (x=0;x<a->dim;x++)  {
       ConvertToInt(buf+off,&a->rng[x]);
       off+=sizeof(int32);
    }
    if (x!=a->dim) break;
    n=1;
    for (x=0;x<a->dim;x++) n=a->rng[x]*n;
    switch (a->type) {
    case DATACHAR:
      a->data.vptr=malloc(sizeof(char)*n);
      if (a->data.vptr==NULL) break;
      memcpy(a->data.cptr,buf+off,sizeof(char)*n);
      off+=sizeof(char)*n;
      break;
    case DATASHORT:
      a->data.vptr=malloc(sizeof(int16)*n);
      if (a->data.vptr==NULL) break;
      for (x=0;x<n;x++) {
        ConvertToShort(buf+off,&a->data.sptr[x]);
        off+=sizeof(int16);
      }
      break;
    case DATAINT:
      a->data.vptr=malloc(sizeof(int32)*n);
      if (a->data.vptr==NULL) break;
      for (x=0;x<n;x++) {
        ConvertToInt(buf+off,&a->data.iptr[x]);
        off+=sizeof(int32);
      }
      break;
    case DATAFLOAT:
      a->data.vptr=malloc(sizeof(float)*n);
      if (a->data.vptr==NULL) break;
      for (x=0;x<n;x++) {
        ConvertToFloat(buf+off,&a->data.fptr[x]);
        off+=sizeof(float);
      }
      break;
    case DATADOUBLE:
      a->data.vptr=malloc(sizeof(double)*n);
      if (a->data.vptr==NULL) break;
      for (x=0;x<n;x++) {
	ConvertToDouble(buf+off,&a->data.dptr[x]);
	off+=sizeof(double);
      }
      break;
    default:
      a->data.vptr=malloc(sizeof(char *)*n);
      if (a->data.vptr==NULL) break;
          
      for (x=0;x<n;x++) {
         i=0;
          
         while ((buf[off+i] !=0) && (off+i<size)) i++;
         if (off+i>=size) break;
         tmp=realloc(ptr->buf,ptr->sze+i+1);
         if (tmp==NULL) break;
         ptr->buf=tmp;
         memcpy(ptr->buf+ptr->sze,buf+off,i+1); 
         a->data.optr[x]=ptr->sze;
         ptr->sze+=i+1;
         off+=i+1;
      }
      if (x !=n) break;
    }
  }

  if (c !=an) {
    DataMapFree(ptr);
    return NULL;
  }
  

  for (c=0;c<ptr->snum;c++) {
    if (ptr->scl[c]==NULL) continue;
    s=ptr->scl[c];
    if (s->type==DATASTRING) 
      *((char **) s->data.vptr)=(char *) (ptr->buf+*(s->data.optr));



  }
  
  for (c=0;c<ptr->anum;c++) {
    if (ptr->arr[c]==NULL) continue;
    a=ptr->arr[c];
    if (a->type==DATASTRING) {
      n=1;
      for (x=0;x<a->dim;x++) n=a->rng[x]*n;
      for (x=0;x<n;x++) 
	( (char **) a->data.vptr)[x]=(char *) (ptr->buf+a->data.optr[x]);
    }
  }
  return ptr;
}
Esempio n. 9
0
int raw_read_current(struct rawfp *fp,struct rawdata *raw_data) { 

   /* read raw data block from file */


   int radar_parms_pat[]={1,2,2,17,4,2,2,14,4,4,2,4,0,0};
   int i;
   int16 range;
   int j;
   int16 prev_range;
   int xcf_data;
   unsigned int stat;
   int16 num_byte;
   int32 rec_num=0;
   unsigned char *inbuf;
   unsigned char *inbuf_ptr;

   xcf_data = 0;
   prev_range = -1;

   inbuf=malloc(sizeof(struct rawdata));

   /* zero out the raw data buffer */
   memset(raw_data,0,sizeof(struct rawdata));
   fp->rlen=0;
   do {
     if (ConvertReadShort(fp->rawfp,&num_byte) !=0) {
       free(inbuf);
       return -1;
     }
     fp->rlen+=num_byte;
     fp->ptr+=num_byte;
     num_byte = num_byte - 2;
     stat = read(fp->rawfp,inbuf,num_byte);
     if(stat != num_byte) {
       free(inbuf);
       return -1; 
     }
     inbuf_ptr=inbuf;
     ConvertToInt(inbuf_ptr,&rec_num);
   } while (rec_num==0); 
   inbuf_ptr = inbuf_ptr + 12;  /* skip rec_num + rawwrite */  
   num_byte = num_byte - 12;
  
   /* zero out the raw data buffer */

   /* copy radar_parms */   
   ConvertBlock(inbuf_ptr,radar_parms_pat);
   memcpy((void *) &(raw_data->PARMS),inbuf_ptr,sizeof(struct radar_parms)); 
   inbuf_ptr = inbuf_ptr + sizeof(struct radar_parms);
   num_byte = num_byte - sizeof(struct radar_parms);

   /* copy the pulse pattern */
  
   for (i=0;i<raw_data->PARMS.MPPUL;i++) {
      ConvertToShort(inbuf_ptr,&raw_data->PULSE_PATTERN[i]);
      inbuf_ptr+=sizeof(int16);
      num_byte-=sizeof(int16);
   }

   /* copy the lag table */

    for(j=0;j < 2; ++j)
      for(i=0; i < raw_data->PARMS.MPLGS; ++i) {
         ConvertToShort(inbuf_ptr,&raw_data->LAG_TABLE[j][i]);
         inbuf_ptr = inbuf_ptr + sizeof(int16);
         num_byte = num_byte - sizeof(int16);
      } 
	  
   /* copy comment buffer */
   memcpy(raw_data->COMBF,inbuf_ptr,ORIG_COMBF_SIZE);
   inbuf_ptr = inbuf_ptr + ORIG_COMBF_SIZE;
   num_byte = num_byte - ORIG_COMBF_SIZE;

   /* decompress and copy the lag-0 powers */
   for(i=0 ; i < raw_data->PARMS.NRANG ; ++i) {
      raw_data->pwr0[i] = dcmpr(inbuf_ptr);
      inbuf_ptr = inbuf_ptr + sizeof(int16);
      num_byte = num_byte - sizeof(int16);
   }

   /* decompress and copy acfs */
   while ( num_byte > 0 ) {
      ConvertToShort(inbuf_ptr,&range);
      --range;
      inbuf_ptr = inbuf_ptr + sizeof(int16);
      num_byte = num_byte - sizeof(int16);

      if((range <= prev_range) && (raw_data->PARMS.XCF))
		   xcf_data = 1;

      for(i = 0; i < raw_data->PARMS.MPLGS ; ++i) {   
         for(j=0 ; j < 2; ++j) {
	    if (xcf_data) raw_data->xcfd[range][i][j] = dcmpr(inbuf_ptr);
	    else raw_data->acfd[range][i][j] = dcmpr(inbuf_ptr);
            inbuf_ptr = inbuf_ptr + sizeof(int16);
            num_byte = num_byte - sizeof(int16);
         }
      }
		
      prev_range = range;

   } 
  fp->ctime=TimeYMDHMSToEpoch(raw_data->PARMS.YEAR,
			raw_data->PARMS.MONTH,
			raw_data->PARMS.DAY,
			raw_data->PARMS.HOUR,
			raw_data->PARMS.MINUT,
			raw_data->PARMS.SEC);
  free(inbuf);  
  return 0;
}
Esempio n. 10
0
int CFitRead(struct CFitfp *fptr,struct CFitdata *ptr) {
  float val;
  int i;
  
  if (fptr->fp !=-1) {
    if (ConvertReadDouble(fptr->fp,&ptr->time) !=0) return -1;
    if (ConvertReadShort(fptr->fp,&ptr->stid) !=0) return -1;
    if (ConvertReadShort(fptr->fp,&ptr->scan) !=0) return -1;
    if (ConvertReadShort(fptr->fp,&ptr->cp) !=0) return -1;
    if (ConvertReadShort(fptr->fp,&ptr->bmnum) !=0) return -1;
    if (ConvertReadFloat(fptr->fp,&ptr->bmazm) !=0) return -1;
    if (ConvertReadShort(fptr->fp,&ptr->channel) !=0) return -1;
    if (ConvertReadShort(fptr->fp,&ptr->intt.sc) !=0) return -1;
    if (ConvertReadInt(fptr->fp,&ptr->intt.us) !=0) return -1;
    if (ConvertReadShort(fptr->fp,&ptr->frang) !=0) return -1;
    if (ConvertReadShort(fptr->fp,&ptr->rsep) !=0) return -1;
    if (ConvertReadShort(fptr->fp,&ptr->rxrise) !=0) return -1;
    if (ConvertReadShort(fptr->fp,&ptr->tfreq) !=0) return -1;
    if (ConvertReadInt(fptr->fp,&ptr->noise) !=0) return -1;
    if (ConvertReadShort(fptr->fp,&ptr->atten) !=0) return -1;
    if (ConvertReadShort(fptr->fp,&ptr->nave) !=0) return -1;
    if (ConvertReadShort(fptr->fp,&ptr->nrang) !=0) return -1;
    
  } else {
    if ((fptr->fptr+sizeof(double)+7*sizeof(int16)+
         sizeof(int32)+sizeof(float))>fptr->fsze) return -1;
    ConvertToDouble(&fptr->fbuf[fptr->fptr],&ptr->time);
    fptr->fptr+=sizeof(double);
    ConvertToShort(fptr->fbuf+fptr->fptr,&ptr->stid);
    fptr->fptr+=sizeof(int16);
    ConvertToShort(fptr->fbuf+fptr->fptr,&ptr->scan);
    fptr->fptr+=sizeof(int16);
    ConvertToShort(fptr->fbuf+fptr->fptr,&ptr->cp);
    fptr->fptr+=sizeof(int16);
    ConvertToShort(fptr->fbuf+fptr->fptr,&ptr->bmnum);
    fptr->fptr+=sizeof(int16);
    ConvertToFloat(fptr->fbuf+fptr->fptr,&ptr->bmazm);
    fptr->fptr+=sizeof(float);
    ConvertToShort(fptr->fbuf+fptr->fptr,&ptr->channel);
    fptr->fptr+=sizeof(int16);
    ConvertToShort(fptr->fbuf+fptr->fptr,&ptr->intt.sc);
    fptr->fptr+=sizeof(int16);
    ConvertToInt(fptr->fbuf+fptr->fptr,&ptr->intt.us);
    fptr->fptr+=sizeof(int32);
    ConvertToShort(fptr->fbuf+fptr->fptr,&ptr->frang);
    fptr->fptr+=sizeof(int16);
    ConvertToShort(fptr->fbuf+fptr->fptr,&ptr->rsep);
    fptr->fptr+=sizeof(int16);
    ConvertToShort(fptr->fbuf+fptr->fptr,&ptr->rxrise);
    fptr->fptr+=sizeof(int16);
    ConvertToShort(fptr->fbuf+fptr->fptr,&ptr->tfreq);
    fptr->fptr+=sizeof(int16);
    ConvertToInt(fptr->fbuf+fptr->fptr,&ptr->noise);
    fptr->fptr+=sizeof(int32);
    ConvertToShort(fptr->fbuf+fptr->fptr,&ptr->atten);
    fptr->fptr+=sizeof(int16);
    ConvertToShort(fptr->fbuf+fptr->fptr,&ptr->nave);
    fptr->fptr+=sizeof(int16);
    ConvertToShort(fptr->fbuf+fptr->fptr,&ptr->nrang);
    fptr->fptr+=sizeof(int16);
  }
  fptr->ctime=ptr->time;

  if (fptr->fp !=-1) {
    if (read(fptr->fp,&ptr->num,1) !=1) return -1;
    if (read(fptr->fp,ptr->rng,ptr->num) !=ptr->num) return -1;
  } else {
    if (fptr->fptr>=fptr->fsze) return -1;
    ptr->num=fptr->fbuf[fptr->fptr];
    fptr->fptr+=1;
    if ((fptr->fptr+ptr->num)>=fptr->fsze) return -1;
    memcpy(ptr->rng,&fptr->fbuf[fptr->fptr],ptr->num);
    fptr->fptr+=ptr->num;
  }

  for (i=0;i<ptr->num;i++) {
    if (fptr->fp !=-1) {
      if (read(fptr->fp,&ptr->data[i].gsct,1) !=1) return -1;
      if (ptr->data[i].gsct==EOF) return -1; 
      if (ConvertReadFloat(fptr->fp,&val) !=0) return -1;
      ptr->data[i].p_0=val;  
      if (ConvertReadFloat(fptr->fp,&val) !=0) return -1;
      ptr->data[i].p_0_e=val;      
      if (ConvertReadFloat(fptr->fp,&val) !=0) return -1;
      ptr->data[i].v=val;
      if (ConvertReadFloat(fptr->fp,&val) !=0) return -1;
      ptr->data[i].p_l=val;
      if (ConvertReadFloat(fptr->fp,&val) !=0) return -1;
      ptr->data[i].w_l=val;
      if (ConvertReadFloat(fptr->fp,&val) !=0) return -1;
      ptr->data[i].v_e=val;
      if (ConvertReadFloat(fptr->fp,&val) !=0) return -1;
      ptr->data[i].p_l_e=val;
      if (ConvertReadFloat(fptr->fp,&val) !=0) return -1;
      ptr->data[i].w_l_e=val;
    } else {
      if ((fptr->fptr+1+sizeof(float)*6)>=fptr->fsze) return -1;
      ptr->data[i].gsct=fptr->fbuf[fptr->fptr];
      fptr->fptr+=1;
      ConvertToFloat(fptr->fbuf+fptr->fptr,&val);
      fptr->fptr+=sizeof(float);
      ptr->data[i].p_0=val;
      ConvertToFloat(fptr->fbuf+fptr->fptr,&val);
      fptr->fptr+=sizeof(float);
      ptr->data[i].p_0_e=val;
      ConvertToFloat(fptr->fbuf+fptr->fptr,&val);
      fptr->fptr+=sizeof(float);
      ptr->data[i].v=val;
      ConvertToFloat(fptr->fbuf+fptr->fptr,&val);
      fptr->fptr+=sizeof(float);
      ptr->data[i].p_l=val;
      ConvertToFloat(fptr->fbuf+fptr->fptr,&val);
      fptr->fptr+=sizeof(float);
      ptr->data[i].w_l=val;
      ConvertToFloat(fptr->fbuf+fptr->fptr,&val);
      fptr->fptr+=sizeof(float);
      ptr->data[i].v_e=val;
      ConvertToFloat(fptr->fbuf+fptr->fptr,&val);
      fptr->fptr+=sizeof(float);
      ptr->data[i].p_l_e=val;
      ConvertToFloat(fptr->fbuf+fptr->fptr,&val);
      fptr->fptr+=sizeof(float);
      ptr->data[i].w_l_e=val;
    }
  }
  
  return 0;
}