The Abilis permits to pilot Output digital line also making phone calls. For that we use a LUA script joined to DISA resource that allows to open Gate#1 connected to Digital Output 1 verifying the calling number.
| ![[Note]](../images/note.png) | Note | 
|---|---|
| This advanced configuration normally is realized by Second Level Abilis support. Bellow are reported only the resource configurations and a short logical description. | 
1 - The Abilis verify to receive a call to the called number 0213456789 from the calling numbers recognized in list CallingOK, in this case is sent a call to the DISA Service with called Number 91.
[13:47:55] ABILIS_CPX: d ctir pr:3
Last change: 01/02/2015 14:20:26 CET
---+-----+-----------------+---------+--------------------+--------------------
PR |[DESCR]
   |TYPE |POI/SR   [SR]    |POO/DS   |CDI                 |CDO
ACT|NEXT       |LAST       |EEC |T301|CGI                 |CGO
EDT|SP   |SC   |DJ   |MJ   |FMDJ|FMMJ|SDI                 |SDO
   |SPOUT|SCOUT|DJOUT|MJOUT|LCS |LCST|SGI                 |SGO
   |                       |BCO      |RGI                 |RGO
   |FMRLY|FAXSP|MODSP|FMLVL|ECM |UDT |IG  |OG  |SG        |DL  |DH
|CODERS
   |CODERSOUT
   |TI1 .. TI5
-------------------------------------------------------------------------------
3   CtoD  *                 CtiDisa   0213456789           91
NO          ANY         NO   Dft  'CallingOK'          *
64000 Sys   *     *     Sys  Sys  *                    *
-------------------------------------------------------------------------------
2- The DISA resource, configured like below, receive the call with called number 91. The DISA SERVICE:entryphone refuse the call but recognized the number that is motorized by LUA Script.
[13:47:16] ABILIS_CPX:d p ctidisaRES:CtiDisa ------------------------------------------------------------------- Run DESCR:Direct_Inward_System_Access LOG:NO ACT:YES sesnum:10 RESTRICTED-CALLING:NO PROVIDE-SG:YES CALL-ABORT:** CALL-REPEAT:** PIN-START:* PIN-END:# NPOO-CT:SYS CTIP-TYPE:NET-PRIVATE BUSY-NOCHAN:YES WDIR:C:\APP\DISA\ [13:47:19] ABILIS_CPX:d ctidisa userTotal number of users:1 ------------------------------------------------------------------------------- USER:Anonymous PIN: # |MAX-CALLS: NOMAX |PERMIT: SERVICE SERVICE: AUTO |CB: NO |DENY: # CGI: - ------------------------------------------------------------------------------- [13:47:22] ABILIS_CPX:d ctidisa service:entryphoneTotal number of services:2 ------------------------------------------------------------------------------- SERVICE:entryphone DESCR: MODE: APP |INTRO-STATE: CREQ |INTRO: MAX-CALLS: NOMAX |CONN-DELAY: 6 |WELCOME: BC: Speech |DIAL-TOUT: 30 |INITDIAL: CB-CGO: # |BYE: # CDI: 9* CGI: # -------------------------------------------------------------------------------
3- The script ephone-cd.lua verify the last digit of the called number and pilot the corresponding Digital Output. In this example the called number is 91 then the driven Digital Output is D-OUT: 1.
[13:46:52] ABILIS_CPX: d p script
RES:Script --------------------------------------------------------------------
Run    DESCR:Scripting_service
       LOG:NO        ACT:YES    bg-sesnum:4    fg-sesnum:4
wdir:C:\APP\SCRIPT\
       - Background scripts ---------------------------------------------------
       id:0  startup:YES  file:ephone-cd.lua
       id:1  startup:NO   file:
       id:2  startup:NO   file:
       id:3  startup:NO   file:
