From: Rick Smith on

<jacodeguy(a)gmail.com> wrote in message
news:1172178058.861073.181220(a)q2g2000cwa.googlegroups.com...
> On Feb 22, 2:06 pm, "Richard" <rip...(a)Azonic.co.nz> wrote:
> > On Feb 23, 8:51 am, Louis Krupp <lkr...(a)pssw.nospam.com.invalid>
> > wrote:
> >
> > > > The record matches the layout perfectly!
> > > > Micro Focus S9(4) COMP is two bytes binary
> > > > and 9V9(4) COMP is three bytes binary.
> >
> > > How do you fit a sign and four digits into two bytes? (Or am I being
> > > unusually dense today?)
> >
> > In binary (as stated). The value in 16 bit can be -32368 to 32367
> > which is a larger range than -9999 to 9999.
> >
> > COMP (in this case) however is byte reversed compared to intel format
> > being big-endian.
>
> I have some printouts of what the sketch should look like, I cannot
> find the first record (pin 01-000-001-00), but I do have the second
> (pin 01-000-006-00). Based on looking at the printout, I think the
> first part should be like this:
>
> 01-000-006-00, A, -40, 16, 1, 11, 13, 33, 13, 49, 31, 49, 31, 53, 47,
> 53, 47, 27, 23, 27, 23, 33, 13, 33, 0, -2,
>
> C I can do, and would love too, but a little rusty. The bytes and
> strings I think I can get out, but I'm not sure about the S9(4) COMP
> (two bytes reversed) thing.
>
> if I have:
>
> byte *buffer;
> fread(buffer, 2, f);
> // lets pretened I just read a comp, you previously said:
> // "Just byte switch the COMP fields."
> // How would I do that?
> int x = (buffer[1] << 16) && buffer[0]; // something like this?

Just the reverse and a bit different.

int x = (buffer[0] << 8) && buffer[1];

I did it a bit differently. [Using C++, as a better C.]
See Get_PT_TwoByteComp, below.

-----
#include <stdio.h>

struct TwoByteComp {
unsigned char c[2];
};

struct ThreeByteComp {
unsigned char c[3];
};

struct {
unsigned char RecordDescriptor[2];
struct {
char PT_PROP_NO[20]; // not nul terminated
char PT_SEQ;
} PT_KEY;
struct {
struct {
TwoByteComp PT_X; // big-endian
TwoByteComp PT_Y; // big-endian
} PT_TABLE[200];
} PT_GRAPHICS;
TwoByteComp PT_END; // big endian
ThreeByteComp PT_SCALE; // big-endian
} PT_REC;

signed short Get_PT_TwoByteComp (TwoByteComp *comp) {
return (signed short) (comp->c[0]*256+comp->c);
}

double Get_PT_SCALE (ThreeByteComp *comp ) {
return (double) ((comp->c[0]*65536+comp->c[1]*256
+comp->c[2])/10000.0);
}

bool IsValidRecord (void) {
return ((PT_REC.RecordDescriptor[0]>>4)==4);
}

void main (void) {
printf ("%d\n", sizeof (PT_REC));
return;
}
-----

The output is 828, which is the size of the record
with the descriptor.

This might give you some ideas.



