diff --git a/JumperlessNano/src/FileParsing.cpp b/JumperlessNano/src/FileParsing.cpp index 00008ca..cbbf427 100644 --- a/JumperlessNano/src/FileParsing.cpp +++ b/JumperlessNano/src/FileParsing.cpp @@ -10,12 +10,7 @@ #include "LEDs.h" #include #include "MachineCommands.h" - - - - - - +#include "Probing.h" bool debugFP = EEPROM.read(DEBUG_FILEPARSINGADDRESS); bool debugFPtime = EEPROM.read(TIME_FILEPARSINGADDRESS); @@ -29,7 +24,6 @@ char inputBuffer[INPUTBUFFERLENGTH] = {0}; ArduinoJson::StaticJsonDocument<8000> wokwiJson; - String connectionsW[MAX_BRIDGES][5]; File nodeFile; @@ -38,8 +32,6 @@ File wokwiFile; unsigned long timeToFP = 0; - - void savePreformattedNodeFile(int source) { LittleFS.remove("nodeFile.txt"); @@ -82,6 +74,11 @@ void savePreformattedNodeFile(int source) delay(1); } } + // nodeFile.write("\n\r"); + + // nodeFile.seek(0); + // nodeFileString.read(nodeFile); + // Serial.println(nodeFileString); nodeFile.close(); } @@ -91,27 +88,64 @@ void printNodeFile(void) nodeFile = LittleFS.open("nodeFile.txt", "r"); if (!nodeFile) { - if (debugFP) - Serial.println("Failed to open nodeFile"); + // if (debugFP) + // Serial.println("Failed to open nodeFile"); return; } else { - if (debugFP) - Serial.println("\n\ropened nodeFile.txt\n\n\rloading bridges from file\n\r"); + // if (debugFP) + // Serial.println("\n\ropened nodeFile.txt\n\n\rloading bridges from file\n\r"); } nodeFileString.clear(); nodeFileString.read(nodeFile); - nodeFile.close(); + // Serial.print(nodeFileString); - Serial.println(nodeFileString); + // int newLines = 0; + // Serial.println(nodeFileString.indexOf(",")); + // Serial.println(nodeFileString.charAt(nodeFileString.indexOf(",")+1)); + // Serial.println(nodeFileString.indexOf(",")); + if (nodeFileString.charAt(nodeFileString.indexOf(",") + 1) != '\n') + { + nodeFileString.replace(",", ",\n\r"); + nodeFileString.replace("{", "{\n\r"); + } + + // int nodeFileStringLength = nodeFileString.indexOf("}"); + // if (nodeFileStringLength != -1) + // { + // //nodeFileString.remove(nodeFileStringLength + 1, -1); + // } + + // if (nodeFileString.indexOf(",\n\r") == -1) + // { + // nodeFileString.replace(",", ",\n\r"); + // nodeFileString.replace("{", "{\n\r"); + // } + + // nodeFile.close(); + + int nodeFileStringLength = nodeFileString.indexOf("}"); + if (nodeFileStringLength != -1) + { + if (nodeFileString.charAt(nodeFileStringLength + 1) != '\n') + { + nodeFileString.replace("}", "}\n\r"); + } + nodeFileString.remove(nodeFileStringLength + 2, -1); + } + + // nodeFileString.readUntilToken(nodeFileString, "{"); + // nodeFileString.removeLast(9); + + Serial.print(nodeFileString); + // Serial.print('*'); nodeFileString.clear(); } - void parseWokwiFileToNodeFile(void) { @@ -410,7 +444,6 @@ void clearNodeFile(void) void removeBridgeFromNodeFile(int node1, int node2) { - nodeFile = LittleFS.open("nodeFile.txt", "r+"); if (!nodeFile) { @@ -423,38 +456,136 @@ void removeBridgeFromNodeFile(int node1, int node2) if (debugFP) Serial.println("\n\ropened nodeFile.txt\n\n\rloading bridges from file\n\r"); } - char nodeAsChar[20]; + + nodeFileString.clear(); + nodeFileString.read(nodeFile); nodeFile.close(); + char nodeAsChar[20]; itoa(node1, nodeAsChar, 10); + char paddedChar[21]; - if (node2 != -1) + paddedChar[0] = ' '; + for (int i = 1; i < 20; i++) { - nodeFileString.replace(nodeAsChar, "x"); - itoa(node2, nodeAsChar, 10); - nodeFileString.replace(nodeAsChar, "x"); - } - else - { - nodeFileString.replace(nodeAsChar, "x"); + if (nodeAsChar[i - 1] == '\0') + { + paddedChar[i] = ' '; + paddedChar[i + 1] = '\0'; + break; + } + paddedChar[i] = nodeAsChar[i - 1]; } - nodeFileString.replace("x-x,", ""); + int numberOfLines = 0; + // Serial.print(paddedChar); + // Serial.println("*"); + char lines[100][20]; - //Serial.println(nodeAsChar); + int lineIndex = 0; + int charIndex = 0; + for (int i = 0; i < 100; i++) + { -//Serial.println(nodeFileString); - - nodeFile = LittleFS.open("nodeFile.txt", "w+"); -nodeFile.write(nodeFileString.c_str()); + if (nodeFileString[charIndex] == '\0') + { + numberOfLines = i; + break; + } + lines[i][0] = ' '; + for (int j = 1; j < 20; j++) + { + if (nodeFileString[charIndex] == ',') + { + lines[i][j] = ' '; + lines[i][j + 1] = ','; + // lines[i][j + 2] = '\n'; + // lines[i][j + 3] = '\r'; + lines[i][j + 2] = '\0'; + + charIndex++; + break; + } + else if (nodeFileString[charIndex] == '-') + { + lines[i][j] = ' '; + lines[i][j + 1] = '-'; + lines[i][j + 2] = ' '; + j += 2; + charIndex++; + // break; + } + else if (nodeFileString[charIndex] == '\n' || nodeFileString[charIndex] == '\r' || nodeFileString[charIndex] == '{' || nodeFileString[charIndex] == '}') + { + lines[i][j] = ' '; + charIndex++; + } + else + { + lines[i][j] = nodeFileString[charIndex]; + charIndex++; + } + } + } + + // Serial.println("\n\r********"); + + for (int i = 0; i < numberOfLines; i++) + { + if (lines[i][0] == '\0') + { + // break; + } + if (strstr(lines[i], paddedChar) != NULL) + { + // Serial.println(lines[i]); + // delay(1); + + for (int j = 0; j < 18; j++) + { + lines[i][j] = ' '; + } + // lines[i][18] = '\n'; + // lines[i][19] = '\r'; + lines[i][0] = '\0'; + } + } + + nodeFileString.clear(); + nodeFileString.concat("{"); + for (int i = 0; i < numberOfLines; i++) + { + if (lines[i][0] == '\0') + { + continue; + } + // Serial.println(i); + // delay(1); + for (int j = 0; j < 20; j++) + { + if (lines[i][j] == '\0') + { + break; + } + if (lines[i][j] == ' ') + { + continue; + } + nodeFileString.concat(lines[i][j]); + // Serial.print(lines[i][j]); + // delay(1); + } + } + nodeFileString.concat("}\n\r"); nodeFile.close(); + nodeFile = LittleFS.open("nodeFile.txt", "w+"); + nodeFile.write(nodeFileString.c_str()); - - + nodeFile.close(); } void addBridgeToNodeFile(int node1, int node2) @@ -472,39 +603,56 @@ void addBridgeToNodeFile(int node1, int node2) Serial.println("\n\ropened nodeFile.txt\n\n\rloading bridges from file\n\r"); } -int nodeFileBraceIndex = 0; + int nodeFileBraceIndex = 0; -while (nodeFile.available()) -{ - char c = nodeFile.read(); - // Serial.print(c); - - if (c == '}') + while (nodeFile.available()) { - break; - } else { - nodeFileBraceIndex++; - } + char c = nodeFile.read(); + // Serial.print(c); - if (c == '!') - { - nodeFile.seek(0); - nodeFile.print("{\n\r"); - nodeFile.print(node1); - nodeFile.print("-"); - nodeFile.print(node2); - nodeFile.print(",\n\r}\n\r{\n\r}\n\r"); - nodeFile.close(); - return; + if (c == '}') + { + break; + } + else + { + nodeFileBraceIndex++; + } + + if (c == '!') + { + nodeFile.seek(0); + nodeFile.print("{\n\r"); + nodeFile.print(node1); + nodeFile.print("-"); + nodeFile.print(node2); + nodeFile.print(",\n\r}\n\r"); + + // if (1) + // { + // Serial.println("wrote to nodeFile.txt"); + + // Serial.println("nodeFile.txt contents:\n\r"); + // nodeFile.seek(0); + + // while (nodeFile.available()) + // { + // Serial.write(nodeFile.read()); + // } + // Serial.println("\n\r"); + // } + // Serial.print (nodeFile); + nodeFile.close(); + return; + } } -} -//Serial.println(nodeFileBraceIndex); -nodeFile.seek(nodeFileBraceIndex); + // Serial.println(nodeFileBraceIndex); + nodeFile.seek(nodeFileBraceIndex); nodeFile.print(node1); nodeFile.print("-"); nodeFile.print(node2); - nodeFile.print(",\n\r}\n\r{\n\r}\n\r"); + nodeFile.print(",}\n\r"); if (debugFP) { @@ -520,10 +668,8 @@ nodeFile.seek(nodeFileBraceIndex); Serial.println("\n\r"); } nodeFile.close(); - - - } + void writeToNodeFile(void) { @@ -546,17 +692,17 @@ void writeToNodeFile(void) { if (connectionsW[i][0] == "-1" && connectionsW[i][1] != "-1") { - //lightUpNode(connectionsW[i][0].toInt()); + // lightUpNode(connectionsW[i][0].toInt()); continue; } if (connectionsW[i][1] == "-1" && connectionsW[i][0] != "-1") { - //lightUpNode(connectionsW[i][1].toInt()); + // lightUpNode(connectionsW[i][1].toInt()); continue; } if (connectionsW[i][0] == connectionsW[i][1]) { - //lightUpNode(connectionsW[i][0].toInt()); + // lightUpNode(connectionsW[i][0].toInt()); continue; } @@ -565,7 +711,7 @@ void writeToNodeFile(void) nodeFile.print(connectionsW[i][1]); nodeFile.print(",\n\r"); } - nodeFile.print("}\n\r"); + nodeFile.print("\n\r}\n\r"); if (debugFP) { @@ -600,6 +746,7 @@ void openNodeFile() Serial.println("\n\ropened nodeFile.txt\n\n\rloading bridges from file\n\r"); } + nodeFileString.clear(); nodeFileString.read(nodeFile); nodeFile.close(); @@ -658,7 +805,7 @@ void splitStringToFields() } else { - nodeFileString.substring(specialFunctionsString, 0, nodeFileString.length()); + nodeFileString.substring(specialFunctionsString, 0, -1); // nodeFileString.length()); } specialFunctionsString.trim(); @@ -692,8 +839,7 @@ void replaceSFNamesWithDefinedInts(void) Serial.println("replacing special function names with defined ints\n\r"); Serial.println(specialFunctionsString); } - - + specialFunctionsString.replace("GND", "100"); specialFunctionsString.replace("GROUND", "100"); specialFunctionsString.replace("SUPPLY_5V", "105"); @@ -851,17 +997,16 @@ void parseStringToBridges(void) stringIndex = specialFunctionsString.stoken(buffer, stringIndex, delimiters); - //Serial.print("buffer = "); - //Serial.println(buffer); - - // Serial.print("stringIndex = "); - //Serial.println(stringIndex); + // Serial.print("buffer = "); + // Serial.println(buffer); + // Serial.print("stringIndex = "); + // Serial.println(stringIndex); buffer.toInt(path[newBridgeIndex].node1); - //Serial.print("path[newBridgeIndex].node1 = "); - // Serial.println(path[newBridgeIndex].node1); + // Serial.print("path[newBridgeIndex].node1 = "); + // Serial.println(path[newBridgeIndex].node1); if (debugFP) { @@ -978,6 +1123,8 @@ void debugFlagInit(void) EEPROM.write(LEDBRIGHTNESSADDRESS, DEFAULTBRIGHTNESS); EEPROM.write(RAILBRIGHTNESSADDRESS, DEFAULTRAILBRIGHTNESS); EEPROM.write(SPECIALBRIGHTNESSADDRESS, DEFAULTSPECIALNETBRIGHTNESS); + EEPROM.write(PROBESWAPADDRESS, 0); + EEPROM.commit(); delay(5); @@ -999,6 +1146,8 @@ void debugFlagInit(void) debugLEDs = EEPROM.read(DEBUG_LEDSADDRESS); + probeSwap = EEPROM.read(PROBESWAPADDRESS); + #else debugFP = 1; @@ -1079,26 +1228,8 @@ void debugFlagSet(int flag) break; } + case 2: - { - flagStatus = EEPROM.read(TIME_FILEPARSINGADDRESS); - - if (flagStatus == 0) - { - EEPROM.write(TIME_FILEPARSINGADDRESS, 1); - - debugFPtime = true; - } - else - { - EEPROM.write(TIME_FILEPARSINGADDRESS, 0); - - debugFPtime = false; - } - - break; - } - case 3: { flagStatus = EEPROM.read(DEBUG_NETMANAGERADDRESS); @@ -1116,25 +1247,8 @@ void debugFlagSet(int flag) } break; } - case 4: - { - flagStatus = EEPROM.read(TIME_NETMANAGERADDRESS); - if (flagStatus == 0) - { - EEPROM.write(TIME_NETMANAGERADDRESS, 1); - - debugNMtime = true; - } - else - { - EEPROM.write(TIME_NETMANAGERADDRESS, 0); - - debugNMtime = false; - } - break; - } - case 5: + case 3: { flagStatus = EEPROM.read(DEBUG_NETTOCHIPCONNECTIONSADDRESS); @@ -1153,7 +1267,7 @@ void debugFlagSet(int flag) break; } - case 6: + case 4: { flagStatus = EEPROM.read(DEBUG_NETTOCHIPCONNECTIONSALTADDRESS); @@ -1172,7 +1286,7 @@ void debugFlagSet(int flag) break; } - case 7: + case 5: { flagStatus = EEPROM.read(DEBUG_LEDSADDRESS); @@ -1191,6 +1305,25 @@ void debugFlagSet(int flag) break; } + case 6: + { + flagStatus = EEPROM.read(PROBESWAPADDRESS); + + if (flagStatus == 0) + { + EEPROM.write(PROBESWAPADDRESS, 1); + + probeSwap = true; + } + else + { + EEPROM.write(PROBESWAPADDRESS, 0); + + probeSwap = false; + } + break; + } + case 0: { EEPROM.write(DEBUG_FILEPARSINGADDRESS, 0); @@ -1200,6 +1333,7 @@ void debugFlagSet(int flag) EEPROM.write(DEBUG_NETTOCHIPCONNECTIONSADDRESS, 0); EEPROM.write(DEBUG_NETTOCHIPCONNECTIONSALTADDRESS, 0); EEPROM.write(DEBUG_LEDSADDRESS, 0); + debugFP = false; debugFPtime = false; debugNM = false; @@ -1207,6 +1341,7 @@ void debugFlagSet(int flag) debugNTCC = false; debugNTCC2 = false; debugLEDs = false; + break; } diff --git a/JumperlessNano/src/JumperlessDefinesRP2040.h b/JumperlessNano/src/JumperlessDefinesRP2040.h index 5db4576..555d787 100644 --- a/JumperlessNano/src/JumperlessDefinesRP2040.h +++ b/JumperlessNano/src/JumperlessDefinesRP2040.h @@ -27,8 +27,9 @@ extern volatile int sendAllPathsCore2; #define LEDBRIGHTNESSADDRESS 39 #define RAILBRIGHTNESSADDRESS 40 #define SPECIALBRIGHTNESSADDRESS 41 +#define PROBESWAPADDRESS 42 -#define FIRSTSTARTUPADDRESS 42 +#define FIRSTSTARTUPADDRESS 43 diff --git a/JumperlessNano/src/LEDs.h b/JumperlessNano/src/LEDs.h index 737099b..adddd15 100644 --- a/JumperlessNano/src/LEDs.h +++ b/JumperlessNano/src/LEDs.h @@ -117,7 +117,7 @@ void clearLEDs(void); void randomColors(uint32_t color, int wait); void rainbowy(int ,int, int wait); void showNets(void); -void assignNetColors (void); +void assignNetColors (); void lightUpRail (int logo = -1, int railNumber = -1, int onOff = 1, int brightness = DEFAULTRAILBRIGHTNESS, int supplySwitchPosition= 1); void lightUpNet (int netNumber = 0 , int node = -1, int onOff = 1, int brightness = DEFAULTBRIGHTNESS, int hueShift = 0);//-1 means all nodes (default) diff --git a/JumperlessNano/src/Probing.cpp b/JumperlessNano/src/Probing.cpp index 2ee62ad..1ae748a 100644 --- a/JumperlessNano/src/Probing.cpp +++ b/JumperlessNano/src/Probing.cpp @@ -10,10 +10,13 @@ #include "NetManager.h" #include "Probing.h" #include "AdcUsb.h" - +#include #include "pico/stdlib.h" #include "hardware/pwm.h" +#include + +int probeSwap = 0; int probeHalfPeriodus = 20; unsigned long probingTimer = 0; @@ -35,8 +38,13 @@ int nodesToConnect[2] = {-1, -1}; int node1or2 = 0; +int probePin = 19; +int buttonPin = 18; + + + int rainbowList[13][3] = { - {45, 45, 45}, + {55, 55, 55}, {10, 45, 30}, {30, 15, 45}, {8, 27, 45}, @@ -58,22 +66,23 @@ int justCleared = 1; int probeMode(int pin, int setOrClear) { +probeSwap = EEPROM.read(PROBESWAPADDRESS); + + +if (probeSwap == 0) +{ + probePin = 19; + buttonPin = 18; + +} else +{ + probePin = 18; + buttonPin = 19; +} +restartProbing: int lastRow[10]; int pokedNumber = 0; - Serial.print("Press any key to exit and commit paths (or touch probe to gpio 18) "); - if (setOrClear == 1) - { - Serial.print("Set bridges\n\n\n\r"); - rawOtherColors[1] = 0x4500e8; - rainbowIndex = 0; - } - else - { - Serial.print("Clear bridges\n\n\n\r"); - rawOtherColors[1] = 0x8855A8; - rainbowIndex = 12; - } // Serial.print(numberOfNets); @@ -96,16 +105,42 @@ int probeMode(int pin, int setOrClear) int row[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + row[1] = -2; probeTimeout = millis(); int readPercentage[101]; probingTimer = millis(); + // Serial.print("Press any key to exit and commit paths (or touch probe to gpio 18) "); + Serial.print("\n\r\t Probing mode\n\n\r"); + Serial.print(" long press = connect (pink) / clear (orange)\n\r"); + Serial.print(" short press = commit\n\r"); + + if (setOrClear == 1) + { + Serial.print("\n\r\t connect nodes\n\n\n\r"); + rawOtherColors[1] = 0x4500e8; + rainbowIndex = 0; + } + else + { + Serial.print("\n\r\t clear nodes\n\n\n\r"); + rawOtherColors[1] = 0x6644A8; + rainbowIndex = 12; + } + + unsigned long probeButtonTimer = 0; + if (setOrClear == 0) { - delay(1000); + probeButtonTimer = millis(); + + // probingTimer = millis() -400; } + unsigned long doubleSelectTimeout = millis(); + int doubleSelectCountdown = 0; + while (Serial.available() == 0 && (millis() - probeTimeout) < 6200) { delayMicroseconds(38000); @@ -114,26 +149,41 @@ int probeMode(int pin, int setOrClear) row[0] = scanRows(ADC0_PIN); - if (row[0] == -18 && millis() - probingTimer > 500 && checkProbeButton() == 1) + if (row[0] == -18 && (millis() - probingTimer > 500) && checkProbeButton() == 1 && millis() - probeButtonTimer > 1500) { + if (longShortPress(1000) == 1) + { + setOrClear = !setOrClear; + probingTimer = millis(); + goto restartProbing; + break; + } // Serial.print("\n\rCommitting paths!\n\r"); - // probingTimer = millis(); + row[1] = -2; + probingTimer = millis(); + + connectedRowsIndex = 0; + + + node1or2 = 0; + nodesToConnect[0] = -1; + nodesToConnect[1] = -1; + + //showLEDsCore2 = 1; + + - // if (node1or2 == 1) - // { - // leds.setPixelColor(nodesToPixelMap[nodesToConnect[0]], 0, 0, 0); - // showLEDsCore2 = 1; - // nodesToConnect[0] = -1; - // nodesToConnect[1] = -1; - // } break; } + else + { + // probingTimer = millis(); + } if (row[0] != -1 && row[0] != row[1]) { - row[1] = row[0]; - + // row[1] = row[0]; if (connectedRowsIndex > 1) { @@ -162,14 +212,20 @@ int probeMode(int pin, int setOrClear) } connectedRowsIndex = connectedRows2Index[maxIndex]; + std::sort(connectedRows, connectedRows + connectedRowsIndex); + nodesToConnect[node1or2] = selectFromLastFound(); + node1or2++; probingTimer = millis(); + // showLEDsCore2 = 1; + delay(30); } else if (connectedRowsIndex == 1) { nodesToConnect[node1or2] = connectedRows[0]; - + printNodeOrName(nodesToConnect[0]); + Serial.print("\r\t"); if (node1or2 == 1 && setOrClear == 1 && nodesToConnect[0] == GND) { leds.setPixelColor(nodesToPixelMap[nodesToConnect[1]], 0, 45, 5); @@ -186,29 +242,37 @@ int probeMode(int pin, int setOrClear) { leds.setPixelColor(nodesToPixelMap[nodesToConnect[0]], 45, 5, 0); } - else { + // Serial.print("!!!!!"); leds.setPixelColor(nodesToPixelMap[connectedRows[0]], rainbowList[rainbowIndex][0], rainbowList[rainbowIndex][1], rainbowList[rainbowIndex][2]); + // leds.show(); } node1or2++; probingTimer = millis(); - showLEDsCore2 = 1; + showLEDsCore2 = 2; + delay(10); + + // delay(3); + } + if (node1or2 == 1) + { } - - if (node1or2 >= 2) + if (node1or2 >= 2 || (setOrClear == 0 && node1or2 >= 1)) { - printNodeOrName(nodesToConnect[0]); - Serial.print(" - "); - printNodeOrName(nodesToConnect[1]); - Serial.print("\t\t"); + if (setOrClear == 1) { - Serial.print("Connected\n\r"); + Serial.print("\r \r"); + printNodeOrName(nodesToConnect[0]); + Serial.print(" - "); + printNodeOrName(nodesToConnect[1]); + Serial.print(" \t "); + Serial.print("connected\n\r"); addBridgeToNodeFile(nodesToConnect[0], nodesToConnect[1]); - //rainbowIndex++; + // rainbowIndex++; if (rainbowIndex > 1) { rainbowIndex = 0; @@ -223,22 +287,35 @@ int probeMode(int pin, int setOrClear) leds.clear(); assignNetColors(); // Serial.print("bridgesToPaths\n\r"); - // delay(18); + // delay(18); // showNets(); - //showLEDsCore2 = 1; - sendAllPathsCore2 = 1; + showLEDsCore2 = 1; + // digitalWrite(RESETPIN, HIGH); + // delayMicroseconds(10); + + // sendAllPathsCore2 = 1; + // digitalWrite(RESETPIN, LOW); delay(25); + + // row[1] = -1; + + // doubleSelectTimeout = millis(); + + doubleSelectTimeout = millis(); + doubleSelectCountdown = 2000; } else { - Serial.print("Disconnected\n\r"); - removeBridgeFromNodeFile(nodesToConnect[0], nodesToConnect[1]); + Serial.print("\r \r"); + printNodeOrName(nodesToConnect[0]); + Serial.print("\t cleared\n\r"); + removeBridgeFromNodeFile(nodesToConnect[0]); leds.setPixelColor(nodesToPixelMap[nodesToConnect[0]], 0, 0, 0); - leds.setPixelColor(nodesToPixelMap[nodesToConnect[1]], 0, 0, 0); + //leds.setPixelColor(nodesToPixelMap[nodesToConnect[1]], 0, 0, 0); rainbowIndex = 12; - + //printNodeFile(); clearAllNTCC(); openNodeFile(); getNodesToConnect(); @@ -248,30 +325,45 @@ int probeMode(int pin, int setOrClear) leds.clear(); assignNetColors(); // Serial.print("bridgesToPaths\n\r"); - //delay(18); + // delay(18); // showNets(); - //showLEDsCore2 = 1; - sendAllPathsCore2 = 1; - //logoFlash = 1; + showLEDsCore2 = 1; + // sendAllPathsCore2 = 1; + // logoFlash = 1; delay(25); + // row[1] = -1; } node1or2 = 0; nodesToConnect[0] = -1; nodesToConnect[1] = -1; - } else if (node1or2 == 1) - { - - - // Serial.print(" "); - + // row[1] = -2; + doubleSelectTimeout = millis(); + doubleSelectCountdown = 2000; } - // Serial.print("\n\n\r"); - // delay(1000); - row[1] = row[0]; } + if (node1or2 == 0 && doubleSelectCountdown <= 0) + { + + row[1] = -2; + } + + // Serial.println(doubleSelectCountdown); + + if (doubleSelectCountdown <= 0) + { + + doubleSelectCountdown = 0; + } + else + { + doubleSelectCountdown = doubleSelectCountdown - (millis() - doubleSelectTimeout); + + doubleSelectTimeout = millis(); + } + probeTimeout = millis(); } digitalWrite(RESETPIN, LOW); @@ -281,19 +373,20 @@ int probeMode(int pin, int setOrClear) bridgesToPaths(); // clearLEDs(); - //leds.clear(); + leds.clear(); assignNetColors(); // // Serial.print("bridgesToPaths\n\r"); // delay(18); // // showNets(); // showLEDsCore2 = 1; - rawOtherColors[1] = 0x550004; -showLEDsCore2 = 1; + rawOtherColors[1] = 0x550004; + showLEDsCore2 = 1; sendAllPathsCore2 = 1; // delay(25); - // pinMode(19, INPUT); - delay(300); + // pinMode(probePin, INPUT); + delay(300); + row[1] = -2; return 1; } @@ -306,41 +399,70 @@ int selectFromLastFound(void) int selected = 0; int selectionConfirmed = 0; + Serial.print("\n\r"); + Serial.print(" multiple nodes found\n\n\r"); + Serial.print(" short press = cycle through nodes\n\r"); + Serial.print(" long press = select\n\r"); + + Serial.print("\n\r "); + for (int i = 0; i < connectedRowsIndex; i++) + { + + printNodeOrName(connectedRows[i]); + if (i < connectedRowsIndex - 1) + { + Serial.print(", "); + } + } + Serial.print("\n\n\r "); + + uint32_t previousColor[connectedRowsIndex]; + + for (int i = 0; i < connectedRowsIndex; i++) + { + previousColor[i] = leds.getPixelColor(nodesToPixelMap[connectedRows[i]]); + } + while (selectionConfirmed == 0) { probeTimeout = millis(); - if (millis() - blinkTimer > 100) - { - // selected++; - // if (selected >= lastFoundIndex[node1or2]) - // { - // selected = 0; - // } + // if (millis() - blinkTimer > 100) + // { for (int i = 0; i < connectedRowsIndex; i++) { if (i == selected) { - leds.setPixelColor(nodesToPixelMap[connectedRows[i]], rainbowList[rainbowIndex][0], rainbowList[rainbowIndex][1], rainbowList[rainbowIndex][2]); + leds.setPixelColor(nodesToPixelMap[connectedRows[i]], rainbowList[0][0], rainbowList[0][1], rainbowList[0][2]); } else { - leds.setPixelColor(nodesToPixelMap[connectedRows[i]], rainbowList[rainbowIndex][0] / 4, rainbowList[rainbowIndex][1] / 4, rainbowList[rainbowIndex][2] / 4); + // uint32_t previousColor = leds.getPixelColor(nodesToPixelMap[connectedRows[i]]); + if (previousColor[i] != 0) + { + int r = (previousColor[i] >> 16) & 0xFF; + int g = (previousColor[i] >> 8) & 0xFF; + int b = (previousColor[i] >> 0) & 0xFF; + leds.setPixelColor(nodesToPixelMap[connectedRows[i]], (r / 3) + 3, (g / 3) + 3, (b / 3) + 3); + } + else + { + + leds.setPixelColor(nodesToPixelMap[connectedRows[i]], rainbowList[0][0] / 8, rainbowList[0][1] / 8, rainbowList[0][2] / 8); + } } } - showLEDsCore2 = 1; + Serial.print("\r"); + Serial.print(""); + printNodeOrName(connectedRows[selected]); + Serial.print(" "); + //leds.show(); + showLEDsCore2 = 2; blinkTimer = millis(); - } - - // if (checkProbeButton() == 1) - // { - // delay(10); - - // if (checkProbeButton() == 1) - // { - + // } + delay(30); int longShort = longShortPress(); - + delay(5); if (longShort == 1) { selectionConfirmed = 1; @@ -365,19 +487,16 @@ int selectFromLastFound(void) return selected2; // break; } - else + else if (longShort == 0) { + selected++; blinkTimer = 0; - while (1) - { - if (checkProbeButton() == 1) - { - break; - } - delay(5); - } + // break; + //} + // delay(5); + // Serial.print("\n\r"); // Serial.print("node1or2: "); // Serial.println(node1or2); @@ -393,15 +512,16 @@ int selectFromLastFound(void) selected = 0; } - delay(20); + //delay(100); } + delay(15); // } //} // showLEDsCore2 = 1; } - - return selected; +int selected2 = connectedRows[selected]; + return selected2; } int longShortPress(int pressLength) @@ -411,13 +531,21 @@ int longShortPress(int pressLength) clickTimer = millis(); - while (millis() - clickTimer < pressLength) + if (checkProbeButton() == 1) { - if (checkProbeButton() == 0) + + while (millis() - clickTimer < pressLength) { - return 0; + if (checkProbeButton() == 0) + { + return 0; + } + delay(5); } - delay(5); + } + else + { + return -1; } return 1; @@ -429,7 +557,7 @@ int checkProbeButton(void) startProbe(); - if (readFloatingOrState(18, 0) == probe) + if (readFloatingOrState(buttonPin, 0) == probe) { buttonState = 1; } @@ -461,13 +589,13 @@ int readFloatingOrState(int pin, int rowBeingScanned) if (rowBeingScanned != -1) { - analogWrite(19, 128); + analogWrite(probePin, 128); while (1) // this is the silliest way to align to the falling edge of the probe PWM signal { - if (gpio_get(19) != 0) + if (gpio_get(probePin) != 0) { - if (gpio_get(19) == 0) + if (gpio_get(probePin) == 0) { break; } @@ -489,9 +617,9 @@ int readFloatingOrState(int pin, int rowBeingScanned) { while (1) // this is the silliest way to align to the falling edge of the probe PWM signal { - if (gpio_get(19) != 0) + if (gpio_get(probePin) != 0) { - if (gpio_get(19) == 0) + if (gpio_get(probePin) == 0) { break; } @@ -527,28 +655,36 @@ int readFloatingOrState(int pin, int rowBeingScanned) } else { - // Serial.print(readingPullup); - // Serial.print(readingPullup2); - // Serial.print(readingPullup3); - // //Serial.print(" "); - // Serial.print(readingPulldown); - // Serial.print(readingPulldown2); - // Serial.print(readingPulldown3); - // Serial.print("\n\r"); - if (readingPullup == 1 && readingPulldown == 0) + + if (readingPullup2 == 1 && readingPulldown2 == 0) { state = floating; } - else if (readingPullup == 1 && readingPulldown == 1) + else if (readingPullup2 == 1 && readingPulldown2 == 1) { + // Serial.print(readingPullup); + // // Serial.print(readingPullup2); + // // Serial.print(readingPullup3); + // // //Serial.print(" "); + // Serial.print(readingPulldown); + // // Serial.print(readingPulldown2); + // // Serial.print(readingPulldown3); + // Serial.print("\n\r"); state = high; } - else if (readingPullup == 0 && readingPulldown == 0) + else if (readingPullup2 == 0 && readingPulldown2 == 0) { - + // Serial.print(readingPullup); + // // Serial.print(readingPullup2); + // // Serial.print(readingPullup3); + // // //Serial.print(" "); + // Serial.print(readingPulldown); + // // Serial.print(readingPulldown2); + // // Serial.print(readingPulldown3); + // Serial.print("\n\r"); state = low; } else if (readingPullup == 0 && readingPulldown == 1) @@ -572,17 +708,17 @@ void startProbe(long probeSpeed) probeFrequency = probeSpeed; probeHalfPeriodus = 1000000 / probeSpeed / 2; - pinMode(19, OUTPUT); + pinMode(probePin, OUTPUT); analogWriteFreq(probeSpeed); - analogWrite(19, 128); + analogWrite(probePin, 128); // delayMicroseconds(10); - // pinMode(18, INPUT); + // pinMode(buttonPin, INPUT); } void stopProbe() { - pinMode(19, INPUT); - pinMode(18, INPUT); + pinMode(probePin, INPUT); + pinMode(buttonPin, INPUT); } int checkLastFound(int found) @@ -612,16 +748,18 @@ int scanRows(int pin) digitalWrite(RESETPIN, LOW); // delayMicroseconds(20); - pinMode(19, INPUT); - // delayMicroseconds(10); - int probeRead = readFloatingOrState(19, -1); + pinMode(probePin, INPUT); + delayMicroseconds(400); + int probeRead = readFloatingOrState(probePin, -1); if (probeRead == high) { found = SUPPLY_5V; connectedRows[connectedRowsIndex] = found; connectedRowsIndex++; - //return connectedRows[connectedRowsIndex]; + // return connectedRows[connectedRowsIndex]; + //Serial.print("high"); + return found; } else if (probeRead == low) @@ -629,9 +767,11 @@ int scanRows(int pin) found = GND; connectedRows[connectedRowsIndex] = found; connectedRowsIndex++; + return found; + // return connectedRows[connectedRowsIndex]; // Serial.print(connectedRows[connectedRowsIndex]); - //return connectedRows[connectedRowsIndex]; + // return connectedRows[connectedRowsIndex]; } startProbe(); @@ -785,6 +925,10 @@ int scanRows(int pin) // stopProbe(); // probeTimeout = millis(); + + digitalWrite(RESETPIN, HIGH); + delayMicroseconds(20); + digitalWrite(RESETPIN, LOW); return connectedRows[0]; // return found; diff --git a/JumperlessNano/src/Probing.h b/JumperlessNano/src/Probing.h index d2a5772..f5cf1d5 100644 --- a/JumperlessNano/src/Probing.h +++ b/JumperlessNano/src/Probing.h @@ -6,6 +6,10 @@ extern unsigned long probingTimer; extern long probeFrequency; +extern int probePin; +extern int buttonPin; + +extern int probeSwap; enum measuredState { diff --git a/JumperlessNano/src/main.cpp b/JumperlessNano/src/main.cpp index 2c9bf12..6e0388c 100644 --- a/JumperlessNano/src/main.cpp +++ b/JumperlessNano/src/main.cpp @@ -131,7 +131,7 @@ int baudRate = 115200; int restoredNodeFile = 0; -const char firmwareVersion[] = "1.3.4"; //// remember to update this +const char firmwareVersion[] = "1.3.5"; //// remember to update this void loop() { @@ -151,14 +151,16 @@ menu: Serial.print("\n\n\r\t\t\tMenu\n\n\r"); Serial.print("\tn = show netlist\n\r"); Serial.print("\tb = show bridge array\n\r"); + Serial.print("\ts = show node file\n\r"); + Serial.print("\tf = load formatted node file\n\r"); Serial.print("\tw = waveGen\n\r"); Serial.print("\tv = toggle show current/voltage\n\r"); - Serial.print("\tf = load formatted nodeFile\n\r"); Serial.print("\tu = set baud rate for USB-Serial\n\r"); Serial.print("\tl = LED brightness / test\n\r"); Serial.print("\td = toggle debug flags\n\r"); Serial.print("\tr = reset Arduino\n\r"); Serial.print("\tp = probe connections\n\r"); + Serial.print("\tc = clear nodes with probe\n\r"); Serial.print("\n\n\r"); dontshowmenu: @@ -182,7 +184,7 @@ dontshowmenu: { if (checkProbeButton() == 1) { - int longShort = longShortPress(1500); + int longShort = longShortPress(1000); if (longShort == 1) { input = 'c'; @@ -222,6 +224,17 @@ skipinput: Serial.println(firmwareVersion); break; } + + case 's': + Serial.print("\n\n\r"); + Serial.print("\tNode File\n\r"); + Serial.print("\n\ryou can paste this into the menu to reload this circuit"); + Serial.print("\n\r(make sure you grab an extra blank line at the end)\n\r"); + Serial.print("\n\n\rf "); + printNodeFile(); + Serial.print("\n\n\r"); + break; + case 'v': if (showReadings >= 3 || (inaConnected == 0 && showReadings >= 1)) @@ -326,6 +339,7 @@ skipinput: savePreformattedNodeFile(serSource); // Serial.print("savePFNF\n\r"); + //debugFP = 1; openNodeFile(); getNodesToConnect(); // Serial.print("openNF\n\r"); @@ -440,22 +454,26 @@ skipinput: Serial.print("\n\r1. file parsing = "); Serial.print(debugFP); - Serial.print("\n\r2. file parsing time = "); - Serial.print(debugFPtime); - - Serial.print("\n\r3. net manager = "); + Serial.print("\n\r2. net manager = "); Serial.print(debugNM); - Serial.print("\n\r4. net manager time = "); - Serial.print(debugNMtime); - - Serial.print("\n\r5. chip connections = "); + Serial.print("\n\r3. chip connections = "); Serial.print(debugNTCC); - Serial.print("\n\r6. chip conns alt paths = "); + Serial.print("\n\r4. chip conns alt paths = "); Serial.print(debugNTCC2); - Serial.print("\n\r7. LEDs = "); + Serial.print("\n\r5. LEDs = "); Serial.print(debugLEDs); + Serial.print("\n\n\r6. swap probe pin = "); + if (probeSwap == 0) + { + Serial.print("19"); + } + else + { + Serial.print("18"); + } + - Serial.print("\n\n\r"); + Serial.print("\n\n\n\r"); while (Serial.available() == 0) ; @@ -742,11 +760,23 @@ void loop1() // core 2 handles the LEDs and the CH446Q8 { int rails = showLEDsCore2; - // showNets(); + + if (rails == 1) { lightUpRail(-1, -1, 1, 28, supplySwitchPosition); } + + + if (rails == 2) + { + + } else { + showNets(); + } + + + if (rails > 3) { Serial.print("\n\r"); @@ -844,7 +874,7 @@ void loop1() // core 2 handles the LEDs and the CH446Q8 logoFlash = 1; } - if (logoFlash == 1 && logoFlashTimer != 0 && millis() - logoFlashTimer > 250) + if (logoFlash == 1 && logoFlashTimer != 0 && millis() - logoFlashTimer > 150) { logoFlash = 0; logoFlashTimer = 0;