'******************************************************************************
'* 
'* GENERIC DEVICE IMPLEMENTATION v.1.0 (must be used by all emulated devices)
'*
'* Version history:
'*  - v.1.0 by WadiM (initial release)
'*
'* S/W Interface (useful tools): 
'*  - DeviceName - fast get/set value of device name parameter (string)
'*  - DeviceGroupName - fast get/set value of device group name (string)
'*  - DebugName - fast get/set value of debug name parameter (string)
'*  - DeviceIndex - index of device, if exist several similar devices (integer>=0)
'*  - DebugPrefix - get debug prefix to use in message log (string, protected)
'*
'* DEVICE Interface (public to use from devset implementations): 
'*  - DEVPARAMS - list of device parameters (object)
'*  - DEV_INIT(stream,EventFreq) - device initialization (boolean result)
'*  - DEV_DONE(stream) - device finalization
'*  - DEV_LOAD(stream) - load device state from stream (boolean result)
'*  - DEV_SAVE(stream) - save device state to stream (boolean result)
'*  - DEV_EXISTS(name,group) - check device existance (boolean result)
'*
'* DEVICE Parameters (for external setup)
'*  - DEVPARAM_NAME as string ("NAME")
'*  - DEVPARAM_GROUPNAME as string ("GROUPNAME")
'*  - DEVPARAM_DEBUGNAME as string ("DEBUGNAME")
'*  - DEVPARAM_DEVICEINDEX as integer ("DEVICEINDEX")
'*
'****************************************************************************** 

//device parameters list
public use object PARAM_LIST as DEVPARAMS

//device name
protected dim DEVPARAM_NAME as string="UNKNOWN DEVICE" 
DEVPARAMS.Add(DEVPARAM_NAME,"NAME") : DEVPARAMS.Configured=true

//device group name
protected dim DEVPARAM_GROUPNAME as string="UNKNOWN GROUP" 
DEVPARAMS.Add(DEVPARAM_GROUPNAME,"GROUPNAME")
DEVPARAMS.Required=false : DEVPARAMS.Configured=true

//device debug name
protected dim DEVPARAM_DEBUGNAME as string="UNK_DEVICE" 
DEVPARAMS.Add(DEVPARAM_DEBUGNAME,"DEBUGNAME") : DEVPARAMS.Configured=true

//device index
protected dim DEVPARAM_DEVICEINDEX as integer=-1 'not indexed
DEVPARAMS.Add(DEVPARAM_DEVICEINDEX,"DEVICEINDEX")
DEVPARAMS.Required=false : DEVPARAMS.Configured=true

'--------------------------------- S/W Interface ------------------------------

//Get formatted debug prefix to use in message log
protected dim DebugPrefix as string="" 'variable to speedup debug output 

//Set value of device name parameter
public property DeviceName(Value as string )
 DEVPARAM_NAME=Value
end

//Get value of device name parameter
public function DeviceName as string 
 result=DEVPARAM_NAME 
end

//Set value of device group name parameter
public property DeviceGroupName(Value as string )
 DEVPARAM_GROUPNAME=Value
end

//Get value of device group name parameter
public function DeviceGroupName as string 
 result=DEVPARAM_GROUPNAME 
end

//Set value of device debug name parameter
public property DebugName(Value as string )
 DEVPARAM_DEBUGNAME=Value : if DEVPARAM_DEVICEINDEX>=0 then 
 DebugPrefix="["+DEVPARAM_DEBUGNAME+"_"+Str(DEVPARAM_DEVICEINDEX)+"] " : else
 DebugPrefix="["+DEVPARAM_DEBUGNAME+"] " : end if
end

//Get value of device debug name parameter
public function DebugName as string 
 result=DEVPARAM_DEBUGNAME 
end

//Set value of device index parameter
public property DeviceIndex(Value as integer)
 DEVPARAM_DEVICEINDEX=Value : if DEVPARAM_DEVICEINDEX>=0 then 
 DebugPrefix="["+DEVPARAM_DEBUGNAME+"_"+Str(DEVPARAM_DEVICEINDEX)+"] " : else
 DebugPrefix="["+DEVPARAM_DEBUGNAME+"] " : end if
end

//Get value of device index parameter
public function DeviceIndex as integer
 result=DEVPARAM_DEVICEINDEX 
end

'------------------------------- DEVICE Interface -----------------------------

//Device initialization
public function DEV_INIT(stream as object,byref EventFreq as integer) as boolean
 dim i as integer : if DEVPARAM_DEVICEINDEX>=0 then 
 DebugPrefix="["+DEVPARAM_DEBUGNAME+"_"+Str(DEVPARAM_DEVICEINDEX)+"] " : else
 DebugPrefix="["+DEVPARAM_DEBUGNAME+"] " : end if
 //check required parameters
 for i=0 to DEVPARAMS.Count-1 
 if (DEVPARAMS.Required(i)) and (not DEVPARAMS.Configured(i)) then
    Error("Device "+DEVPARAM_NAME+" not configured ("+DEVPARAMS.Name(i)+"=?")
 end if : next i
 result=true
end

//Device finalization
public procedure DEV_DONE(stream as object)
end

//Load device state from stream
public function DEV_LOAD(stream as object) as boolean 
 Error("Device "+DEVPARAM_NAME+" is not supported state loading")
 result=false 'not supported
end

//Save device state to stream
public function DEV_SAVE(stream as object) as boolean
 Error("Device "+DEVPARAM_NAME+" is not supported state saving")
 result=false 'not supported
end

//Check device existance (empty params is not used)
public function DEV_EXISTS(name as string, group as string) as boolean
 result=true
 if (name<>"") and (UCase(name)<>UCase(DEVPARAM_NAME)) then result=false
 if (group<>"") and (UCase(group)<>UCase(DEVPARAM_GROUPNAME)) then result=false
end