From: jacodeguy on
On Feb 22, 3:34 pm, "Rick Smith" <ricksm...(a)mfi.net> wrote:
> <jacode...(a)gmail.com> wrote in message
>
> news:1172178058.861073.181220(a)q2g2000cwa.googlegroups.com...
>
>
>
> > On Feb 22, 2:06 pm, "Richard" <rip...(a)Azonic.co.nz> wrote:
> > > On Feb 23, 8:51 am, Louis Krupp <lkr...(a)pssw.nospam.com.invalid>
> > > wrote:
>
> > > > > The record matches the layout perfectly!
> > > > > Micro Focus S9(4) COMP is two bytes binary
> > > > > and 9V9(4) COMP is three bytes binary.
>
> > > > How do you fit a sign and four digits into two bytes? (Or am I being
> > > > unusually dense today?)
>
> > > In binary (as stated). The value in 16 bit can be -32368 to 32367
> > > which is a larger range than -9999 to 9999.
>
> > > COMP (in this case) however is byte reversed compared to intel format
> > > being big-endian.
>
> > I have some printouts of what the sketch should look like, I cannot
> > find the first record (pin 01-000-001-00), but I do have the second
> > (pin 01-000-006-00). Based on looking at the printout, I think the
> > first part should be like this:
>
> > 01-000-006-00, A, -40, 16, 1, 11, 13, 33, 13, 49, 31, 49, 31, 53, 47,
> > 53, 47, 27, 23, 27, 23, 33, 13, 33, 0, -2,
>
> > C I can do, and would love too, but a little rusty. The bytes and
> > strings I think I can get out, but I'm not sure about the S9(4) COMP
> > (two bytes reversed) thing.
>
> > if I have:
>
> > byte *buffer;
> > fread(buffer, 2, f);
> > // lets pretened I just read a comp, you previously said:
> > // "Just byte switch the COMP fields."
> > // How would I do that?
> > int x = (buffer[1] << 16) && buffer[0]; // something like this?
>
> Just the reverse and a bit different.
>
> int x = (buffer[0] << 8) && buffer[1];
>
> I did it a bit differently. [Using C++, as a better C.]
> See Get_PT_TwoByteComp, below.
>
> -----
> #include <stdio.h>
>
> struct TwoByteComp {
> unsigned char c[2];
>
> };
>
> struct ThreeByteComp {
> unsigned char c[3];
>
> };
>
> struct {
> unsigned char RecordDescriptor[2];
> struct {
> char PT_PROP_NO[20]; // not nul terminated
> char PT_SEQ;
> } PT_KEY;
> struct {
> struct {
> TwoByteComp PT_X; // big-endian
> TwoByteComp PT_Y; // big-endian
> } PT_TABLE[200];
> } PT_GRAPHICS;
> TwoByteComp PT_END; // big endian
> ThreeByteComp PT_SCALE; // big-endian
>
> } PT_REC;
>
> signed short Get_PT_TwoByteComp (TwoByteComp *comp) {
> return (signed short) (comp->c[0]*256+comp->c);
>
> }
>
> double Get_PT_SCALE (ThreeByteComp *comp ) {
> return (double) ((comp->c[0]*65536+comp->c[1]*256
> +comp->c[2])/10000.0);
>
> }
>
> bool IsValidRecord (void) {
> return ((PT_REC.RecordDescriptor[0]>>4)==4);
>
> }
>
> void main (void) {
> printf ("%d\n", sizeof (PT_REC));
> return;}
>
> -----
>
> The output is 828, which is the size of the record
> with the descriptor.
>
> This might give you some ideas.

Sweet! Yes, that seems to work. Only little bug was this line:

> signed short Get_PT_TwoByteComp (TwoByteComp *comp) {
> return (signed short) (comp->c[0]*256+comp->c);
> }

should be:
return (signed short) (comp->c[0]*256+comp->c[1]); //with the [1]

Wow, I have not done it all yet, but got the pin and the first x,y. I
think I'm golden.

Thank you all very very much. Richard and Rick, I'd love to pay you
back. If you'd like to split the $100 please email me at andy at
camavision.com where I can send the check. Or if you had a wish list
online someplace just let me know. Or, if there is anything else I
can do to return the favor.

Thanks again,

-Andy

From: Rick Smith on

<jacodeguy(a)gmail.com> wrote in message
news:1172181884.310009.214830(a)t69g2000cwt.googlegroups.com...
> On Feb 22, 3:34 pm, "Rick Smith" <ricksm...(a)mfi.net> wrote:
[snip]
> Sweet! Yes, that seems to work. Only little bug was this line:
>
> > signed short Get_PT_TwoByteComp (TwoByteComp *comp) {
> > return (signed short) (comp->c[0]*256+comp->c);
> > }
>
> should be:
> return (signed short) (comp->c[0]*256+comp->c[1]); //with the [1]

This sometimes happens with untested C/C++ programs!
A missing subscript can't get past the syntax check in COBOL,
though.

> Wow, I have not done it all yet, but got the pin and the first x,y. I
> think I'm golden.
>
> Thank you all very very much. Richard and Rick, I'd love to pay you
> back. If you'd like to split the $100 please email me at andy at
> camavision.com where I can send the check.

Send it all to Richard. He was willing to do it in COBOL.



From: Louis Krupp on
Howard Brazee wrote:
> On Thu, 22 Feb 2007 12:51:05 -0700, Louis Krupp
> <lkrupp(a)pssw.nospam.com.invalid> wrote:
>
>>> The record matches the layout perfectly!
>>> Micro Focus S9(4) COMP is two bytes binary
>>> and 9V9(4) COMP is three bytes binary.
>>>
>>>
>>>
>> How do you fit a sign and four digits into two bytes? (Or am I being
>> unusually dense today?)
>
> A byte holds 16 bits - 15 plus the sign. +9999d = 10011100001111b
>

So I *was* dense. I was thinking "packed decimal" for no really good
reason...

Louis
From: Richard on
On Feb 23, 11:43 am, "Rick Smith" <ricksm...(a)mfi.net> wrote:
> <jacode...(a)gmail.com> wrote in message

> > Thank you all very very much. Richard and Rick, I'd love to pay you
> > back. If you'd like to split the $100 please email me at andy at
> > camavision.com where I can send the check.
>
> Send it all to Richard. He was willing to do it in COBOL.

If you set a fire for a man he will be warm for a day, if you set him
on fire he will be warm for the rest of his life.