| ![[Tip]](../images/tip.png) | Tip | 
|---|---|
| To manage the Lua script by web interface follows the chapter Section 70.23, “LUA scripts” | 
4- To open GATE#1 connected to D-OUT:1 Mfio is configured to generate a Pulse of 250 ms.
[13:46:44] ABILIS_CPX: d p mfio
RES:MfIo ----------------------------------------------------------------------
Run    DESCR:Abilis_Multi_Function_IO_Interface
       LOG:NO        ACT:YES
       -------+-------------------- Digital Input lines -----------------------
       D-IN:  | [DESCR:]
       -------+----------------------------------------------------------------
       -------+-------------------- Digital Output lines ----------------------
       D-OUT: | [DESCR:]
              | MODE:    PULSE-T:    PULSE-GAP:
-------+----------------------------------------------------------------
       1      | GATE#1
              | PULSE    250          1000
       2      | GATE#2
              | PULSE    250          1000
       3      | PULSE    90000        1000
       ------------------------------------------------------------------------   
LUA Script ephone-cd.lua :
------------------------------------------------------------
--- ephone-cd.lua Script
--
-- This script waits for incoming call and makes a 250 ms
-- pulse on the selected digital output line depending on
-- the called number.
--
-- @author Tomas Klinkovsky <tklink@antek.it>
------------------------------------------------------------
local abilis = require "abilis"
------------------------------------------------------------
-- call state
local CLOSED = 0
local CALLING = 1
local ALERTING = 2
local ACTIVE = 3
local CLOSING = 4
local LISTENING = 5
-- play state
--local SILENT = 0,
--local PLAYING = 1,
------------------------------------------------------------
-- Name of this script, show in log
local SCRIPTNAME = "ephone-cd.lua"
-- Name of DISA/APP service
local DISASERVICE = "entryphone"
-- GPIO resource type
local GPIORESTYPE = "MFIO"
-- GPIO resource instance
local GPIORESINST = 1
-- GPIO pulse duration
local PULSEDURATION = 0.25
-- Poll period in seconds
local POLLPERIOD = 0.5
------------------------------------------------------------
--- Display log message
-- The message is preceded with an automatically generated
-- timestamp.
-- @parammsg Message to be logged
--
local function log(msg)
	local dt = os.date("%Y-%m-%d %X")
	local sep = " "
	print(dt .. sep .. msg)
end
------------------------------------------------------------
--- Handle of selected GPIO device
--
local GPIOHANDLE = abilis.gio.get_device_handle(GPIORESTYPE, GPIORESINST)
------------------------------------------------------------
--- Generate 250 ms pulse on selected GPIO line
-- @param line Digital output line number
--
local function pulse_line(line)
	abilis.gio.set_digital_output(GPIOHANDLE, line, 1)
	abilis.cpx.sleep(PULSEDURATION)
	abilis.gio.set_digital_output(GPIOHANDLE, line, 0)
end
------------------------------------------------------------
--- Wait for incoming call in DISA/APP
-- @param handle DISA/APP handle
--
local function wait_for_incoming_call(handle)
	assert(handle > 0)
	while true do
		local state = abilis.disa.get_state(handle)
		if state == CLOSED then
			return false
		elseif state ~= LISTENING then
			return true
		else
			abilis.cpx.sleep(POLLPERIOD)
		end
	end
end
------------------------------------------------------------
--- Map last digit of called number to GPIO line
--
local MAP = {
	["1"] = 1,
	["2"] = 2,
	["3"] = 3,
	["4"] = 4,
}
------------------------------------------------------------
--- Convert called number to GPIO line (or nil).
-- @param number Called phone number
-- @return GPIO line number
--
local function get_line_for_number(number)
	if number ~= nil then
		local last_digit = number:sub(-1)
		return MAP[last_digit]
	else
		return nil
	end
end
------------------------------------------------------------
--- Convert value to string.
-- Nil is converted to empty string, other values are
-- returned unchanged.
-- @param x String or nil
-- @return String
local function tostr(x)
	if x ~= nil then
		return x
	else
		return ""
	end
