Fixed a bug where bounces wouldn't check for overlaps

phew
This commit is contained in:
Kevin Santo Cappuccio 2023-09-19 10:18:59 -07:00
parent 20ec8043fe
commit 3a66d7fb12
6 changed files with 262 additions and 87 deletions

View File

@ -0,0 +1,22 @@
{
"folders": [
{
"path": "."
}
],
"settings": {
"files.associations": {
"array": "cpp",
"deque": "cpp",
"list": "cpp",
"string": "cpp",
"unordered_map": "cpp",
"vector": "cpp",
"string_view": "cpp",
"initializer_list": "cpp",
"ranges": "cpp",
"cstring": "cpp",
"cmath": "cpp"
}
}
}

View File

@ -89,7 +89,7 @@ void isrFromPio(void)
}
}
delayMicroseconds(1);
delayMicroseconds(2);
digitalWriteFast(CS_A, LOW);
digitalWriteFast(CS_B, LOW);
digitalWriteFast(CS_C, LOW);
@ -103,7 +103,7 @@ void isrFromPio(void)
digitalWriteFast(CS_J, LOW);
digitalWriteFast(CS_K, LOW);
digitalWriteFast(CS_L, LOW);
delayMicroseconds(2);
irq_flags = pio0_hw->irq;
pio_interrupt_clear(pio, PIO0_IRQ_0);
hw_clear_bits(&pio0_hw->irq, irq_flags);
@ -219,6 +219,11 @@ void sendPath(int i, int setOrClear)
chipToConnect = path[i].chip[chip];
if (path[i].y[chip] == -1 || path[i].x[chip] == -1)
{
continue;
}
chYdata = path[i].y[chip];
chXdata = path[i].x[chip];
@ -243,7 +248,7 @@ void sendPath(int i, int setOrClear)
pio_sm_put(pio, sm, chAddress);
delayMicroseconds(40);
delayMicroseconds(60);
//}
}
}

View File

