Skip to content
Snippets Groups Projects
rps.c 5.46 KiB
Newer Older
Tom Feng's avatar
Tom Feng committed
#include <buffer.h>
antnh6@gmail.com's avatar
antnh6@gmail.com committed
#include <bwio.h>
Tom Feng's avatar
Tom Feng committed
#include <nameserver.h>
#include <rps.h>
#include <syscall.h>
#include <td.h>
antnh6@gmail.com's avatar
antnh6@gmail.com committed
#include <types.h>
antnh6@gmail.com's avatar
antnh6@gmail.com committed

Tom Feng's avatar
Tom Feng committed
extern Buffer*** TotalSendQ;

void GamePlay(RPSChoice Client1Move, RPSChoice Client2Move,RPSMsg* reply, int Client1, int Client2){
Tom Feng's avatar
Tom Feng committed
  if (Client1Move != None && Client2Move != None) {
Tom Feng's avatar
Tom Feng committed
    int Diff = (int) Client1Move - (int)Client2Move;
Tom Feng's avatar
Tom Feng committed
    if (Diff == 0) {
      reply->Msg = Draw;
      bwprintf(COM2, "We have a Draw.");
Tom Feng's avatar
Tom Feng committed
      Reply(Client1, (void *)reply, sizeof(RPSMsg));
      Reply(Client2, (void *)reply, sizeof(RPSMsg));
Tom Feng's avatar
Tom Feng committed
    } 
    else if (Diff == 1 || Diff == -2) {
      bwprintf(COM2, "Client1 Wins.");
      reply->Msg = Win;
Tom Feng's avatar
Tom Feng committed
      Reply(Client1, (void *)reply, sizeof(RPSMsg));
Tom Feng's avatar
Tom Feng committed
      reply->Msg = Lose;
Tom Feng's avatar
Tom Feng committed
      Reply(Client2, (void *)reply, sizeof(RPSMsg));
Tom Feng's avatar
Tom Feng committed
    }
    else {
      bwprintf(COM2, "Client2 Wins.");
      reply->Msg = Lose;
Tom Feng's avatar
Tom Feng committed
      Reply(Client1, (void *)reply, sizeof(RPSMsg));
Tom Feng's avatar
Tom Feng committed
      reply->Msg = Win;
Tom Feng's avatar
Tom Feng committed
      Reply(Client2, (void *)reply, sizeof(RPSMsg));
antnh6@gmail.com's avatar
antnh6@gmail.com committed

Tom Feng's avatar
Tom Feng committed
int RPSServer(){
Tom Feng's avatar
Tom Feng committed
  char Name[] = "RPSServer";
  // register to name server
Tom Feng's avatar
Tom Feng committed
  bwprintf(COM2,"%s: Before Register\n\r",Name);
  int  Result = RegisterAs(Name);
Tom Feng's avatar
Tom Feng committed
  if(Result == FAILURE) {
Tom Feng's avatar
Tom Feng committed
    bwprintf(COM2, "%s: Cannot register %s????\n\r",Name,Name);
Tom Feng's avatar
Tom Feng committed
    return FAILURE;
  }
Tom Feng's avatar
Tom Feng committed
  bwprintf(COM2,"%s: Registered Successfully!!!\n\r",Name);

  // setup send q
Tom Feng's avatar
Tom Feng committed
  
  // setup send q
Tom Feng's avatar
Tom Feng committed
  int MyID = MyTid();
Tom Feng's avatar
Tom Feng committed
  int MyIndex = GetMemoryIndexINT(MyID);
  Buffer** AllSendQ = GetAllSendQ();
Tom Feng's avatar
Tom Feng committed

  //Pass();
Tom Feng's avatar
Tom Feng committed
  Buffer SendQ;
  int QStorage[MAX_NUM_TD];
  SendQ.Storage = (void *)QStorage;
Tom Feng's avatar
Tom Feng committed
  SendQ.Size = MAX_NUM_TD;
  SendQ.Length = 0;
Tom Feng's avatar
Tom Feng committed
  SendQ.Head = 0;
  SendQ.Tail = 0;
  //bwprintf(COM2,"%s: MyIndex %d\n\r",Name,MyIndex);
Tom Feng's avatar
Tom Feng committed
  //Pass();
  //bwprintf(COM2,"%s: SendQ Addr %d\n\r",Name,&SendQ);
Tom Feng's avatar
Tom Feng committed
  AllSendQ[MyIndex] = &SendQ;// problem
  //bwprintf(COM2,"%s: SendQ setup\n\r",Name);
Tom Feng's avatar
Tom Feng committed
  int TaskID, Client1, Client2;
  RPSMsg ReceiveMsg, ReplyMsg;
Tom Feng's avatar
Tom Feng committed
  RPSChoice Client1Move = None, Client2Move = None;
  Pass();
  
Tom Feng's avatar
Tom Feng committed
  
  int bOtherQuit = 0;
Tom Feng's avatar
Tom Feng committed
  TaskID = 0;
  //bwprintf(COM2,"%s: Before Loop\n\r",Name);
Tom Feng's avatar
Tom Feng committed
  FOREVER {
    Result = BufferFIFO(&SendQ,(void *)&TaskID);
Tom Feng's avatar
Tom Feng committed
    bwprintf(COM2,"%s: Got Task %d from SendQ\n\r",Name,TaskID);
    if(TaskID != NULL){
      bwprintf(COM2,"%s: Got into If\n\r",Name);
Tom Feng's avatar
Tom Feng committed
      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;
Tom Feng's avatar
Tom Feng committed
	  bOtherQuit = ((Client2 == Client1) &&(Client1 == 0))? 0:1;
Tom Feng's avatar
Tom Feng committed
	  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;
Tom Feng's avatar
Tom Feng committed
	  GamePlay(Client1Move, Client2Move, &ReplyMsg, Client1, Client2);
Tom Feng's avatar
Tom Feng committed
	  Client1Move = Client2Move = None;
	  break;
	  
	default:
	  break;
antnh6@gmail.com's avatar
antnh6@gmail.com committed
	}
Tom Feng's avatar
Tom Feng committed
      }
Tom Feng's avatar
Tom Feng committed
    }else{
      bwprintf(COM2,"%s: Before Pass\n\r",Name);
Tom Feng's avatar
Tom Feng committed
      Pass();
    }
Tom Feng's avatar
Tom Feng committed
  }
  return SUCCESS;
Tom Feng's avatar
Tom Feng committed
int Player(int ID){
  char Name[] = "RPSClient0";
  Name[9] = ID;
Tom Feng's avatar
Tom Feng committed
  int Result = RegisterAs(Name);
Tom Feng's avatar
Tom Feng committed
  if(Result == FAILURE) {
    //bwprintf(COM2, "%s: Cannot register %s\n\r",Name);
Tom Feng's avatar
Tom Feng committed
    return FAILURE;
  }
  
  char Input = 'U'; // for Undefined
Tom Feng's avatar
Tom Feng committed
  int MyTID, ServerTID;
  RPSMsg SendMsg, ReplyMsg;
Tom Feng's avatar
Tom Feng committed
  
  MyTID = MyTid();
  ServerTID = WhoIs("RPSServer\0");
Tom Feng's avatar
Tom Feng committed
  bwprintf(COM2, "%s: Got server tid, %d\n\r",Name,ServerTID);
Tom Feng's avatar
Tom Feng committed
  if (ServerTID < 0) return FAILURE;
Tom Feng's avatar
Tom Feng committed

  bwprintf(COM2,"%s:Ready To Signup\n\r",Name);
Tom Feng's avatar
Tom Feng committed
  SendMsg.Msg = SignUp;
Tom Feng's avatar
Tom Feng committed
  
  Result = Send(ServerTID, &SendMsg, sizeof(RPSMsg), &ReplyMsg, sizeof(RPSMsg));
Tom Feng's avatar
Tom Feng committed
  
  if (Result != sizeof(ReplyMsg)) {
    //bwprintf(COM2, "Sign Up Request to Server did not go through.");
Tom Feng's avatar
Tom Feng committed
    return Result;
  }
  
  //if (ReplyMsg.MsgType == ServerFull) //TODOTODOTODOTODO
    
  bwprintf(COM2, "%s with TaskID(%d) is about to Play\n\r", Name, MyTID);
  FOREVER {
    bwprintf(COM2, "Please enter r/R for Rock, p/P for Paper, s/S for Scissors.\n\r");
    while (Input = bwgetc(COM2)) {
      bwputc(COM2,Input);
      if (Input == 'r' || Input == 'R') {
Tom Feng's avatar
Tom Feng committed
	  SendMsg.Choice = Rock;
	  break;
antnh6@gmail.com's avatar
antnh6@gmail.com committed
	}
Tom Feng's avatar
Tom Feng committed
	else if (Input == 'p' || Input == 'P') {
	  SendMsg.Choice = Paper;
	  break;
antnh6@gmail.com's avatar
antnh6@gmail.com committed
	}
Tom Feng's avatar
Tom Feng committed
	else if (Input == 's' || Input == 'S') {
	  SendMsg.Choice = Scissors;
	  break;
	}else if(Input == 'q' || Input == 'Q'){
	  SendMsg.Msg = Quit;
antnh6@gmail.com's avatar
antnh6@gmail.com committed
	}
Tom Feng's avatar
Tom Feng committed
	else {
	  Input = 'U';
	  bwprintf(COM2, "Please enter r/R for Rock, p/P for Paper, s/S for Scissors.\n\r");
antnh6@gmail.com's avatar
antnh6@gmail.com committed
	}
Tom Feng's avatar
Tom Feng committed
      }
      
      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);
antnh6@gmail.com's avatar
antnh6@gmail.com committed
	}
Tom Feng's avatar
Tom Feng committed
	return FAILURE;
      }else{
	if(SendMsg.Msg == Quit){
	  bwprintf(COM2, "%s exitting...",Name);
Tom Feng's avatar
Tom Feng committed
	  Result = ReplyMsg.Msg;
antnh6@gmail.com's avatar
antnh6@gmail.com committed
	}
Tom Feng's avatar
Tom Feng committed
      }
    }
  return SUCCESS;
}
Tom Feng's avatar
Tom Feng committed
int RPSClient1(){
  Player(1);
  Exit();
}
Tom Feng's avatar
Tom Feng committed
int RPSClient2(){
  Player(2);
  Exit();