I had two flock of bird sensor and i have refer to example code #8 in manual, the c++ code is working for me.
But i only get one sensor data from the c sharp project. The problem is that in the C# example, bird_data[1] and bird_data[2] appear to have same position data. In the C++ example both bird_data[1] and bird_data[2] have correct data.I get the same position output data from below code.
text output in the LBird1X is same LBird2X,LBird1Y is same LBird2Y and LBird1Z is same LBird2Z.
Could this be to do with the lack of pointing ? Or i done something wrong in import the bird.dll stucture data?
C++ code:
birdStartFrameStream(GROUP_ID);
do // Until Keypress
{
if(birdFrameReady(GROUP_ID)) // Check if there's data available
{
birdGetMostRecentFrame(GROUP_ID,&frame);//Get data from bird BIRDREADING *bird_data; // Transfers data into structure
BIRDREADING *bird_data;
for(int i=1; i<DEVCOUNT+1; i++ ) // Loop to get data from birds
{
// Change pointer to index of first bird (1)
bird_data = &frame.reading[i]; // Convert data into inches and degrees and scale
pos[0] = bird_data->position.nX * 36 / 32767.;
pos[1] = bird_data->position.nY * 36 / 32767.;
pos[2] = bird_data->position.nZ * 36 / 32767.;
ang[0] = bird_data->angles.nAzimuth * 180. / 32767.;
ang[1] = bird_data->angles.nElevation * 180. / 32767.;
ang[2] = bird_data->angles.nRoll * 180. / 32767.;
// print data
printf("%i> %+6.1f %+6.1f %+6.1f ", i,pos[0], pos[1],pos[2]);
// printf("%+6.1f %+6.1f %+6.1f \n",ang[0], ang[1], ang[2]);
} // end move data from structure to screen loop
} // end if frame ready loop
} while(!kbhit()); // loop until any key is pressed
C sharp that have same data
if (birdFrameReady(GROUP_ID))
{
birdGetMostRecentFrame(GROUP_ID, ref frame);
BIRDREADING bird_data = new BIRDREADING();
bird_data = frame.readings[i];
for (i = 1; i < DEVCOUNT + 1; i++)
{
bird_data = frame.readings[i];
string x, y, z;
x = (bird_data.position.nX * 36 / 32767.0).ToString();
y = (bird_data.position.nY * 36 / 32767.0).ToString();
z = (bird_data.position.nZ * 36 / 32767.0).ToString();
switch (i)
{
case 1:
LBird1X.Text = i.ToString() + ": " + x;
LBird1Y.Text = i.ToString() + ": " + y;
LBird1Z.Text = i.ToString() + ": " + z;
break;
case 2:
LBird2X.Text = i.ToString() + ": " + x;
LBird2Y.Text = i.ToString() + ": " + y;
LBird2Z.Text = i.ToString() + ": " + z;
break;
default:
LBird2X.Text = "error";
LBird2Y.Text = "error";
LBird2Z.Text = "error";
break;
}
}
C++ Struct
#pragma pack(1) // pack the following structures on one-byte boundaries
// Bird position structure
typedef struct tagBIRDPOSITION
{
short nX; // x-coordinate
short nY; // y-coordinate
short nZ; // z-coordinate
}
BIRDPOSITION;
// Bird angles structure
typedef struct tagBIRDANGLES
{
short nAzimuth; // azimuth angle
short nElevation; // elevation angle
short nRoll; // roll angle
}
BIRDANGLES;
// Bird matrix structure
typedef struct tagBIRDMATRIX
{
short n[3][3]; // array of matrix elements
}
BIRDMATRIX;
// Bird quaternion structure
typedef struct tagBIRDQUATERNION
{
short nQ0; // q0
short nQ1; // q1
short nQ2; // q2
short nQ3; // q3
}
BIRDQUATERNION;
#pragma pack() // resume normal packing of structures
// Bird reading structure
typedef struct tagBIRDREADING
{
BIRDPOSITION position; // position of receiver
BIRDANGLES angles; // orientation of receiver, as angles
BIRDMATRIX matrix; // orientation of receiver, as matrix
BIRDQUATERNION quaternion; // orientation of receiver, as quaternion
WORD wButtons; // button states
}
BIRDREADING;
// Bird frame structure
//
// NOTE: In stand-alone mode, the bird reading is stored in reading[0], and
// all other array elements are unused. In master/slave mode, the "reading"
// array is indexed by bird number - for example, bird #1 is at reading[1],
// bird #2 is at reading[2], etc., and reading[0] is unused.
typedef struct tagBIRDFRAME
{
DWORD dwTime; // time at which readings were taken, in msecs
BIRDREADING reading[BIRD_MAX_DEVICE_NUM + 1]; // reading from each bird
}
BIRDFRAME;
// Bird system configuration structure
//
// NOTE: In TCP/IP mode, the following fields are NOT used:
// byXtalSpeed
//
// NOTE: In RS232 and ISA modes, the following fields are NOT used:
// bits BSS_FBB_ERROR, BSS_LOCAL_ERROR, BSS_LOCAL_POWER, and BSS_MASTER of bySystemStatus
// byNumServers
// byChassisNum
// byNumChassisDevices
// byFirstDeviceNum
C sharp Stuct
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct BIRDPOSITION
{
public short nX; // x-coordinate
public short nY; // y-coordinate
public short nZ; // z-coordinate
}
// Bird angles structure
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct BIRDANGLES
{
public short nAzimuth; // azimuth angle
public short nElevation; // elevation angle
public short nRoll; // roll angle
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct BIRDMATRIX
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 9)]
public short[,] n;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct BIRDQUATERNION
{
public short nQ0; // q0
public short nQ1; // q1
public short nQ2; // q2
public short nQ3; // q3
}
[StructLayout(LayoutKind.Sequential, Pack = 0)]
public struct BIRDREADING
{
public BIRDPOSITION position; // position of receiver
public BIRDANGLES angles; // orientation of receiver, as angles
public BIRDMATRIX matrix; // orientation of receiver, as matrix
public BIRDQUATERNION quaternion; // orientation of receiver, as quaternion
public ushort wButtons; // button states
}
[StructLayout(LayoutKind.Sequential, Pack = 0)]
public struct BIRDFRAME
{
public uint dwTime; // time at which readings were taken, in msecs
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 127)]
public BIRDREADING[] readings; // reading from each bird
}
Try to use
StructLayout(LayoutKind.Explicit)