[[scripting]]
== Scripting using Lua

The mobile application can be extended using the
https://www.lua.org/manual/5.3/[lua5.3 language].
To use the scripting facility a script needs to be
configured through the VTY interface and will be
associated to a Mobile Station (MS). The script will
then be able to interact with the specific MS.

An event based programming model is to be used. This
means that once the script has been loaded it should
register to the wanted events, configure timers and
return. When an event occurs the registered event
handler will be executed.

The following describes the exported runtime services
to be used in the script.

=== Logging

The logging functions allow to generate log messages
for different levels. The log implementatiom is using
the standard Osmocom logging framework which allows to
have multiple log targets, e.g. syslog, file or through
the VTY.

|========
|Code              |Return | Explanation
|print(...)        |void  | Print a message with log level 'debug'
|log_debug(...)    |void  | Print a message with log level 'debug'
|log_notice(...)   |void  | Print a message with log level 'notice'
|log_error(...)    |void  | Print a message with log level 'error'
|log_fatal(...)    |void  | Print a message with log level 'fatal'
|========

==== Examples

----
Code:
print("Log level 'debug'")
log_debug("Log level 'debug'")
log_notice("Log level 'notice'")
log_error("Log level 'error'")
log_fatal("Log level 'fatal'")

Output:
\<0011> @script.lua:1 Log level 'debug' 
\<0011> @script.lua:2 Log level 'debug' 
\<0011> @script.lua:3 Log level 'notice' 
\<0011> @script.lua:4 Log level 'error' 
\<0011> @script.lua:5 Log level 'fatal' 

----

=== Timer class

The timer allows to invoke a function once after the requested
timeout. The timer creation function will return immediately and
the callback will be called after the timeout and when no other
lua code is executing. The _osmo.timeout_ function should be used
to create a new time, a running timer can be canneled using the _cancel_
method.

|========
|Code                     |Return     |Explanation
|osmo.timeout(timeout, cb)|A new timer|Create a new non-recurring timer. Timeout should be in rounded seconds and cb should be a function.
|timer.cancel()           |Void       |Cancel the timer, the callback will not be called.
|========

==== Examples

----
Code:
local timer = osmo.timeout(timeout_in_seconds, call_back)
timer:cancel()
----

----
Code:
local timer = osmo.timeout(3, function()
	print("Timeout passed")
end)
print("Configured")

Output:
\<0011> @script.lua:4 Configured
\<0011> @script.lua:2 Timeout passed
----

=== MS class

The MS singletong provides access to the Mobile Station configuration
the script is associated with. This includes runtime information like
the IMSI, IMEI or functions like start/stop.

|========
|Code                     |Return     |Explanation
|osmo.ms().imsi()         |string     |The IMSI. It might be invalid in case it has not been read from SIM card yet
|osmo.ms().imei()         |string     |The configured IMEI
|========
==== Examples

-----
Code:
local ms = osmo.ms()
print(ms.imei(), ms.imsi())

Output:
\<0011> @script.lua:2 126000000000000
-----