end
------------------------------------------------------------
--- Handle incoming call.
-- Wait for incoming call, obtain called number, find the
-- corresponding GPIO line, and generate pulse there.
-- @param handle DISA/APP handle
--
local function handle_incoming_call(handle)
	assert(handle > 0)
	if wait_for_incoming_call(handle) then
		local cg, cd = abilis.disa.get_info(handle)
		log("incoming call CG:" .. tostr(cg) .. " CD:" .. tostr(cd))
		local line = get_line_for_number(cd)
		if line ~= nil then
			log("generating pulse on line " .. line)
			pulse_line(line)
		else
	 	log("unsupported called number")
		end
	end
	log("closing call")
	abilis.disa.close(handle)
end
------------------------------------------------------------
--- Handle incoming calls.
-- Listen on selected DISA/APP service, and process
-- incoming call. And again, forever.
--
local function handle_incoming_calls()
	while true do
		log("waiting for incoming call")
		local handle = abilis.disa.listen(DISASERVICE)
		if handle ~= nil then
			handle_incoming_call(handle)
		else
			log("listen function failed")
			break
		end
	end
end
------------------------------------------------------------
--- Create session object, and handle incoming calls from
-- DISA/APP.
--
local function main()
	log(SCRIPTNAME .. " script started")
	handle_incoming_calls()
	log(SCRIPTNAME .. " script ended")
end
-- Execute the main function
main()
| ![[Note]](../images/note.png) | Note | 
|---|---|
| This script can also be used for an GPIO device, it's necessary
        to modify only this line " | 
The Abilis permits to pilot Output digital line and Relay switch
      ports making phone calls. For that we use a LUA script joined to DISA
      MODE:APP resource that allows to
      open Gate#1 connected to Relay switch ports 1-A, 1-B. By enabling the
      digital output line (ON) a contact is closed that short-circuits the
      respective A and B pins.
| ![[Note]](../images/note.png) | Note | 
|---|---|
| This advanced configuration normally is realized by Second Level Abilis support. Bellow are reported only the resource configurations and a short logical description. | 
| ![[Tip]](../images/tip.png) | Tip | 
|---|---|
| Interesting chapters: | 
1 - The Abilis verify to receive a call to the called number 40x,
      for example 401 to pilot
      D-OUT:1.
[13:47:55] ABILIS_CPX: d ctir pr:3
Last change: 01/02/2015 14:20:26 CET
---+-----+-----------------+---------+--------------------+--------------------
PR |[DESCR]
   |TYPE |POI/SR   [SR]    |POO/DS   |CDI                 |CDO
ACT|NEXT       |LAST       |EEC |T301|CGI                 |CGO
EDT|SP   |SC   |DJ   |MJ   |FMDJ|FMMJ|SDI                 |SDO
   |SPOUT|SCOUT|DJOUT|MJOUT|LCS |LCST|SGI                 |SGO
   |                       |BCO      |RGI                 |RGO
   |FMRLY|FAXSP|MODSP|FMLVL|ECM |UDT |IG  |OG  |SG        |DL  |DH
|CODERS
   |CODERSOUT
   |TI1 .. TI5
--------------------------------------------------------------------------------
3   [Management_I/O]
    VOICE  **   #        #   Disa      40?                  *                   
    NO           ANY         NO   Dft  *                    *                   
    64000  Sys   Sys   Sys   Sys  Sys  *                    *                   
