//## begin module%1.4%.codegen_version preserve=yes
//   Read the documentation to learn more about C++ code generator
//   versioning.
//## end module%1.4%.codegen_version

//## begin module%3D86D33A00C8.cm preserve=no
//	  %X% %Q% %Z% %W%
//## end module%3D86D33A00C8.cm

//## begin module%3D86D33A00C8.cp preserve=no
//## end module%3D86D33A00C8.cp

//## Module: UI%3D86D33A00C8; Pseudo Package body
//## Source file: C:\Program Files\Rational\Rose\C++\source\UI.cpp

//## begin module%3D86D33A00C8.additionalIncludes preserve=no
//## end module%3D86D33A00C8.additionalIncludes

//## begin module%3D86D33A00C8.includes preserve=yes
//## end module%3D86D33A00C8.includes

// UI
#include "UI.h"
//## begin module%3D86D33A00C8.additionalDeclarations preserve=yes
//## end module%3D86D33A00C8.additionalDeclarations


// Class UI

//## begin UI::READY%3D9AB2D2003C.attr preserve=no  private: static int {UC} 0
const int UI::READY = 0;
//## end UI::READY%3D9AB2D2003C.attr

//## begin UI::RUNNING%3D9AB2F201A4.attr preserve=no  private: static int {UC} 1
const int UI::RUNNING = 1;
//## end UI::RUNNING%3D9AB2F201A4.attr

UI::UI (char* name, int stackSize, int priority, int id)
  //## begin UI::UI%3D9EBE030096.hasinit preserve=no
      : state(-1)
  //## end UI::UI%3D9EBE030096.hasinit
  //## begin UI::UI%3D9EBE030096.initialization preserve=yes
  ,Thread(name,stackSize,priority,id)
  //## end UI::UI%3D9EBE030096.initialization
{
  //## begin UI::UI%3D9EBE030096.body preserve=yes
  //## end UI::UI%3D9EBE030096.body
}

void UI::initialize(void)
{
  mes[OSMachineID()] = this;
  starter.initialize();
}

//UI does not need destructor, kill() is done in destructor of Thread


// Additional Declarations
  //## begin UI%3D86D33A00C8.declarations preserve=yes
void UI::run(void)
{
  //lcd.clear (crashes) and keyboard.getKey (halts the program or the console) do not work in EyeSim
  //lcd.putString("Press any key..\n");
  //keyboard.getKey();
  //lcd.clear();

  //             0123456789012345
  lcd.putString(" Collaborative \n");
  lcd.putString("Cube Clustering\n");
  lcd.putString("               \n");
  lcd.putString("   Jia L. Du   \n");
  lcd.putString("Prof. T. Braunl\n");
  lcd.putString("               \n");
  lcd.putString("      UWA      ");

  lcd.setMenu("Go", " ", " ", "End");
  state = READY;
  OSWait(100); // Wait for 1 s, added by TB
  while(1)
  {
    int key = keyboard.KEY_1; // Start with 'Go" right away, added by TB
    if (key == keyboard.KEY_1) //'Go' pressed
    {
      if (state == READY)
      {
        starter.startClustering();
        lcd.setMenu(" ", " ", " ", "End");
        state = RUNNING;
      }
    }
    else if (key == keyboard.KEY_4) //'End' pressed
    {
      if (state == RUNNING)
      {
        starter.stopClustering();
      }
      lcd.setMenu(" ", " ", " ", " ");
      state = -1;
      suspend(); //suspends thread. As all other threads are suspended as well the control is returned to main
    }

    reschedule(); //nothing to do, so let other threads work
  }
}

  bool UI::spawn ()
  {
    threadControlBlock = OSSpawn(name, staticRun, stackSize, priority, OSMachineID()*10+id);
    if (threadControlBlock)
      return true;
    else
      return false;
  }

  void UI::staticRun ()
  {
    mes[OSMachineID()]->run();
  }

  UI* UI::mes[NUMBER_OF_ROBOTS];
  //## end UI%3D86D33A00C8.declarations

//## begin module%3D86D33A00C8.epilog preserve=yes
//## end module%3D86D33A00C8.epilog

