The RawTpx3Pixel structure in memory: Difference between revisions

From ADVACAM Wiki
Jump to navigation Jump to search
(Created page with "The structure is declared: <syntaxhighlight line lang=C> #pragma pack(push, 1) typedef struct _RawTpx3Pixel { u32 index: 24; u64 toa: 64; byte overflow: 1; byte ftoa: 5; u16 tot: 10; } RawTpx3Pixel; #pragma pack(pop) </syntaxhighlight> But #pragma pack may not be 100% respected by the compiler, for example due to mandatory alignment. = First test = Add testbox, checkbox and test code to the Tpx3-1 example from the AdvacamAp...")
 
Line 17: Line 17:
Add testbox, checkbox and test code to the Tpx3-1 example from the AdvacamApiExamplesPackage
Add testbox, checkbox and test code to the Tpx3-1 example from the AdvacamApiExamplesPackage
   
   
Add global declarations:
1. Add global declarations:
<syntaxhighlight line lang=C>
<syntaxhighlight line lang=C>
RawTpx3Pixel dataDrivenPxRaw[32000000];
RawTpx3Pixel dataDrivenPxRaw[32000000];
Line 25: Line 25:
</syntaxhighlight>
</syntaxhighlight>


Add this code to begin of the '''initMeasParams()''' function:  
2. Add this code to begin of the '''initMeasParams()''' function:  
  showRawPx = checkRawPixels->Checked;
  showRawPx = checkRawPixels->Checked;
  dataDrivenPxRawLen = -1;
  dataDrivenPxRawLen = -1;
  txtRawData->Visible = showRawPx;
  txtRawData->Visible = showRawPx;


