module Isobus_Templates {

import from IsobusMessageTypes all
import from IsobusVTMessageTypes all
import from Isobus all
import from General_Types all


template ECU2VT t_GetMemoryReqX( INT3 p_memoryRequired) := {
  getMemoryReq := {
    vtfunction                      := 194,
    reserved2                       := 'FF'O,
    memoryRequired                  := p_memoryRequired,
    reserved7                       := 'FF'O,
    reserved8                       := 'FF'O
  }
};

template AnyIsoBusPdu t_ecu2vt(template ECU2VT t_Message) := {
  ecu2vt := t_Message
};

template AnyIsoBusPdu t_vt2ecu(template VT2ECU t_Message) := {
  vt2ecu := t_Message
};

template AnyIsoBusPdu t_GetMemoryReq_pdu(INT3 p_memoryRequired) := {
  ecu2vt := {getMemoryReq := t_GetMemoryReq(p_memoryRequired)}
}


template GetMemoryReq t_GetMemoryReq(INT3 p_memoryRequired) := {
  vtfunction                    := 194,
  reserved2                     := 'FF'O,
  memoryRequired                := p_memoryRequired,
  reserved7                     := 'FF'O,
  reserved8                     := 'FF'O
}

template GetMemoryRes t_GetMemoryRes(e_GetMemoryResVersionNumber p_versionNumber, e_GetMemoryResStatus p_status) := {
  versionNumber                   := p_versionNumber,
  status                          := p_status
}

template GetSupportedWidecharsReq t_GetSupportedWidecharsReq(e_Codeplane p_codeplane, OCT2 p_firstWideCharInInquiryRange, OCT2 p_lastWideCharInInquiryRange) := {
  vtfunction                  := 193,
  codeplane                   := p_codeplane,
  firstWideCharInInquiryRange := p_firstWideCharInInquiryRange,
  lastWideCharInInquiryRange  := p_lastWideCharInInquiryRange,
  reserved7                   := 'FF'O,
  reserved8                   := 'FF'O
}

template GetSupportedWidecharsRes t_GetSupportedWidecharsRes(OCT2 p_firstWideCharInInquiryRange, 
  OCT2 p_lastWideCharInInquiryRange,
  INT1 p_numberOfRanges, 
  WideCharRangeArray p_wideCharRangeArray) := 
{
  firstWideCharInInquiryRange := p_firstWideCharInInquiryRange,
  lastWideCharInInquiryRange  := p_lastWideCharInInquiryRange,
  numberOfRanges              := p_numberOfRanges, 
  wideCharRangeArray          := p_wideCharRangeArray
}


template AnyIsoBusPdu t_WorkingSetMaintenanceReq_pdu(
  WorkingSetMaintenanceBitMask p_bitMask, 
  e_WorkingSetMaintenanceVersionNumber p_versionNumber) := {
  ecu2vt := {workingSetMaintenanceReq := t_WorkingSetMaintenanceReq(p_bitMask, p_versionNumber)}
}

template WorkingSetMaintenanceReq t_WorkingSetMaintenanceReq(
  WorkingSetMaintenanceBitMask p_bitMask, 
  e_WorkingSetMaintenanceVersionNumber p_versionNumber) := {
  vtfunction                    := 255,
  bitMask                       := p_bitMask,
  versionNumber                 := p_versionNumber,    
  reserved4                     := 'FF'O,
  reserved5                     := 'FF'O,
  reserved6                     := 'FF'O,
  reserved7                     := 'FF'O,
  reserved8                     := 'FF'O
}

}