--------------------------------------------------------------------------------
2- The DISA resource, configured like below, receive the call with called number 401. The DISA SERVICE:RIO refuse the call but recognized the number that is motorized by LUA Script.
[13:47:16] ABILIS_CPX:d p ctidisaRES:CtiDisa ------------------------------------------------------------------- Run DESCR:Direct_Inward_System_Access LOG:NO ACT:YES sesnum:10 RESTRICTED-CALLING:NO PROVIDE-SG:YES CALL-ABORT:** CALL-REPEAT:** PIN-START:* PIN-END:# NPOO-CT:SYS CTIP-TYPE:NET-PRIVATE BUSY-NOCHAN:YES WDIR:C:\APP\DISA\ [13:47:19] ABILIS_CPX:d ctidisa userTotal number of users:1 ------------------------------------------------------------------------------- USER:Anonymous PIN: # |MAX-CALLS: NOMAX |PERMIT: SERVICE SERVICE: AUTO |CB: NO |DENY: # CGI: - ------------------------------------------------------------------------------- [13:47:22] ABILIS_CPX:d ctidisa service:rioTotal number of services:2 ------------------------------------------------------------------------------- SERVICE:RIO DESCR: MODE: APP |INTRO-STATE: CREQ |INTRO: MAX-CALLS: NOMAX |CONN-DELAY: 0 |WELCOME: BC: Speech |DIAL-TOUT: 30 |INITDIAL: CB-CGO: # |BYE: # CDI: 40* CGI: # -------------------------------------------------------------------------------
3- The script ephone-cd.lua
      verify the last digit of the called number and pilot the corresponding
      Digital Output. In this example the called number is 401 then the driven
      D-OUT:1.
[13:46:52] ABILIS_CPX: d p script
RES:Script --------------------------------------------------------------------
Run    DESCR:Scripting_service
       LOG:NO        ACT:YES    bg-sesnum:4    fg-sesnum:4
wdir:C:\APP\SCRIPT\
       - Background scripts ---------------------------------------------------
       id:0  startup:YES  file:gate.lua
       id:1  startup:NO   file:
       id:2  startup:NO   file:
       id:3  startup:NO   file:
| ![[Tip]](../images/tip.png) | Tip | 
|---|---|
| To manage the Lua script by web interface follows the chapter Section 70.23, “LUA scripts” | 
4- To open Gate#1 connected to
      D-OUT:1 RIO device is configured
      to generate a Pulse of 500 ms.
[13:46:44] ABILIS_CPX: d p rio
RES:Rio-1 ---------------------------------------------------------------------
Run    DESCR:RIO
       LOG:DS                  ACT:YES
       - IpConf parameters (Read Only) ---------------------------------------
       MAC:B8-27-EB-12-F7-FB   IPRES:Ip-1    
       IPADD:192.168.001.222   MASK:255.255.255.000   GW:192.168.001.001
       -------+-------------------- Digital Input lines -----------------------
       D-IN:  | [DESCR:]
       -------+----------------------------------------------------------------
       -------+-------------------- Digital Output lines ----------------------
       D-OUT: | [DESCR:]
              | MODE:    PULSE-T:    PULSE-GAP:    START: DFT:
       -------+----------------------------------------------------------------
       1      | Gate#1
              | PULSE    500         500           LAST   OFF
       -------+-------------------- Analog Input lines ------------------------
       A-IN:  | [DESCR:]
              | UNIT:    MIN:    MAX:    ALM-LO: ALM-HI: HYST:   UPD:    POLL:
       -------+----------------------------------------------------------------
       -------+-------------------- Analog Output lines -----------------------
       A-OUT: | [DESCR:]
              | UNIT:    MIN:    MAX:    ALM-LO: ALM-HI: HYST:   UPD:    POLL:
              |          CUT-LO: CUT-HI: START:  DFT:
       -------+----------------------------------------------------------------
LUA Script gate.lua :
--- gate.lua Script
--
-- This script waits for incoming call and makes a 500 ms
-- pulse on the selected digital output line depending on
-- the called number.
-- author Ion Buraga <buraga@antek.it>
local abilis = require "abilis"
------------------------------------------------------------
-- call state
local CLOSED = 0
local CALLING = 1
local ALERTING = 2
local ACTIVE = 3
local CLOSING = 4
local LISTENING = 5
-- play state
--local SILENT = 0,
--local PLAYING = 1,
------------------------------------------------------------
-- Name of this script, show in log
local SCRIPTNAME = "gate.lua"
-- Name of DISA/APP service
local DISASERVICE = "RIO"
-- GPIO resource type
local GPIORESTYPE = "RIO"
-- GPIO resource instance
local GPIORESINST = 1
-- GPIO pulse duration
local PULSEDURATION = 0.5
-- Poll period in seconds
local POLLPERIOD = 0.5
------------------------------------------------------------
--- Display log message
-- The message is preceded with an automatically generated
-- timestamp.
-- @parammsg Message to be logged
--
local function log(msg)
	local dt = os.date("%Y-%m-%d %X")
	local sep = " "
	print(dt .. sep .. msg)
