void Detach(int a, int B) { int i, j, b, tempa, tempB; tempa = a; tempB = B; for (i = 0, b = B;i <= maxlength - tempa;i++, a++, B *= 2, b = B) { for (j = (int)pow(2, i);j >= 1;j--, b--) { pos[1][i][j] = pos[0][a][b]; pos[0][a][b] = 0; } } if (tempB % 2 == 1) { if (pos[0][tempa][tempB + 1] == 1) { SideSwitch(tempa, tempB); pos[0][tempa][tempB + 1] = -2; } else { pos[0][tempa][tempB] = -1; pos[0][tempa][tempB + 1] = -1; } } else pos[0][tempa][tempB] = -1; }
int main(int argc, char *argv[]){ #ifndef CONSOLE_TEST if(SetupGPIO() != TOYHACK_SUCCEEDED){ std::cerr << "Could not initialize libminityra." << std::endl; return TOYHACK_ERROR; } #endif TConsole console(cmd_descriptions); std::cout << "Minityra management console" << std::endl; std::cout << "Copyright (C) 2016 Yasumasa Suenaga" << std::endl; std::cout << std::endl; while(true){ const char *cmd = console.GetCommand("minityra> "); if(strcmp(cmd, "help") == 0){ console.PrintHelp(); } else if(strcmp(cmd, "list") == 0){ print_judenchi_list(); } else if(strcmp(cmd, "judenchi") == 0){ int id = -1; /* Read Judenchi ID */ try{ id = console.GetNextArgAsInt(); if(!ID_ISIN(id)){ throw -1; } } catch(...){ std::cerr << "Invalid Judenchi ID." << std::endl; continue; } print_judenchi("Judenchi", id); #ifndef CONSOLE_TEST if(SetJudenchi(id) != TOYHACK_SUCCEEDED){ std::cerr << "Cannot set Judenchi." << std::endl; } #endif } else if(strcmp(cmd, "gabu") == 0){ #ifndef CONSOLE_TEST if(Gabu() != TOYHACK_SUCCEEDED){ std::cerr << "Cannot send gabu command." << std::endl; } #endif } else if(strcmp(cmd, "mode") == 0){ int mode = -1; try{ const char *mode_str = console.GetNextArgAsString(); if(strcmp(mode_str, "overcharge") == 0){ mode = MODE_OVERCHARGE; } else if(strcmp(mode_str, "carnival") == 0){ mode = MODE_CARNIVAL; } else{ throw -1; } } catch(...){ std::cerr << "Invalid mode." << std::endl; } #ifndef CONSOLE_TEST if(Kururincho(mode) != TOYHACK_SUCCEEDED){ std::cerr << "Cannot send kururincho command." << std::endl; } #endif } else if(strcmp(cmd, "gaburevolver") == 0){ bool isOn; try{ isOn = console.GetNextArgAsOnOff(); } catch(...){ std::cerr << "Invalid argument(s)." << std::endl; continue; } #ifdef CONSOLE_TEST std::cout << isOn << std::endl; #else if(isOn && (DockGaburevolver() != TOYHACK_SUCCEEDED)){ std::cerr << "Cannot dock to gaburevolver." << std::endl; } else if(!isOn && (UndockGaburevolver() != TOYHACK_SUCCEEDED)){ std::cerr << "Cannot undock from gaburevolver." << std::endl; } #endif } else if(strcmp(cmd, "trigger") == 0){ #ifndef CONSOLE_TEST if(Trigger() != TOYHACK_SUCCEEDED){ std::cerr << "Cannot send trigger command." << std::endl; } #endif } else if(strcmp(cmd, "side") == 0){ #ifndef CONSOLE_TEST if(SideSwitch() != TOYHACK_SUCCEEDED){ std::cerr << "Cannot send side switch command." << std::endl; } #endif } else if(strcmp(cmd, "henshin") == 0){ SetJudenchi(-1); Kururincho(MODE_CARNIVAL); sleep(1); SetJudenchi(55); // Carnival Judenchi Gabu(); sleep(10); Trigger(); } else if(strcmp(cmd, "kamichange") == 0){ SideSwitch(); sleep(3); SetJudenchi(-1); sleep(1); for(int Cnt = 0; Cnt < 3; Cnt++){ int id = -1; /* Read Judenchi ID */ try{ id = console.GetNextArgAsInt(); if(!ID_ISIN(id)){ throw -1; } } catch(...){ std::cerr << "Invalid Judenchi ID." << std::endl; break; } SetJudenchi(id); sleep(1); Gabu(); sleep(2); } Trigger(); } else if(strcmp(cmd, "exit") == 0){ break; } else{ std::cerr << "Error: Unknown command." << std::endl; } } return 0; }
void SeekPath(int stepleft) { DuplicatePos(stepleft, 'b'); int i = 0, j = 0, k = 0, l = 0, x = 0, y = 0, activeCount = 0; //int o, p;//more spaces involved for (x = 0;x <= y;x++) { DuplicatePos(stepleft + maxstep, 'b'); Compare(x, 0, stepleft, 1); if (stepleft > 0) { DuplicatePos((stepleft + maxstep + maxstep), 'b'); for (i = 1;i <= maxlength;i++) { for (j = 1;j <= (int)pow(2, i);j++) { if (pos[0][i][j] == 0) continue; else { Detach(i, j); DuplicatePos(stepleft + maxstep + maxstep + maxstep, 'b'); for (k = 1;k <= maxlength;k++)//k = 0 need to examine { for (l = 1;l <= (int)pow(2, k);l++) { if (pos[0][k][l] < 1 && pos[0][k - 1][(l + 1) / 2] >= 1) { if (l % 2 == 1 && pos[0][k][l] == 0) { Attach(k, l); //printf("\n1step%d %d,%d ---> %d,%d:\n", maxstep + 1 - stepleft, i, j, k, l); //Display(); if (stepleft > 1) { SaveStep(i, j, k, l, x, stepleft); Compare(x, 0, stepleft, 0); //printf("1"); SeekPath(stepleft - 1); } else { activeCount = Active(1); SaveStep(i, j, k, l, x, stepleft); Compare(x, activeCount, stepleft, 0); //printf("1"); } } else if (l % 2 == 0 && pos[0][k][l - 1] >= 1 && pos[0][k][l - 1] != 2 && pos[1][0][1] != 2) { if (pos[0][k][l] == -1)//case 1 -1 ---> 1 1 { SideSwitch(k, l - 1); Attach(k, l - 1); //printf("\n2step%d %d,%d ---> %d,%d:\n", maxstep + 1 - stepleft, i, j, k, l - 1); //Display(); if (stepleft > 1) { SaveStep(i, j, k, l - 1, x, stepleft); Compare(x, 0, stepleft, 0); //printf("2"); SeekPath(stepleft - 1); } else { activeCount = Active(1); SaveStep(i, j, k, l - 1, x, stepleft); Compare(x, activeCount, stepleft, 0); //printf("2"); } } else if (pos[0][k][l] == -2)//case 1 -2 ---> 1 1 { Attach(k, l); //printf("\n3step%d %d,%d ---> %d,%d:\n", maxstep + 1 - stepleft, i, j, k, l); //Display(); if (stepleft > 1) { SaveStep(i, j, k, l, x, stepleft); Compare(x, 0, stepleft, 0); //printf("3"); SeekPath(stepleft - 1); } else { activeCount = Active(1); SaveStep(i, j, k, l, x, stepleft); Compare(x, activeCount, stepleft, 0); //printf("3"); } } else if (pos[0][k][l] == 0)//case 1 0 ---> 1 1 ,two ways to attach, left and right { //attach left SideSwitch(k, l - 1); Attach(k, l - 1); //printf("\n4step%d %d,%d ---> %d,%d:\n", maxstep + 1 - stepleft, i, j, k, l - 1); //Display(); if (stepleft > 1) { SaveStep(i, j, k, l - 1, x, stepleft); Compare(x, 0, stepleft, 0); //printf("4"); SeekPath(stepleft - 1); } else { activeCount = Active(1); SaveStep(i, j, k, l - 1, x, stepleft); Compare(x, activeCount, stepleft, 0); //printf("4"); } DuplicatePos(stepleft + maxstep + maxstep + maxstep, 'r'); //attach right Attach(k, l); //printf("\n5step%d %d,%d ---> %d,%d:\n", maxstep + 1 - stepleft, i, j, k, l); //Display(); if (stepleft > 1) { SaveStep(i, j, k, l, x, stepleft); Compare(x, 0, stepleft, 0); //printf("5"); SeekPath(stepleft - 1); } else { activeCount = Active(1); SaveStep(i, j, k, l, x, stepleft); Compare(x, activeCount, stepleft, 0); //printf("5"); } } } DuplicatePos(stepleft + maxstep + maxstep + maxstep, 'r'); } } } DuplicatePos(stepleft + maxstep + maxstep, 'r'); } } } } DuplicatePos(stepleft + maxstep, 'r'); y += Active(0); } }