blob: 39f17febe067185f8ddf37dc72e89b4cf2d6fce5 [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2000-2017 Ericsson Telecom AB
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v2.0
// which accompanies this distribution, and is available at
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
//
// Contributors:
// Gyorgy Rethy
// version R2A
///////////////////////////////////////////////////////////////////////////////
module GPIOdemo_Led_Button {
import from GPIOPinPort all;
// Files TCCFileIO_Functions.ttcn and TCCFileIO.cc shall be added to the project
// to compile it! They can be found in the project TCC Useful Functions:
// git clone https://github.com/eclipse/titan.Libraries.TCCUsefulFunctions.git
import from TCCFileIO_Functions all;
modulepar float tsp_Tshort := 0.1, tsp_TLED := 1.5, tsp_Twait := 10.0;
modulepar integer pinLED, pinButton;
modulepar boolean debug := false;
type component GPIO extends GPIO_Base {
var charstring exportdirLED := "/sys/class/gpio/gpio" & int2str(pinLED);
var charstring directionfileLED := "/sys/class/gpio/gpio" & int2str(pinLED) & "/direction";
var charstring valuefileLED := "/sys/class/gpio/gpio" & int2str(pinLED) & "/value";
var charstring exportdirButton := "/sys/class/gpio/gpio" & int2str(pinButton);
var charstring directionfileButton := "/sys/class/gpio/gpio" & int2str(pinButton) & "/direction";
var charstring valuefileButton := "/sys/class/gpio/gpio" & int2str(pinButton) & "/value";
timer T_guard := 15.0;
}
function f_checkDirectory(charstring p_exportdir) runs on GPIO {
if (f_FIO_fileOrDirExists(p_exportdir)) {
log("Export directory created successfully");
setverdict (pass);
} else {
setverdict (fail,"Failed to create export directory");
mtc.stop
}
}
function f_setDirection(
integer p_pin,
GPIO_PIN_DIRECTION p_direction
) runs on GPIO {
gpio[p_pin].send(p_direction);
}
function f_checkDirection(
charstring p_directionfile,
GPIO_PIN_DIRECTION p_direction
) runs on GPIO {
if (debug) {
var integer fd := f_FIO_open_rdonly(p_directionfile);
var charstring directionExpected;
var charstring direction;
var integer ret := f_FIO_read_text_until(fd, direction, "\n");
select (p_direction) {
case (OUT) { directionExpected := "out" }
case (IN) { directionExpected := "in" }
}
if (direction == directionExpected) {
setverdict (pass,"Direction set to ",p_direction," successfully");
} else {
setverdict (fail,"Direction is not ",p_direction,": %s", direction);
mtc.stop
}
f_FIO_close(fd);
}
}
function f_setValue(
integer p_pin,
GPIO_PIN_VALUE p_value
) runs on GPIO {
gpio[p_pin].send(p_value);
}
function f_checkValue(
charstring p_valuefile,
GPIO_PIN_VALUE p_value
) runs on GPIO {
if (debug) {
var integer fd := f_FIO_open_rdonly(p_valuefile);
var charstring value_ := "", valueExpected;
var integer ret := f_FIO_read_text_until(fd, value_, "\n");
select (p_value) {
case (HIGH) { valueExpected := "1" }
case (LOW) { valueExpected := "0" }
}
if (value_ == valueExpected) {
log("Pin value set to ", p_value, " successfully");
setverdict (pass);
} else {
log("Pin value is not ", p_value,": %s", value_);
setverdict (fail);
mtc.stop;
}
f_FIO_close(fd);
}
}
function f_delay(float p_delay) {
timer T_delay := p_delay;
T_delay.start;
T_delay.timeout;
}
function f_LED_on_off(integer p_pin,float p_timeOn) runs on GPIO {
f_setValue(p_pin,HIGH);
f_checkValue(valuefileLED,HIGH);
f_delay(p_timeOn);
f_setValue(p_pin,LOW);
f_checkValue(valuefileLED,LOW)
}
altstep as_removeState(integer p_pin, GPIO_PIN_VALUE p_value) runs on GPIO {
[] gpio[p_pin].receive(p_value) {
log("pin ",p_pin," is pulled to ",p_value);
repeat;
}
}
testcase TC_LEDon() runs on GPIO {
//Map the port, this will export the gpio
map(self:gpio[pinLED], system:gpio[pinLED]);
f_delay(tsp_Tshort);
f_checkDirectory(directionfileLED)
f_delay(tsp_Tshort);
//Set direction on the gpio to OUT
f_setDirection(pinLED,OUT)
f_checkDirection(directionfileLED,OUT);
f_LED_on_off(pinLED,tsp_TLED)
unmap(self:gpio[pinLED], system:gpio[pinLED]);
setverdict(pass);
}
testcase TC_button() runs on GPIO {
timer T_wait := tsp_Twait;
//Mapping ports, this will export the gpios
map(self:gpio[pinLED], system:gpio[pinLED]);
map(self:gpio[pinButton], system:gpio[pinButton]);
f_delay(tsp_Tshort);
f_checkDirectory(directionfileLED);
f_checkDirectory(directionfileButton);
f_delay(tsp_Tshort);
//Set direction on the gpio21 to OUT
f_setDirection(pinLED,OUT)
f_checkDirection(directionfileLED,OUT);
//Switch the LED on gpio21 ON
f_setValue(pinLED,HIGH);
f_checkValue(valuefileLED,HIGH);
//Set direction on the gpio[pinButton] to IN
f_setDirection(pinButton,IN)
f_checkDirection(directionfileButton,IN);
// var default v_defRemoveState := activate(as_removeState(pinButton,HIGH));
action("Start wait for signal to appear...");
T_wait.start;
alt {
[] gpio[pinButton].receive(GPIO_PIN_VALUE:LOW){
log("Input changed to \"LOW\"");
T_wait.stop;
f_setValue(pinLED,LOW);
f_checkValue(valuefileLED,LOW);
setverdict (pass);
f_delay(2.0)//waiting before killing test case to see button shaking messages!
}
[] T_wait.timeout {
log("Timeout while waiting for input to change");
f_setValue(pinLED,LOW);
f_checkValue(valuefileLED,LOW);
f_delay(0.5);f_LED_on_off(pinLED,0.5);
f_delay(0.5);f_LED_on_off(pinLED,0.5);
f_delay(0.5);f_LED_on_off(pinLED,0.5);
setverdict(inconc);
}
}
//Unmap the port, this will unexport the gpio
log("Unmapping ports");
unmap(self:gpio[pinLED], system:gpio[pinLED]);
unmap(self:gpio[pinButton], system:gpio[pinButton]);
}
control {
execute(TC_LEDon());
execute(TC_button());
}
}