@ -37,6 +37,10 @@ CHIP_H,CHIP_H,CHIP_H,CHIP_H,CHIP_H,CHIP_H,CHIP_H, //53,54,55,56,57,58,59
CHIP_L}; //60
// const int xHopMap[12][12][16] = //[chip] [other chip][x]
// {
struct chipStatus ch[12] = {

View File

@ -559,7 +559,7 @@ void commitPaths(void)
if (debugNTCC2 == true)
{
Serial.print(" \tchip[0]: ");
Serial.print(chipNumToChar(path[i].chip[0]));
@ -718,7 +718,8 @@ void resolveAltPaths(void)
}
for (int bb = 0; bb < 8; bb++) // check if any other chips have free paths to both the sf chip and target chip
{tryAfterSwap:
{
tryAfterSwap:
if (foundPath == 1)
{
@ -826,28 +827,28 @@ void resolveAltPaths(void)
}
break;
}
int xMapBB = xMapForChipLane0(path[i].chip[0], bb);
int yMapSF = bb;//always
int yMapSF = bb; // always
int sfChip = path[i].chip[1];
// not chip L
if (debugNTCC2)
{
Serial.print(" bb: ");
printChipNumToChar(bb);
Serial.print(" \t sfChip: ");
printChipNumToChar(sfChip);
Serial.print(" \t xMapBB: ");
Serial.print(xMapBB);
Serial.print(" \t yMapSF: ");
Serial.print(yMapSF);
Serial.print(" \t xStatus: ");
Serial.print(ch[0].xStatus[xMapBB]);
Serial.print(" \n\r");
}
if (debugNTCC2)
{
Serial.print(" bb: ");
printChipNumToChar(bb);
Serial.print(" \t sfChip: ");
printChipNumToChar(sfChip);
Serial.print(" \t xMapBB: ");
Serial.print(xMapBB);
Serial.print(" \t yMapSF: ");
Serial.print(yMapSF);
Serial.print(" \t xStatus: ");
Serial.print(ch[0].xStatus[xMapBB]);
Serial.print(" \n\r");
}
if ((ch[0].xStatus[xMapBB] == path[i].net || ch[0].xStatus[xMapBB] == -1)) // were going through each bb chip to see if it has a connection to both chips free
{
@ -857,32 +858,32 @@ void resolveAltPaths(void)
int xMapL0c1 = xMapForChipLane0(bb, path[i].chip[0]);
int xMapL1c1 = xMapForChipLane1(bb, path[i].chip[0]);
if (debugNTCC2)
{
Serial.print(" bb: ");
printChipNumToChar(bb);
Serial.print(" \t sfChip: ");
printChipNumToChar(sfChip);
Serial.print(" \t xMapBB: ");
Serial.print(xMapBB);
Serial.print(" \t yMapSF: ");
Serial.print(yMapSF);
Serial.print(" \t xStatus: ");
Serial.print(ch[bb].xStatus[xMapBB]);
Serial.print(" \n\r");
Serial.print("xMapL0c0: ");
Serial.print(xMapL0c0);
Serial.print(" \txMapL1c0: ");
if (debugNTCC2)
{
Serial.print(" bb: ");
printChipNumToChar(bb);
Serial.print(" \t sfChip: ");
printChipNumToChar(sfChip);
Serial.print(" \t xMapBB: ");
Serial.print(xMapBB);
Serial.print(" \t yMapSF: ");
Serial.print(yMapSF);
Serial.print(" \t xStatus: ");
Serial.print(ch[bb].xStatus[xMapBB]);
Serial.print(" \n\r");
Serial.print(xMapL0c1);
Serial.print(" \txMapL1c1: ");
Serial.print("xMapL0c0: ");
Serial.print(xMapL0c0);
Serial.print(" \txMapL1c0: ");
Serial.print(xMapL1c0);
Serial.print(" \txMapL0c1: ");
Serial.print(xMapL1c1);
Serial.print("\n\n\r");
}
Serial.print(xMapL0c1);
Serial.print(" \txMapL1c1: ");
Serial.print(xMapL1c0);
Serial.print(" \txMapL0c1: ");
Serial.print(xMapL1c1);
Serial.print("\n\n\r");
}
int freeLane = -1;
// Serial.print("\t");
// Serial.print(bb);
@ -890,17 +891,14 @@ void resolveAltPaths(void)
if ((xMapL1c0 != -1) && ch[path[i].chip[0]].xStatus[xMapL1c0] == path[i].net) // check if lane 1 shares a net first so it should prefer sharing lanes
{
freeLane = 1;
}
else if ((ch[path[i].chip[0]].xStatus[xMapL0c0] == -1) || ch[path[i].chip[0]].xStatus[xMapL0c0] == path[i].net) // lanes will alway be taken together, so only check chip 1
{
freeLane = 0;
}
else if ((xMapL1c0 != -1) && ((ch[path[i].chip[0]].xStatus[xMapL1c0] == -1) || ch[path[i].chip[0]].xStatus[xMapL1c0] == path[i].net))
{
freeLane = 1;
}
else
{
@ -909,6 +907,12 @@ void resolveAltPaths(void)
if ( ch[sfChip].yStatus[yMapSF] != -1 && ch[sfChip].yStatus[yMapSF] != path[i].net)
{
continue;
}
path[i].chip[2] = bb;
path[i].altPathNeeded = false;
@ -918,7 +922,6 @@ void resolveAltPaths(void)
// Serial.print("\n\r\t\t\t\tFree Lane: ");
// Serial.println(freeLane);
if (freeLane == 0)
{
@ -932,13 +935,13 @@ void resolveAltPaths(void)
path[i].x[1] = SFnode;
path[i].x[2] = xMapL0c1;
// Serial.print("\n\r\t\t\t\txBB: ");
// Serial.println(bb);
//Serial.print("\n\r\t\t\t\txBB: ");
//Serial.println(bb);
xMapBB = xMapForChipLane0(path[i].chip[2], path[i].chip[1]);
// Serial.println(xMapBB);
//Serial.println(xMapBB);
path[i].chip[3] = path[i].chip[2];
path[i].x[3] = xMapBB;
path[i].y[0] = yMapForNode(path[i].node1, path[i].chip[0]);
@ -950,12 +953,6 @@ void resolveAltPaths(void)
ch[path[i].chip[1]].yStatus[path[i].y[1]] = path[i].net;
path[i].sameChip = true;
}
else if (freeLane == 1)
{
@ -1020,9 +1017,9 @@ void resolveAltPaths(void)
{
swapped = 1;
if (debugNTCC2 == true)
Serial.print("\n\rtrying again with swapped nodes\n\r");
Serial.print("\n\rtrying again with swapped nodes\n\r");
//path[i].x[0] = xMapForNode(path[i].node2, path[i].chip[0]);
// path[i].x[0] = xMapForNode(path[i].node2, path[i].chip[0]);
swapDuplicateNode(i);
bb = 0;
goto tryAfterSwap;
@ -1425,7 +1422,7 @@ void resolveAltPaths(void)
for (int bb = 0; bb < 8; bb++) // this is a long winded way to do this but it's at least slightly readable
{
//Serial.print("! ");
// Serial.print("! ");
int sfChip1 = path[i].chip[0];
int sfChip2 = path[i].chip[1];
@ -1655,7 +1652,7 @@ void resolveUncommittedHops(void)
for (int chip2 = 0; chip2 < 4; chip2++)
{
if ((path[i].chip[chip] == path[i].chip[chip2] && chip != chip2) || (chip == 2 && path[i].chip[2] != -1))//(path[i].x[3] != -1 || path[i].y[3] != -1)) )
if ((path[i].chip[chip] == path[i].chip[chip2] && chip != chip2) || (chip == 2 && path[i].chip[2] != -1)) //(path[i].x[3] != -1 || path[i].y[3] != -1)) )
{
for (int xy = 0; xy < 6; xy++)
{
@ -1726,32 +1723,136 @@ void resolveUncommittedHops(void)
int freeXSearchOrder[12][16] = {
// this disallows bounces from sf x pins that would cause problems (5V, GND, etc.)
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
{-1, -1, 2, 3, 4, 5, 6, 7, 8, -1, 10, 11, 12, 13, 14, 15},
{0, 1, -1, -1, 4, 5, 6, 7, 8, 9, 10, -1, 12, 13, 14, 15},
{0, 1, 2, 3, -1, -1, 6, 7, 8, 9, 10, 11, 12, -1, 14, 15},
{0, 1, 2, 3, 4, 5, -1, -1, 8, 9, 10, 11, 12, 13, 14, -1},
{0, -1, 2, 3, 4, 5, 6, 7, -1, -1, 10, 11, 12, 13, 14, 15},
{0, 1, 2, -1, 4, 5, 6, 7, 8, 9, -1, -1, 12, 13, 14, 15},
{0, 1, 2, 3, 4, -1, 6, 7, 8, 9, 10, 11, -1, -1, 14, 15},
{0, 1, 2, 3, 4, 5, 6, -1, 8, 9, 10, 11, 12, 13, -1, -1},
{13, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -1, -1, -1},
{13, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -1, -1, -1},
{15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0},
{5, 4, 3, 2, 13, 12, 1, 0, -1, -1, -1, -1, -1, -1, -1, -1},
};
// int freeXSearchOrder[12][16] = {
// // this disallows bounces from sf x pins that would cause problems (5V, GND, etc.)
// {2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, -1, -1, -1},
// {0, 1, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, -1, -1, -1},
// {0, 1, 2, 3, 6, 7, 8, 9, 10, 11, 12, 14, 15, -1, -1, -1},
// {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, -1, -1, -1 },
// {0, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, -1, -1, -1},
// {0, 1, 2, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15, -1, -1, -1},
// {0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 14, 15, -1, -1, -1},
// {0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, -1, -1, -1},
// {13, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -1, -1},
// {13, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -1, -1},
// {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0},
// {5, 4, 3, 2, 13, 12, 1, 0, -1, -1, -1, -1, -1, -1, -1, -1},
// };
for (int chip = 0; chip < 4; chip++)
{
if (sameChips[0][chip] != -1)
{
int otherChip = -1;
int otherChipX = -1;
int checkOtherEnd = -1;
int otherChipXStatus = 99;
int thisChip = sameChips[0][chip];
for (int freeXidx = 0; freeXidx < 16; freeXidx++)
{
if (ch[sameChips[0][chip]].xStatus[freeXSearchOrder[sameChips[0][chip]][freeXidx]] == -1 && freeXSearchOrder[sameChips[0][chip]][freeXidx] != -1)
if (freeXSearchOrder[thisChip][freeXidx] == -1)
{
freeX = freeXSearchOrder[sameChips[0][chip]][freeXidx];
break;
continue;
}
if (debugNTCC2)
{
Serial.print("freeXidx: ");
Serial.print(freeXidx);
Serial.print(" actual freeX: ");
Serial.print(freeXSearchOrder[thisChip][freeXidx]);
Serial.print(" status: ");
Serial.print(ch[thisChip].xStatus[freeXSearchOrder[thisChip][freeXidx]]);
Serial.println("\n\r ");
}
if (ch[thisChip].xStatus[freeXSearchOrder[thisChip][freeXidx]] == -1 && freeXSearchOrder[thisChip][freeXidx] != -1)
{
otherChip = ch[thisChip].xMap[freeXSearchOrder[thisChip][freeXidx]];
// otherChipX = ch[otherChip].xMap[checkOtherEnd];
int lane = -1;
if (freeXidx % 2 == 0)
{
lane = 0;
}
else
{
lane = 1;
}
if (lane == 1)
{
otherChipX = xMapForChipLane1( otherChip, thisChip);
} else if (lane == 0)
{
otherChipX = xMapForChipLane0(otherChip, thisChip);
}
// for (int otherChipXidx = 0; otherChipXidx < 16; otherChipXidx++)
// {
// if (ch[otherChip].xMap[otherChipXidx] == thisChip)
// {
// otherChipX = otherChipXidx;
// break;
// }
// }
otherChipXStatus = ch[otherChip].xStatus[otherChipX];
if (debugNTCC2)
{
Serial.print("Checking free X connections on the bounce chip for freeness\n\r");
Serial.print("thisChip: ");
Serial.println(chipNumToChar(thisChip));
Serial.print("thisChipX: ");
Serial.println(freeXSearchOrder[thisChip][freeXidx]);
Serial.print("\nlane: ");
Serial.println(lane);
Serial.print("otherChip: ");
Serial.println(chipNumToChar(otherChip));
//Serial.print("checkOtherEnd X: ");
//Serial.println(checkOtherEnd);
Serial.print("otherChipX: ");
Serial.println(otherChipX);
Serial.print("otherChipXStatus: ");
Serial.println(ch[otherChip].xStatus[otherChipX]);
Serial.println(" ");
Serial.println(" ");
}
if (otherChipXStatus == -1 || otherChipXStatus == path[i].net)
{
freeX = freeXSearchOrder[thisChip][freeXidx];
break;
}
}
}
@ -1760,9 +1861,14 @@ void resolveUncommittedHops(void)
if (path[i].x[x] == -2)
{
path[i].x[x] = freeX;
ch[sameChips[0][chip]].xStatus[freeX] = path[i].net;
ch[otherChip].xStatus[otherChipX] = path[i].net;
ch[thisChip].xStatus[freeX] = path[i].net;
}
}
if (debugNTCC2)
{
printChipStatus();
}
}
}
}
@ -1779,6 +1885,7 @@ void resolveUncommittedHops(void)
if (ch[sameChips[1][chip]].yStatus[freeYsearch] == -1)
{
freeY = freeYsearch;
// Serial.print("freeY: ");
// Serial.println(freeY);
@ -1831,7 +1938,7 @@ void swapDuplicateNode(int pathIndex)
path[pathIndex].chip[1] = duplucateSFnodes[i][2];
break;
//path[pathIndex].x[1] = duplucateSFnodes[i][3];
// path[pathIndex].x[1] = duplucateSFnodes[i][3];
}
}
}
@ -2201,7 +2308,7 @@ void assignPathType(int pathIndex)
if ((path[pathIndex].node1 == 1 || path[pathIndex].node1 == 30 || path[pathIndex].node1 == 31 || path[pathIndex].node1 == 60) || path[pathIndex].chip[0] == CHIP_L)
{
// Serial.print("\n\n\rthis should be a bb to sf connection\n\n\n\r ");
// Serial.print("\n\n\rthis should be a bb to sf connection\n\n\n\r ");
swapNodes(pathIndex);
path[pathIndex].Lchip = true;
@ -2223,7 +2330,7 @@ void assignPathType(int pathIndex)
if ((path[pathIndex].node2 == 1 || path[pathIndex].node2 == 30 || path[pathIndex].node2 == 31 || path[pathIndex].node2 == 60) || path[pathIndex].chip[1] == CHIP_L)
{
//Serial.print("\n\n\rthis should be a bb to sf connection 2\n\n\n\r ");
// Serial.print("\n\n\rthis should be a bb to sf connection 2\n\n\n\r ");
path[pathIndex].Lchip = true;
path[pathIndex].nodeType[1] = SF;
}

View File

@ -115,12 +115,16 @@ void initDAC(void)
SPI.setTX(3);
SPI.begin();
// dac_rev3.maxValue = 4095;
//dac_rev3.maxValue = 4095;
delay(5);
dac_rev3.setGain(2);
delay(5);
dac_rev3.begin(1);
delay(5);
setDac0_5Vvoltage(0.00);
// setDac0_5VinputCode(4095);
setDac1_8VinputCode(4095);
}
}
@ -201,10 +205,12 @@ void setDac0_5Vvoltage(float voltage)
else
{
int voltageCode = voltage * 4095 / 5;
// dac_rev3.analogWrite((uint16_t)voltageCode, 0);
dac_rev3.fastWriteA((uint16_t)voltageCode);
lastInputCode0 = voltageCode;
dac_rev3.fastWriteB(lastInputCode1);
//dac_rev3.fastWriteB(lastInputCode1);
}
}
@ -219,7 +225,7 @@ void setDac0_5VinputCode(uint16_t inputCode)
dac_rev3.analogWrite(inputCode, 0);
dac_rev3.fastWriteA(inputCode);
lastInputCode0 = inputCode;
dac_rev3.fastWriteB(lastInputCode1);
//dac_rev3.fastWriteB(lastInputCode1);
}
}
@ -278,7 +284,7 @@ int readAdc(int channel, int samples)
int waveGen(void)
{
int loopCounter = 0;
int c = 0;
listSpecialNets();
listNets();
@ -336,6 +342,11 @@ int waveGen(void)
{
//adc0Reading = INA1.getBusVoltage_mV();
// adc0Reading = dac0_5V.getInputCode();
if (c == 'q')
{
} else {
adc0Reading = readAdc(26, 1);
adc0Reading = abs(adc0Reading);
hueShift0 = map(adc0Reading, 0, 5000, -90, 0);
@ -344,6 +355,8 @@ int waveGen(void)
lightUpNet(4, -1, 1, brightness0, hueShift0);
showLEDsCore2 = 1;
firstCrossFreq0 = 1;
}
}
else
{
@ -422,7 +435,7 @@ int waveGen(void)
}
else
{
int c = Serial.read();
c = Serial.read();
switch (c)
{
case '+':
@ -617,16 +630,31 @@ int waveGen(void)
if (t < halvePeriod[activeDac])
{
if (activeDac == 0 && dacOn[activeDac] == 1)
{
setDac0_5VinputCode(amplitude[activeDac]);
lightUpNet(4, -1, 1, DEFAULTSPECIALNETBRIGHTNESS, 12);
showLEDsCore2 = 1;
}
else if (activeDac == 1 && dacOn[activeDac] == 1)
{
setDac1_8VinputCode(amplitude[activeDac]);
showLEDsCore2 = 1;
}
}
else
{
if (activeDac == 0 && dacOn[activeDac] == 1)
{
setDac0_5VinputCode(0);
lightUpNet(4, -1, 1, 2, 12);
}
else if (activeDac == 1 && dacOn[activeDac] == 1)
{
setDac1_8VinputCode(offset[activeDac]);
}
}
break;
case 'w':

View File

@ -50,15 +50,21 @@ void setup()
#endif
initADC();
delay (1);
initDAC();
delay (1);
initINA219();
delay (1);
Serial.begin(115200);
delay (4);
#ifdef FSSTUFF
LittleFS.begin();
#endif
setDac0_5Vvoltage(0.0);
setDac1_8Vvoltage(1.9);
clearAllNTCC();
delay (4);
}
void setup1()
@ -68,6 +74,7 @@ void setup1()
initCH446Q();
#endif
//delay (4);
initLEDs();
@ -368,9 +375,9 @@ void loop1() // core 2 handles the LEDs and the CH446Q8
if (sendAllPathsCore2 == 1)
{
delayMicroseconds(9200);
delayMicroseconds(12200);
sendAllPaths();
delayMicroseconds(2200);
delayMicroseconds(4200);
showNets();
delayMicroseconds(9200);
sendAllPathsCore2 = 0;
@ -395,4 +402,6 @@ void loop1() // core 2 handles the LEDs and the CH446Q8
}
}
}