/** NXT Mindstroms - operation of components. @author Piotr Hołownia */ :- module(nxt_components,[ motor/2, motor/3, light_sensor/1, touch_sensor/1, ultrasonic_sensor/1, sound_sensor/1, trigger_create/3, timer_create/3 ]). :- use_module(nxt_actions). %% motor(+Motor,+Speed). %% motor(+Motor,-Speed). % % Reads speed of the specified motor % or rotates it at specified speed. motor(Motor,Speed) :- var(Speed), get_speed(Motor,Speed). motor(Motor,Speed) :- nonvar(Speed), set_speed(Motor,Speed). %% motor(+Motor,+Speed,time(+Time)). % % Changes motor speed for a specified time. motor(Motor,Speed,time(Time)) :- nonvar(Speed), nonvar(Time), motor(Motor,Oldspeed), motor(Motor,Speed), timer_create(_,Time,motor(Motor,Oldspeed)). %% motor(+Motor,+Speed,angle(+Angle). %% motor(+Motor,+Speed,+Angle). % % Rotates motor at specified speed. % Motor will stop, when specified revolution (Angle in degrees) is reached. motor(Motor,Speed,angle(Angle)) :- nonvar(Speed), nonvar(Angle), set_speed(Motor,Speed,Angle). motor(Motor,Speed,Angle) :- motor(Motor,Speed,angle(Angle)). %% light_sensor(-Value). % % Gets light sensor reading. light_sensor(Value) :- var(Value), get_light(Value). %% touch_sensor(-Value). % % Gets touch sensor reading. touch_sensor(Value) :- var(Value), get_touch(Value). %% ultrasonic_sensor(-Value). % % Gets ultrasonic sensor reading. ultrasonic_sensor(Value) :- var(Value), get_distance(Value). %% sound_sensor(-Value). % % Gets sound sensor reading. sound_sensor(Value) :- var(Value), get_sound(Value). %% trigger_create(-ID,+Event,+Action). % % Creates trigger. % Action will be fired, when Event is true. % Action can be both predicate and list of predicates. trigger_create(ID,Event,Action) :- thread_create(trigger(Event,Action),ID,[]). fired([Action|Tail]) :- Action, fired(Tail). fired([Action]) :- Action. fired(Action) :- Action. trigger(Event,Action) :- Event, fired(Action). trigger(Event,Action) :- trigger(Event,Action). %% timer_create(-ID,+Time,+Action). % % Creates timer. % Action will be fired after specified Time. % Action can be both predicate and list of predicates. timer_create(ID,Time,Action) :- get_time(Start_time), Finish_time is Start_time+Time, thread_create(timer(Finish_time,Action),ID,[]). timer(Finish_time,Action) :- get_time(Time), Time >= Finish_time, fired(Action). timer(Finish_time,Action) :- timer(Finish_time,Action).