Show the data sample function, add above the '''timer1_Tick''' function:
3. Show the data sample function, add above the '''timer1_Tick''' function:
<syntaxhighlight line lang=C>
<syntaxhighlight line lang=C>
void showRawPxFn() {
void showRawPxFn() {
Line 52: Line 52:
</syntaxhighlight>
</syntaxhighlight>


Add the line
4. Add the line
  if (showRawPx) showRawPxFn();
  if (showRawPx) showRawPxFn();
to the  
to the  
Line 59: Line 59:
<br>
<br>


Add this section to end of the '''clbDataDriven''' function:
5. Add this section to end of the '''clbDataDriven''' function:
<syntaxhighlight line lang=C>
<syntaxhighlight line lang=C>
if (showRawPx) {
if (showRawPx) {
Line 82: Line 82:


== The result ==
== The result ==
<syntaxhighlight line lang=text>
<syntaxhighlight line lang=text>
start adr: 0, OvrFirst: -1, sizeof: 15
start adr: 0, OvrFirst: -1, sizeof: 15
Line 94: Line 93:
4614 631863 0  15 21 B: 6 18 0 0 55 164 9 0 0 0 0 0 30 21 0 6
4614 631863 0  15 21 B: 6 18 0 0 55 164 9 0 0 0 0 0 30 21 0 6
4614 636812 0  25 27 B: 6 18 0 0 140 183 9 0 0 0 0 0 50 27 0 6
4614 636812 0  25 27 B: 6 18 0 0 140 183 9 0 0 0 0 0 50 27 0 6
</syntaxhighlight>
* Length of the declared structure is: 24+64+1+5+10 = 104 bits = '''13 bytes'''
* Length returned by the sizeof function is: '''15 bytes'''
* The bytes list confirms this, it can be seen that the next record starts from the 16th byte.
* It is unlikely that the lowest byte of the ToA is always zero, so we see that the ToA starts with the 5th byte, so the pixel index is 4 bytes length.
* Assume that the ToA is indeed 8 bytes. So the next entry starts with the 13th byte.
<syntaxhighlight line lang=text>
</syntaxhighlight>
</syntaxhighlight>


<syntaxhighlight line lang=C>
<syntaxhighlight line lang=C>
</syntaxhighlight>
</syntaxhighlight>

Revision as of 13:39, 18 January 2024

The structure is declared:

#pragma pack(push, 1)
typedef struct _RawTpx3Pixel
{
    u32 index:      24;
    u64 toa:        64;
    byte overflow:   1;
    byte ftoa:       5;
    u16 tot:        10;
} RawTpx3Pixel;
#pragma pack(pop)

But #pragma pack may not be 100% respected by the compiler, for example due to mandatory alignment.

First test

Add testbox, checkbox and test code to the Tpx3-1 example from the AdvacamApiExamplesPackage

1. Add global declarations:

RawTpx3Pixel dataDrivenPxRaw[32000000];
int dataDrivenPxRawOvrFirst = -1;
int dataDrivenPxRawLen = -1;
bool showRawPx = false;

2. Add this code to begin of the initMeasParams() function:

showRawPx = checkRawPixels->Checked;
dataDrivenPxRawLen = -1;
txtRawData->Visible = showRawPx;

3. Show the data sample function, add above the timer1_Tick function:

void showRawPxFn() {
	if (dataDrivenPxRawLen < 1) return;
	int start = (dataDrivenPxRawOvrFirst > 0) ? dataDrivenPxRawOvrFirst : 0;
	if (start > 1) start-=2;
	String^ s = String::Format("start adr: {0}, OvrFirst: {1}, siz: {2}\r\n", start, dataDrivenPxRawOvrFirst, sizeof(RawTpx3Pixel)) + "index 24 / toa 64 / overflow 1 / ftoa 5 / tot 10\r\n";

	for (int n = 0; n < 20; n++) {
		int idx = start + n;
		s += String::Format("{0}\t{1}\t{2}  {3}\t{4}\t", dataDrivenPxRaw[idx].index, dataDrivenPxRaw[idx].toa, dataDrivenPxRaw[idx].overflow, dataDrivenPxRaw[idx].ftoa, dataDrivenPxRaw[idx].tot);
		s += "B:";
		unsigned char* arr = (unsigned char*)(dataDrivenPxRaw + idx);
		for (int i=0; i < 16; i++) {
			s += String::Format(" {0}", arr[i]);
		}
		s += "\r\n";
	}
	txtRawData->Text = s;
}

4. Add the line

if (showRawPx) showRawPxFn();

to the

if (dataDrivenPixelsCount != 0) {

section in the timer1_Tick function

5. Add this section to end of the clbDataDriven function:

if (showRawPx) {
	if (dataDrivenPixelsCount > 1000000) dataDrivenPixelsCount = 1000000;
	rc = pxcGetMeasuredRawTpx3Pixels(deviceIndex, dataDrivenPxRaw, dataDrivenPixelsCount);
	dataDrivenPxRawOvrFirst = -1;
	dataDrivenPxRawLen = 0;
	if (rc != 0) {
		dataDrivenPxRawLen = 0;
		clbError = rc;
		return;
	}
	dataDrivenPxRawLen = dataDrivenPixelsCount;
	for (int n = 0; n < dataDrivenPixelsCount; n++) {
		if (dataDrivenPxRaw[n].overflow != 0) {
			dataDrivenPxRawOvrFirst = n;
			break;
		}
	}
}

The result

start adr: 0, OvrFirst: -1, sizeof: 15
index 24 / toa 64 / overflow 1 / ftoa 5 / tot 10
242 	196318	0  20	14	B: 242 0 0 0 222 254 2 0 0 0 0 0 40 14 0 242
242 	238506	0  9	3	B: 242 0 0 0 170 163 3 0 0 0 0 0 18 3 0 238
750 	386872	0  19	20	B: 238 2 0 0 56 231 5 0 0 0 0 0 38 20 0 238
750 	445251	0  17	17	B: 238 2 0 0 67 203 6 0 0 0 0 0 34 17 0 238
750 	477832	0  14	8	B: 238 2 0 0 136 74 7 0 0 0 0 0 28 8 0 238
750 	572804	0  12	11	B: 238 2 0 0 132 189 8 0 0 0 0 0 24 11 0 6
4614	631863	0  15	21	B: 6 18 0 0 55 164 9 0 0 0 0 0 30 21 0 6
4614	636812	0  25	27	B: 6 18 0 0 140 183 9 0 0 0 0 0 50 27 0 6
  • Length of the declared structure is: 24+64+1+5+10 = 104 bits = 13 bytes
  • Length returned by the sizeof function is: 15 bytes
  • The bytes list confirms this, it can be seen that the next record starts from the 16th byte.
  • It is unlikely that the lowest byte of the ToA is always zero, so we see that the ToA starts with the 5th byte, so the pixel index is 4 bytes length.
  • Assume that the ToA is indeed 8 bytes. So the next entry starts with the 13th byte.