/*@!Encoding:1252*/
includes
{
  
}

variables
{
  msTimer startTimer;
  int vtReady;
  int sprayerIsOn, taskIsRunning;
}

/**
*/
on pg PD_TC
{
  if(this.Command == VtSig_Command::TaskControllerStatus)
  {
    if(this.StatusTotalsActive == 1)
    {
      if(taskIsRunning == 0 && sprayerIsOn == 1)
      {
        //Init logging (twice per second)
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 3, 500 ); 
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 4, 500 ); 
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 5, 500 ); 
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 6, 500 ); 
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 7, 500 ); 
      }
      taskIsRunning = 1;
    }
    else
    {
      if(taskIsRunning == 1 && sprayerIsOn == 1)
      {
        //Stop logging
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 3, 0 ); 
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 4, 0 ); 
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 5, 0 ); 
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 6, 0 ); 
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 7, 0 ); 
      }
      taskIsRunning = 0;
    }
  }
//  if(this.Command == 0x3 && this.DDI == 0x6 && this.ElementNumber == 2)
//  {
//    //ReportSetpointApplicationRateToVT(this.AppRateMassPerArea_Set);
//  }
}

/**
*/
ReportSetpointApplicationRateToVT(int setpointAppRate)
{
  pg VT21_Sprayer sprayerToVt = {SA = 0x80, DA = 0x26, DLC = 8};
  sprayerToVt.VTFunctionECUtoVT = 0xA8;
  sprayerToVt.ObjectToChangeNumValueID = 12;
  sprayerToVt.NewValue = setpointAppRate;
  
  output(sprayerToVt);
}

/**
*/
on pg GBSD_TECU
{
  if(vtReady == 0)
    return;
  
  RecalculateAndUpdateFlowRate(this.GroundBasedMachineSpeed.phys);
}

/**
*/
RecalculateAndUpdateFlowRate(double speedOnBus)
{
  double setpointApplicationRate;
  int lineThickness;
  char text[200];
  int sprayerWidth;
  
  sprayerWidth = @sysvar::ISO11783::Sprayer::OP::OBJ00013_numberVariable::value;

  if(sprayerIsOn == 1)
    setpointApplicationRate = Iso11783IL_PDDGetValue(6, 2);
  else
    setpointApplicationRate = 0;
  
  if(speedOnBus > 1 && speedOnBus < 14)
  {
    //proper functionality
    @sysvar::ISO11783::svComputedFlowRate = (setpointApplicationRate * speedOnBus * 60 * 3 ) / 1000000;
  }
  else
  {
    //Safety area
    @sysvar::ISO11783::svComputedFlowRate = 0;
  }

  if(@sysvar::ISO11783::svInjectError == 1)
  {
    //fault injection
    @sysvar::ISO11783::svReportedFlowRate = 0;
  }
  else
  {
    @sysvar::ISO11783::svReportedFlowRate = @sysvar::ISO11783::svComputedFlowRate;
  }
  
  //report computed application value to TC
  @sysvar::ISO11783::Sprayer::PDD::SprayerDevice::Sprayer::Section3::ActualApplicationRate = @sysvar::ISO11783::svComputedFlowRate;
  if(sprayerWidth > 0)
  {
    @sysvar::ISO11783::Sprayer::PDD::SprayerDevice::Sprayer::Section2::ActualApplicationRate = @sysvar::ISO11783::svReportedFlowRate; //Error Injectipon
    @sysvar::ISO11783::Sprayer::PDD::SprayerDevice::Sprayer::Section4::ActualApplicationRate = @sysvar::ISO11783::svComputedFlowRate;
  }
  if(sprayerWidth > 1)
  {
    @sysvar::ISO11783::Sprayer::PDD::SprayerDevice::Sprayer::Section1::ActualApplicationRate = @sysvar::ISO11783::svComputedFlowRate; 
    @sysvar::ISO11783::Sprayer::PDD::SprayerDevice::Sprayer::Section5::ActualApplicationRate = @sysvar::ISO11783::svComputedFlowRate;
  }
  //report computed application value to VT
  @sysvar::ISO11783::Sprayer::OP::OBJ21002_numberVariable::value = @sysvar::ISO11783::svComputedFlowRate;
  if(sprayerWidth > 0)
  {
    @sysvar::ISO11783::Sprayer::OP::OBJ21001_numberVariable::value = @sysvar::ISO11783::svReportedFlowRate;//Error Injectipon
    @sysvar::ISO11783::Sprayer::OP::OBJ21003_numberVariable::value = @sysvar::ISO11783::svComputedFlowRate;
  }
  if(sprayerWidth > 1)
  {
    @sysvar::ISO11783::Sprayer::OP::OBJ21000_numberVariable::value = @sysvar::ISO11783::svComputedFlowRate;
    @sysvar::ISO11783::Sprayer::OP::OBJ21004_numberVariable::value = @sysvar::ISO11783::svComputedFlowRate;
  }
  
  if(@sysvar::ISO11783::svComputedFlowRate > 0)
  {
    if(@sysvar::ISO11783::svReportedFlowRate > 0)
      @sysvar::SpayerBitmap = 1;
    else
      @sysvar::SpayerBitmap = 2;
  }
  else
  {
    @sysvar::SpayerBitmap = 0;
  }
  lineThickness = @sysvar::ISO11783::svComputedFlowRate / 15;
  //Adjust the line thickness in VT
  
  if(@sysvar::ISO11783::svComputedFlowRate > 0)
  {
    @sysvar::ISO11783::Sprayer::OP::OBJ00070_lineAttribute::width = lineThickness + 1;
    @sysvar::ISO11783::Sprayer::OP::OBJ00070_lineAttribute::color = 13;
  }
  else
  {
    @sysvar::ISO11783::Sprayer::OP::OBJ00070_lineAttribute::width = 1;
    @sysvar::ISO11783::Sprayer::OP::OBJ00070_lineAttribute::color = 8;
  }
  @sysvar::ISO11783::Sprayer::OP::OBJ00070_lineAttribute::art = 65535;
}

