#include <buffer.h> #include <bwio.h> #include <nameserver.h> #include <rps.h> #include <syscall.h> #include <td.h> #include <types.h> extern Buffer*** TotalSendQ; void GamePlay(RPSChoice Client1Move, RPSChoice Client2Move,RPSMsg* reply, int Client1, int Client2){ if (Client1Move != None && Client2Move != None) { int Diff = (int) Client1Move - (int)Client2Move; if (Diff == 0) { reply->Msg = Draw; bwprintf(COM2, "We have a Draw."); Reply(Client1, (void *)reply, sizeof(RPSMsg)); Reply(Client2, (void *)reply, sizeof(RPSMsg)); } else if (Diff == 1 || Diff == -2) { bwprintf(COM2, "Client1 Wins."); reply->Msg = Win; Reply(Client1, (void *)reply, sizeof(RPSMsg)); reply->Msg = Lose; Reply(Client2, (void *)reply, sizeof(RPSMsg)); } else { bwprintf(COM2, "Client2 Wins."); reply->Msg = Lose; Reply(Client1, (void *)reply, sizeof(RPSMsg)); reply->Msg = Win; Reply(Client2, (void *)reply, sizeof(RPSMsg)); } } } int RPSServer(){ char Name[] = "RPSServer"; bwprintf(COM2,"%s: Before Register\n\r",Name); int Result = RegisterAs(Name); if(Result == FAILURE) { bwprintf(COM2, "%s: Cannot register %s????\n\r",Name,Name); return FAILURE; } bwprintf(COM2,"%s: Registered Successfully!!!\n\r",Name); int MyID = MyTid(); int MyIndex = GetMemoryIndexINT(MyID); Buffer** AllSendQ = *TotalSendQ; //Pass(); Buffer SendQ; int QStorage[MAX_NUM_TD]; SendQ.Storage = (void *)QStorage; SendQ.Size = MAX_NUM_TD; //Pass() SendQ.Length = 0; SendQ.Head = 0; SendQ.Tail = 0; bwprintf(COM2,"%s: MyIndex %d\n\r",Name,MyIndex); //Pass(); bwprintf(COM2,"%s: SendQ Addr %d\n\r",Name,&SendQ); AllSendQ[MyIndex] = &SendQ;// problem bwprintf(COM2,"%s: SendQ setup\n\r",Name); int TaskID, Client1, Client2; RPSMsg ReceiveMsg, ReplyMsg; RPSChoice Client1Move = None, Client2Move = None; int bOtherQuit = 0; TaskID = 0; bwprintf(COM2,"%s: Before Loop\n\r",Name); FOREVER { Result = BufferFIFO(&SendQ,(void *)&TaskID); bwprintf(COM2,"%s: Got Task %d from SendQ\n\r",Name,TaskID); if(TaskID != NULL){ bwprintf(COM2,"%s: Got into If\n\r",Name); Result = Receive(TaskID, &ReceiveMsg, sizeof(ReceiveMsg)); if(bOtherQuit != 0){ ReplyMsg.Msg = OtherQuit; Reply(TaskID, &ReplyMsg, sizeof(ReplyMsg)); }else{ switch (ReceiveMsg.Msg) { case Quit: ReplyMsg.Msg = Bye; Reply(TaskID,&ReplyMsg,sizeof(ReplyMsg)); // xor Client1 with TaskID, if same, result 0, then set to 0 Client1 = (Client1 ^ TaskID)? Client1: 0; Client2 = (Client2 ^ TaskID)? Client2: 0; bOtherQuit = ((Client2 == Client1) &&(Client1 == 0))? 0:1; break; case SignUp: if (Client1 == 0 && Client2 != Client1) Client1 = TaskID; else Client2 = TaskID; ReplyMsg.Msg = LetsPlay; Reply(TaskID, &ReplyMsg, sizeof(ReplyMsg)); break; case Play: // only one player if (Client1 == 0 || Client2 == 0) { ReplyMsg.Msg = OnePlayer; Reply(TaskID, &ReplyMsg, sizeof(ReplyMsg)); break; } if (Client1 == TaskID) Client1Move = ReceiveMsg.Choice; else Client2Move = ReceiveMsg.Choice; GamePlay(Client1Move, Client2Move, &ReplyMsg, Client1, Client2); Client1Move = Client2Move = None; break; default: break; } } }else{ //bwprintf(COM2,"%s: Before Pass\n\r",Name); Pass(); } } return SUCCESS; } int Player(int ID){ char Name[] = "RPSClient0"; Name[9] = ID; int Result = RegisterAs(Name); if(Result == FAILURE) { bwprintf(COM2, "%s: Cannot register %s\n\r",Name); return FAILURE; } char Input = 'U'; // for Undefined int MyTID, ServerTID; RPSMsg SendMsg, ReplyMsg; MyTID = MyTid(); bwprintf(COM2, "%s with TaskID(%d) is about to Play\n\r", Name, MyTID); ServerTID = WhoIs("RPSServer"); bwprintf(COM2, "%s: Got server tid, %d\n\r",Name,ServerTID); if (ServerTID < 0) return FAILURE; bwprintf(COM2,"%s:Ready To Signup\n\r",Name); SendMsg.Msg = SignUp; Result = Send(ServerTID, &SendMsg, sizeof(RPSMsg), &ReplyMsg, sizeof(RPSMsg)); if (Result != sizeof(ReplyMsg)) { bwprintf(COM2, "Sign Up Request to Server did not go through."); return Result; } //if (ReplyMsg.MsgType == ServerFull) //TODOTODOTODOTODO FOREVER { bwprintf(COM2, "Please enter r/R for Rock, p/P for Paper, s/S for Scissors.\n\r"); while (bwgetc(Input)) { Input = bwgetc(COM2); if (Input == 'r' || Input == 'R') { SendMsg.Choice = Rock; break; } else if (Input == 'p' || Input == 'P') { SendMsg.Choice = Paper; break; } else if (Input == 's' || Input == 'S') { SendMsg.Choice = Scissors; break; }else if(Input == 'q' || Input == 'Q'){ SendMsg.Msg = Quit; } else { Input = 'U'; bwprintf(COM2, "Please enter r/R for Rock, p/P for Paper, s/S for Scissors.\n\r"); } } SendMsg.Msg = Play; Result = Send(ServerTID, &SendMsg, sizeof(SendMsg), &ReplyMsg, sizeof(ReplyMsg)); if (Result != sizeof(ReplyMsg)) { if(SendMsg.Msg == Quit){ bwprintf(COM2, "Request for QUIT from %s did not go through gracefully.", Name); }else{ bwprintf(COM2, "%s: Game obstructed!",Name); } return FAILURE; }else{ if(SendMsg.Msg == Quit){ bwprintf(COM2, "%s exitting...",Name); Result = ReplyMsg.Msg; } } } return SUCCESS; } int RPSClient1(){ Player(1); Exit(); } int RPSClient2(){ Player(2); Exit(); }