/* vim: noexpandtab fileencoding=utf-8 nomodified nowrap textwidth=200 foldmethod=marker foldmarker={{{,}}} foldcolumn=4 ruler showcmd lcs=tab\:|- list: */ /* ChipTest v.0.2 - Scans for chip, manipulates pins, 115.200 Bd, ANSI color HW: Arduino Mega + ShieldMega-001 TL;DR; T-test, R-restrict, P-Power similar to PinSet, but command "T" (or "t") scans for possible existing pins by walking ^ and v; only zif40 pins are used (0..39) value: 0; 1; v pulldown; ^ pullup pin0: 0..40 for pins on zif socket syntax: : set pin0 to value :.. set pin0..pin1 to value examples: ^:10 set pin D10 to weak pullup (INPUT_PULLUP) - if it is input on 74HCxx, then it counts as log. 1; if it is output, it will be driven to output value 1:13 set pin 13 to logical 1 (digitalWrite(HIGH);) - input is logical 1, if it is output and driven toward zero, then it may destroy something 0:2..5 set pins 2..5 to logical 0 (digitalWrite(LOW);) // ShieldMega-001 have pulldown resistors for all zif40 pins */ // #define SERIAL_SPEED 9600 #define SERIAL_SPEED 115200 #include #include "b40.h" #define VERZE "ChipTest v.0.2 (zif40)" // {{{ zif40 {Dx for zif40}, alive {reacted on test}, pin {zif40 for chip} int zif40[] = {53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 5, 6, 7, 8, 9, 10, 11, 12 }; b40 alive; int pin[40], pins; // }}} // {{{ ANSI constants #define ANSI_back "\b \b" // back; use Space to ovewrite; back (over Space) #define ANSI_L "\e[41mL\e[0m" #define ANSI_H "\e[41mH\e[0m" // }}} char dig[40]; bool ok_dig[40],x_dig[40]; bool talk = false; // ma status neco vypisovat? bool headers = true; // i hlavicky? #define P(A) Serial.print(F(A)); #define Pn(A) Serial.println(F(A)); #define Px(A) Serial.print(A); #define Pxn(A) Serial.println(A); void help() { // {{{ Pn(" send line"); Pn(" delete last char"); Pn("t, T run tests"); Pn("h, H, ? print help"); Pn("^, v, 0, 1 manipulate pins"); } // }}} void setup() { // {{{ for (int i=0; i<40;++i){ pinMode(zif40[i],INPUT); // digitalWrite(i,LOW); dig[i]='v'; ok_dig[i]=true; x_dig[i]=true; }; //Initialize serial and wait for port to open: Serial.begin(SERIAL_SPEED); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // prints title with ending line break delay(20); Pn("-= =-"); Pn(VERZE); } // }}} #define Sp(A) {if (talk) Serial.print(A);} #define Spln(A) {if (talk) Serial.println(A);} void mezery(int i) { // {{{ if (i % 10 == 0) Sp(" | ") else if (i % 5 == 0) Sp(' '); } // }}} bool match(uint8_t x, char y) { // {{{ status of pin - x actual value, y set value if (x==0) { if (y=='0' || y=='v' ) { return true; }; if (y=='1' || y=='^' ) { return false;}; }; if (x==1) { if (y=='1' || y=='^' ) { return true; }; if (y=='0' || y=='v' ) { return false;}; }; P("WTF match("); Px(x); P(", '"); Px(y); Pn("')"); return false; // Should be unreachable } // }}} bool st(uint8_t x, char y) { // {{{ status of pin - x actual value, y set value, prints "char", returns if it match if (x==0) { if (y=='0' || y=='v' ) {Sp(y); return true;}; if (y=='1' || y=='^' ) {Sp(ANSI_L); return false;}; }; if (x==1) { if (y=='1' || y=='^' ) {Sp(y); return true;}; if (y=='0' || y=='v' ) {Sp(ANSI_H); return false;}; }; P("WTF st("); Px(x); P(", '"); Px(y); Pn("')"); return false; // Should be unreachable } // }}} void status() { // {{{ uint8_t x; char y; bool ok = true; bool b; // {{{ zahlavi if (headers) { Spln(); for (int i=0; i<40;++i){ mezery(i); Sp(i/10); }; Spln(); for (int i=0; i<40;++i){ mezery(i); Sp(i%10); }; Spln(); }; // }}} for (int i=0; i<40;++i){ mezery(i); x=digitalRead(zif40[i]); y=dig[i]; b= st(x,y); ok &= b; ok_dig[i] = b; }; Spln(); /* if (!ok) { for (int i=2; i<54;++i){ if(x_dig[i] && ! ok_dig[i]) { Serial.print(" D"); Serial.println(i); }; x_dig[i] = ok_dig[i]; }; }; */ // Serial.print("[01^v][:=][0-9][0-9]?((-/..)[0-9][0-9]?) >"); } // }}} void test() { // {{{ alive.zero(); for (int i=0; i<40; ++i) { ok_dig[i]=true; x_dig[i]=true; dig[i]='v'; pinMode(zif40[i],INPUT); }; talk = true; headers = true; status(); headers = false; bool b; // walking ^ for (int i=0; i<40; ++i) { ok_dig[i]=true; x_dig[i]=true; dig[i]='^'; pinMode(zif40[i],INPUT_PULLUP); for (int j=0; j<40;++j){ // {{{ test pins b = match(digitalRead(zif40[j]), dig[j]); if (!b) alive.set(j); }; // }}} status(); ok_dig[i]=true; x_dig[i]=true; dig[i]='v'; pinMode(zif40[i],INPUT); }; // walking v for (int i=0; i<40; ++i) { ok_dig[i]=true; x_dig[i]=true; dig[i]='^'; pinMode(zif40[i],INPUT_PULLUP); }; for (int i=0; i<40; ++i) { ok_dig[i]=true; x_dig[i]=true; dig[i]='v'; pinMode(zif40[i],INPUT); for (int j=0; j<40;++j){ // {{{ test pins b = match(digitalRead(zif40[j]), dig[j]); if (!b) alive.set(j); }; // }}} status(); ok_dig[i]=true; x_dig[i]=true; dig[i]='^'; pinMode(zif40[i],INPUT_PULLUP); }; pins = 0; for (int i=0; i<40;++i){ mezery(i); if (alive.val(i)) { Serial.print("#"); pin[pins++]=i; } else { Serial.print("~"); }; }; Serial.print(" Pins found: "); Serial.println(pins); headers = true; status(); } // }}} char line[80+2]; int linelen; void err(int linepos, const char *msg) { // {{{ if (linepos>1) { for (int i=1; i='0' && c<='9') {pin0 = (c-'0'); c=line[linepos++]; // pin0 if (c>='0' && c<='9') {pin0 = 10*pin0 + (c-'0'); c=line[linepos++];}; }; if (pin0>=0 && pin0<40) { /* OK */ } else {err(linepos, "not valid pin0 number"); return;}; if (c==0) { pin1=pin0; } else { if (c=='-') {c=line[linepos++];} else if (c=='.') {c=line[linepos++]; if (c=='.') {c=line[linepos++];} else { err(linepos,".. expected"); return;}; } else { err(linepos,"-/.. expected"); return;}; if (c>='0' && c<='9') {pin1 = (c-'0'); c=line[linepos++]; // pin1 if (c>='0' && c<='9') {pin1 = 10*pin1 + (c-'0'); c=line[linepos++];}; }; if (pin1>=0 && pin1<40) { /* OK */ } else {err(linepos, "not valid pin1 number"); return;}; }; if (pin0>pin1) {err(linepos, "pin1 must be same or larger, than pin0");return;}; if (c!=0 && c!='\n') {err(linepos, "extra characters on line"); return;}; for (int i=pin0; i<=pin1; ++i) { int x=i; dig[i]=val; if (val=='0') {pinMode(zif40[x],OUTPUT);digitalWrite(zif40[x],LOW); } else if (val=='1') {pinMode(zif40[x],OUTPUT);digitalWrite(zif40[x],HIGH); } else if (val=='v') {pinMode(zif40[x],INPUT); } else if (val=='^') {pinMode(zif40[x],INPUT_PULLUP); } else { err(linepos, "WTF, unknown val"); return; }; Serial.print(val); Serial.print("->"); Serial.print(x); Serial.println(";"); }; Serial.println("OK"); } // }}} int readBytesUntil(char const *terminators, char *buffer, size_t &buffer_top, size_t length) { // {{{ similar to Serial.* but waits for terminator/length and returns -1 until done (buffer_top is zeroed when done) if (buffer_top >= length) { buffer_top=0; return -1;}; if (buffer_top + 1 == length) { buffer_top=0; return length-1;}; while (Serial.available() > 0) { int b=Serial.read(); Serial.print(char(b)); // if(b==10||b==13) Serial.print('.'); else // Serial.print(char(b)); // Serial.print("["); // Serial.print(b); // Serial.print("]"); char const *t=terminators; while (*t && *t!=b) t++; if (*t) { uint8_t retval; retval=buffer_top; buffer[buffer_top]=0;buffer_top=0;return retval;}; if (b==127) { // BackSpace if (buffer_top>0) { P(ANSI_back); buffer_top--; buffer[buffer_top]=0; }; return -1; }; buffer[buffer_top]=b; buffer_top++; buffer[buffer_top]=0; if (buffer_top >= length) { uint8_t retval; retval=buffer_top; buffer[buffer_top]=0;buffer_top=0;return retval;}; }; return -1; } // }}} size_t linetop=0; void loop() { linelen=readBytesUntil("\r\n", line, linetop, 80); if (linelen>0) { solveLine(); talk=true; status(); } else if (linelen==0) { // Pn("# LineLen zero # "); talk=true; status(); } else { talk=false; status(); }; }