/**
*/
void Iso11783IL_OPOnKeyActivation( dword objectID, dword parentID, dword keyCode, dword activation )
{
  if (activation == 0) //released
  {
    if(objectID == 151)
    {
      if(taskIsRunning == 1 && sprayerIsOn == 0)
      {
        //Init logging (twice per second)
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 3, 500 ); 
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 4, 500 ); 
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 5, 500 ); 
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 6, 500 ); 
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 7, 500 ); 
      }
      Iso11783IL_OPShowObject(160, 0); 
      Iso11783IL_OPShowObject(162, 1); 
      
      sprayerIsOn = 1;
    }
    else if(objectID == 152)
    {
      if(taskIsRunning == 1 && sprayerIsOn == 1)
      {
        //Stop logging 
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 3, 0 ); 
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 4, 0 ); 
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 5, 0 ); 
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 6, 0 ); 
        Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 7, 0 ); 
      }
      Iso11783IL_OPShowObject(160, 1); 
      Iso11783IL_OPShowObject(162, 0); 

      sprayerIsOn = 0;
    }
    else if (objectID == 153) //increase the width of the sprayer
    {
      if(@sysvar::ISO11783::Sprayer::OP::OBJ00013_numberVariable::value == 0)
        @sysvar::ISO11783::Sprayer::OP::OBJ00013_numberVariable::value = 1;
      else if(@sysvar::ISO11783::Sprayer::OP::OBJ00013_numberVariable::value == 1)
        @sysvar::ISO11783::Sprayer::OP::OBJ00013_numberVariable::value = 2;
      
      updateSprayerBarAndBitmap();
    }
    else if (objectID == 154) //decrease the width of the sprayer
    {
      if(@sysvar::ISO11783::Sprayer::OP::OBJ00013_numberVariable::value == 2)
        @sysvar::ISO11783::Sprayer::OP::OBJ00013_numberVariable::value = 1;
      else if(@sysvar::ISO11783::Sprayer::OP::OBJ00013_numberVariable::value == 1)
        @sysvar::ISO11783::Sprayer::OP::OBJ00013_numberVariable::value = 0;
      
      updateSprayerBarAndBitmap();
    }
  }
}

//
// Update sprayer bar and bitmap
//
void updateSprayerBarAndBitmap()
{
  int sprayerWidth;
  sprayerWidth = @sysvar::ISO11783::Sprayer::OP::OBJ00013_numberVariable::value;

  //Sprayer bitmap  
  // 1. Section 2 (in the midle of the Sprayer) is always ON
  // 2. Section 1 and 3 are ON if the sprayerWidth > 0 (=1 or =2)
  if (sprayerWidth > 0) 
  {
      @sysvar::ISO11783::Sprayer::OP::OBJ03001_container::hidden = 0;
      @sysvar::ISO11783::Sprayer::OP::OBJ03003_container::hidden = 0;
  }
  else 
  {
      @sysvar::ISO11783::Sprayer::OP::OBJ03001_container::hidden = 1;
      @sysvar::ISO11783::Sprayer::OP::OBJ03003_container::hidden = 1;
  }
  // 3. Section 0 and 4 are ON if the sprayerWidth > 1 (=2)
  if (sprayerWidth > 1) 
  {
      @sysvar::ISO11783::Sprayer::OP::OBJ03000_container::hidden = 0;
      @sysvar::ISO11783::Sprayer::OP::OBJ03004_container::hidden = 0;
  }
  else 
  {
      @sysvar::ISO11783::Sprayer::OP::OBJ03000_container::hidden = 1;
      @sysvar::ISO11783::Sprayer::OP::OBJ03004_container::hidden = 1;
  }
}



/**
*/
on start
{
  @sysvar::ISO11783::svSetpointApplicationRate = 0;
  @sysvar::ISO11783::svComputedFlowRate = 0;
  @sysvar::ISO11783::svReportedFlowRate = 0;
  vtReady = 0;
  sprayerIsOn = 0;
  taskIsRunning = 0;
  setTimer(startTimer, 2000);

//  //Init automatic sending to TC by any change
////  Iso11783IL_PDDSetLogTrigger( 8, 0x0025, 1, 0x1 ); 
//  Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 3, 250 ); 
//
////  Iso11783IL_PDDSetLogTrigger( 8, 0x0025, 2, 0x1 ); 
//  Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 4, 250 ); 
//  
////  Iso11783IL_PDDSetLogTrigger( 8, 0x0025, 3, 0x1 ); 
//  Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 5, 250 ); 
//  
////  Iso11783IL_PDDSetLogTrigger( 8, 0x0025, 4, 0x1 ); 
//  Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 6, 250 ); 
//
////  Iso11783IL_PDDSetLogTrigger( 8, 0x0025, 5, 0x1 ); 
//  Iso11783IL_PDDSetLogTrigger( 4, 0x0025, 7, 250 ); 
}

on timer startTimer
{
  vtReady = 1;
  @sysvar::ISO11783::Sprayer::OP::OBJ00013_numberVariable::value = 0;
  updateSprayerBarAndBitmap();
}