end
------------------------------------------------------------
--- Handle of selected GPIO device
--
local GPIOHANDLE = abilis.gio.get_device_handle(GPIORESTYPE, GPIORESINST)
------------------------------------------------------------
--- Generate 250 ms pulse on selected GPIO line
-- @param line Digital output line number
--
local function pulse_line(line)
	abilis.gio.set_digital_output(GPIOHANDLE, line, 1)
	abilis.cpx.sleep(PULSEDURATION)
	abilis.gio.set_digital_output(GPIOHANDLE, line, 0)
end
------------------------------------------------------------
--- Wait for incoming call in DISA/APP
-- @param handle DISA/APP handle
--
local function wait_for_incoming_call(handle)
	assert(handle > 0)
	while true do
		local state = abilis.disa.get_state(handle)
		if state == CLOSED then
			return false
		elseif state ~= LISTENING then
			return true
		else
			abilis.cpx.sleep(POLLPERIOD)
		end
	end
end
------------------------------------------------------------
--- Map last digit of called number to GPIO line
--
local MAP = {
	["1"] = 1,
	["2"] = 2,
	["3"] = 3,
	["4"] = 4,
	["5"] = 5,
	["6"] = 6,
	["7"] = 7,
	["8"] = 8,
}
------------------------------------------------------------
--- Convert called number to GPIO line (or nil).
-- @param number Called phone number
-- @return GPIO line number
--
local function get_line_for_number(number)
	if number ~= nil then
		local last_digit = number:sub(-1)
		return MAP[last_digit]
	else
		return nil
	end
end
------------------------------------------------------------
--- Convert value to string.
-- Nil is converted to empty string, other values are
-- returned unchanged.
-- @param x String or nil
-- @return String
local function tostr(x)
	if x ~= nil then
		return x
	else
		return ""
	end
end
------------------------------------------------------------
--- Handle incoming call.
-- Wait for incoming call, obtain called number, find the
-- corresponding GPIO line, and generate pulse there.
-- @param handle DISA/APP handle
--
local function handle_incoming_call(handle)
	assert(handle > 0)
	if wait_for_incoming_call(handle) then
		local cg, cd = abilis.disa.get_info(handle)
		log("incoming call CG:" .. tostr(cg) .. " CD:" .. tostr(cd))
		local line = get_line_for_number(cd)
		if line ~= nil then
			log("generating pulse on line " .. line)
			pulse_line(line)
		else
	 	log("unsupported called number")
		end
	end
	log("closing call")
	abilis.disa.close(handle)
end
------------------------------------------------------------
--- Handle incoming calls.
-- Listen on selected DISA/APP service, and process
-- incoming call. And again, forever.
--
local function handle_incoming_calls()
	while true do
		log("waiting for incoming call")
		local handle = abilis.disa.listen(DISASERVICE)
		if handle ~= nil then
			handle_incoming_call(handle)
		else
			log("listen function failed")
			break
		end
	end
end
------------------------------------------------------------
--- Create session object, and handle incoming calls from
-- DISA/APP.
--
local function main()
	log(SCRIPTNAME .. " script started")
	handle_incoming_calls()
	log(SCRIPTNAME .. " script ended")
end
-- Execute the main function
main()
| ![[Note]](../images/note.png) | Note | 
|---|---|
| This script can also be used for an RVS device, it's necessary
          to modify only this line " |