Index: eagle/eagle_bin/Summary.txt =================================================================== --- eagle/eagle_bin/Summary.txt (revision 9182) +++ eagle/eagle_bin/Summary.txt (revision 9183) @@ -302,6 +302,7 @@ byte 1 - ignore byte 2,3 -> subsection count uint16 byte 4,5,6,7 -> uint32 number of sections + byte 4 LSB0, byte 5 MSB0, byte 6 MSB1, byte 7 MSB2 byte 8 -> uint8 major version byte 9 -> uint8 minor version number Index: eagle/eagle_bin/test_parser/eagle_bin.c =================================================================== --- eagle/eagle_bin/test_parser/eagle_bin.c (revision 9182) +++ eagle/eagle_bin/test_parser/eagle_bin.c (revision 9183) @@ -13,6 +13,7 @@ typedef enum { T_BMB, /* bit-mask-bool: apply the bitmask in 'len' to the the byte at offs and use the result as a boolean */ T_UBF, /* unsigned bitfield; offset is the first byte in block[], len is a BITFIELD() */ + T_SIN, /* signed int */ T_INT, T_DBL, T_STR @@ -642,6 +643,8 @@ return l; } +/* a bifield -> signed long conversion function is needed */ + static long load_long(unsigned char *src, int offs, unsigned long len) { return (long)load_ulong(src, offs, len); @@ -686,19 +689,21 @@ { unsigned char sub_block[8]; unsigned char block[8]; - unsigned char DRC_block[96]; + int DRC_length_used = 244; + unsigned char DRC_block[244]; + unsigned char DRC_sub_block[244]; long sentinel_found = 0; long magic_found = 0; int extra_bytes = 0; long offset = 0; - int index = 0; + int index = 0; if (fread(block, 1, 8, f) != 8) { - printf("E: short DRC sentinel read. DRC start sentinel not found.\n"); + printf("E: short attempted DRC sentinel read. DRC start sentinel not found.\n"); return -1; } - /* look for DRC sentinel */ + /* look for DRC start sentinel */ while (!sentinel_found) /* \x10\x04\x00\x20 */ { for (offset = 0; offset < 5; offset++) { @@ -710,7 +715,7 @@ } } if (fread(sub_block, 1, 4, f) != 4) { - printf("E: short DRC sentinel read. DRC start sentinel not found.\n"); + printf("E: short attempted DRC sentinel read. DRC start sentinel not found.\n"); return -1; } for (index = 7; index > 3; index--) { @@ -718,7 +723,7 @@ block[index] = sub_block[index-4]; } } - printf("found DRC sentinel x10x04x00x20.\n"); + printf("found DRC start sentinel x10x04x00x20.\n"); while (!magic_found) /* \x78\x56\x34\x12 */ { @@ -728,42 +733,96 @@ && load_long(block, offset+2, 1) == 0x34 && load_long(block, offset+3, 1) == 0x12) { magic_found = 1; - extra_bytes = 8 - 4 - offset; + extra_bytes = 4 - offset; } } - if (fread(sub_block, 1, 4, f) != 4) { - printf("E: short DRC magic read. DRC magic not found.\n"); - return -1; - } - for (index = 7; index > 3; index--) { - block[index-4] = block[index]; - block[index] = sub_block[index-4]; - } + if (!magic_found) { + if (fread(sub_block, 1, 4, f) != 4) { + printf("E: short attempted DRC magic read. DRC magic not found.\n"); + return -1; + } + for (index = 7; index > 3; index--) { /*shuffle things over */ + block[index-4] = block[index]; + block[index] = sub_block[index-4]; + /* printf("parse read block at index: %d : %d\n", index, block[index]); */ + } + } } printf("found DRC magic x78x56x34x12.\n"); printf("readbuffer still contains %d DRC bytes\n", extra_bytes); - if (fread(DRC_block, 1, 96, f) != 96) { + if (fread(DRC_sub_block, 1, (DRC_length_used - extra_bytes), f) != (DRC_length_used-extra_bytes)) { printf("E: short DRC value block read. DRC section incomplete.\n"); return -1; } - for (index = 95; index >= extra_bytes; index--) { - DRC_block[index] = DRC_block[index-extra_bytes]; - } for (index = 0; index < extra_bytes; index++) { - DRC_block[index] = block[7-index]; + printf("placing residual bytes in parse read block at index %d: %d\n", 8-extra_bytes+index, block[8-extra_bytes+index]); + /* printf("into DRC_block index: %d\n", index);*/ + DRC_block[index] = block[8-extra_bytes+index]; } - /* following 92 bytes contain useful DRC stuff + for (index = extra_bytes; index < (DRC_length_used-extra_bytes); index++) { + DRC_block[index] = DRC_sub_block[index-extra_bytes]; + } + /*for (index = 0; index < DRC_length_used; index++) { + printf("DRC_block index: %d and value %d\n", index, DRC_block[index]); + } */ + + /* first ~134 bytes contain the most useful DRC stuff, such as # wire2wire wire2pad wire2via pad2pad pad2via via2via pad2smd via2smd smd2smd self.clearances, data = _cut('<9I', data, 36) i.e. 9 integers, 4 bytes each # restring order: padtop padinner padbottom viaouter viainner (microviaouter microviainner) restring_percentages = 7 doubles, 56 bytes total */ - printf("wire2wire: %ld\n", load_long(block, 0, 4)); - printf("wire2pad: %ld\n", load_long(block, 4, 4)); - printf("wire2via: %ld\n", load_long(block, 8, 4)); - printf("padtop: %f\n", load_double(block, 36, 8)); - printf("padinner: %f\n", load_double(block, 44, 8)); + printf("wire2wire: %f mil\n", load_long(DRC_block, 0, 4)/2.54/100); + printf("wire2pad: %f mil\n", load_long(DRC_block, 4, 4)/2.54/100); + printf("wire2via: %f mil\n", load_long(DRC_block, 8, 4)/2.54/100); + printf("pad2pad: %f mil\n", load_long(DRC_block, 12, 4)/2.54/100); + printf("pad2via: %f mil\n", load_long(DRC_block, 16, 4)/2.54/100); + printf("via2via: %f mil\n", load_long(DRC_block, 20, 4)/2.54/100); + printf("pad2smd: %f mil\n", load_long(DRC_block, 24, 4)/2.54/100); + printf("via2smd: %f mil\n", load_long(DRC_block, 28, 4)/2.54/100); + printf("smd2smd: %f mil\n", load_long(DRC_block, 32, 4)/2.54/100); + printf("copper2dimension: %f mil\n", load_long(DRC_block, 44, 4)/2.54/100); + printf("drill2hole: %f mil\n", load_long(DRC_block, 52, 4)/2.54/100); + + printf("min_width: %f mil\n", load_long(DRC_block, 64, 4)/2.54/100); + printf("min_drill: %f mil\n", load_long(DRC_block, 68, 4)/2.54/100); + /*in version 5, this is wedged inbetween drill and pad ratios: + min_micro_via, blind_via_ratio, int, float, 12 bytes*/ + printf("padtop ratio: %f\n", load_double(DRC_block, 84, 8)); + printf("padinner ratio: %f\n", load_double(DRC_block, 92, 8)); + printf("padbottom ratio: %f\n", load_double(DRC_block, 100, 8)); + printf("viaouter ratio: %f\n", load_double(DRC_block, 108, 8)); + printf("viainner ratio: %f\n", load_double(DRC_block, 116, 8)); + printf("microviaouter ratio: %f\n", load_double(DRC_block, 124, 8)); + printf("microviainner ratio: %f\n", load_double(DRC_block, 132, 8)); + + printf("restring limit1 (mil): %f\n", load_long(DRC_block, 140, 4)/2.54/100); + printf("restring limit2 (mil): %f\n", load_long(DRC_block, 144, 4)/2.54/100); + printf("restring limit3 (mil): %f\n", load_long(DRC_block, 148, 4)/2.54/100); + printf("restring limit4 (mil): %f\n", load_long(DRC_block, 152, 4)/2.54/100); + printf("restring limit5 (mil): %f\n", load_long(DRC_block, 156, 4)/2.54/100); + printf("restring limit6 (mil): %f\n", load_long(DRC_block, 160, 4)/2.54/100); + printf("restring limit7 (mil): %f\n", load_long(DRC_block, 164, 4)/2.54/100); + printf("restring limit8 (mil): %f\n", load_long(DRC_block, 168, 4)/2.54/100); + printf("restring limit9 (mil): %f\n", load_long(DRC_block, 172, 4)/2.54/100); + printf("restring limit10 (mil): %f\n", load_long(DRC_block, 176, 4)/2.54/100); + printf("restring limit11 (mil): %f\n", load_long(DRC_block, 180, 4)/2.54/100); + printf("restring limit12 (mil): %f\n", load_long(DRC_block, 184, 4)/2.54/100); + printf("restring limit13 (mil): %f\n", load_long(DRC_block, 188, 4)/2.54/100); + printf("restring limit14 (mil): %f\n", load_long(DRC_block, 192, 4)/2.54/100); + + printf("pad_shapes1 (equiv -1): %ld\n", load_long(DRC_block, 196, 4)); + printf("pad_shapes2 (equiv -1): %ld\n", load_long(DRC_block, 200, 4)); + printf("pad_shapes3 (equiv -1): %ld\n", load_long(DRC_block, 204, 4)); + printf("mask_percentages1 ratio: %f\n", load_double(DRC_block, 208, 8)); + printf("mask_percentages2 ratio: %f\n", load_double(DRC_block, 216, 8)); + + printf("mask limit1 (mil): %f\n", load_long(DRC_block, 224, 4)/2.54/100); + printf("mask limit2 (mil): %f\n", load_long(DRC_block, 228, 4)/2.54/100); + printf("mask limit3 (mil): %f\n", load_long(DRC_block, 232, 4)/2.54/100); + printf("mask limit4 (mil): %f\n", load_long(DRC_block, 236, 4)/2.54/100); + return 0; } @@ -825,6 +884,8 @@ case T_UBF: printf("%s %s=%ld\n", ind, at->name, load_ubf(block, at->offs, at->len)); break; + case T_SIN: + printf("%s %s=%ld\n", ind, at->name, load_slong(block, at->offs, at->len)); case T_INT: printf("%s %s=%ld\n", ind, at->name, load_long(block, at->offs, at->len)); break;