InterruptAttach() problem!

I try to attach interrupt handler to the interrupt vector #7 on the x_86
platform. I have one parraler port on this board at address 0x378. Looks
like handler is not called until I disable paraller port on the board. Is it
a standard procedure or I am doing something wrong? What about if I want to
this paraller port for printer but I do not care about interrupt 7 which by
default is assignet to this port.

Please help!
Janusz.

“Janusz” <ruszelj@baxter.com> wrote in message
news:9kms1r$p77$1@inn.qnx.com

I try to attach interrupt handler to the interrupt vector #7 on the x_86
platform. I have one parraler port on this board at address 0x378. Looks
like handler is not called until I disable paraller port on the board. Is
it
a standard procedure or I am doing something wrong?

Internaly parallel port if hooked to ISA bus and with ISA you can’t
share interrupt.

What about if I want to
this paraller port for printer but I do not care about interrupt 7 which
by
default is assignet to this port.

Good question :wink:

Please help!
Janusz.

Hi Mario,

Excuse my ignorance, I am newbie in QNX. I agree it is not a good idea do
not care about IRQ7 (there are IRQ10,11,12 for extra hardware)

Mario Charest <mcharest@zinformatic.com> wrote in article
<9koguq$q14$1@inn.qnx.com>…

[cut]

Internaly parallel port if hooked to ISA bus and with ISA you can’t
share interrupt.

[cut]

Do you mean I can not serve interrupts from ISA bus in QNXRTP? What about
if I wish to have my own ISR for LPT1 interrupt? I see interrupt handler is
not called if LPT1 is enabled in BIOS.

In DOS I can write the next:
void* OldHandler;
void interrupt MyHandler(){
//here is body of my handler
}
void main(void){
OldHandler=getvector(0x0f);
setvector(0x0f, MyHandler);
//here is body of main
setvector(0x0f, OldHandler);
}

Indifferent which vector I wish to serve.

Thank you.
Eduard.

“Eduard Kromskoy” <ed1k@yahoo.com> wrote in message
news:01c11f49$2738ebc0$396fa8c0@ED1K…

Hi Mario,

Excuse my ignorance, I am newbie in QNX. I agree it is not a good idea do
not care about IRQ7 (there are IRQ10,11,12 for extra hardware)

Mario Charest <> mcharest@zinformatic.com> > wrote in article
9koguq$q14$> 1@inn.qnx.com> >…

[cut]

Internaly parallel port if hooked to ISA bus and with ISA you can’t
share interrupt.

[cut]

Do you mean I can not serve interrupts from ISA bus in QNXRTP?

NO NO :wink: I meant you cannot have another device use the same
interrupt as the parallel port even if you don’t use the parallel port.

What about
if I wish to have my own ISR for LPT1 interrupt? I see interrupt handler
is
not called if LPT1 is enabled in BIOS.

Hum that’s odd, this should work. Is it possible the BIOS is setting up
the hardware to NOT used interrupt. Parallel port have various mode
of operation… Have you tried your software in a different platform?

Just a though are you making sure devc-par is not running?



In DOS I can write the next:
void* OldHandler;
void interrupt MyHandler(){
//here is body of my handler
}
void main(void){
OldHandler=getvector(0x0f);
setvector(0x0f, MyHandler);
//here is body of main
setvector(0x0f, OldHandler);
}

Indifferent which vector I wish to serve.

QNX6 does the same, all handler that attach to an interrupt are called.

Thank you.
Eduard.

Hi Mario,

Mario Charest <mcharest@zinformatic.com> wrote in article
<9kosui$3r2$1@inn.qnx.com>…

NO NO > :wink: > I meant you cannot have another device use the same
interrupt as the parallel port even if you don’t use the parallel port.

It sounds strange a little for me. I mean parallel port usage. What if my
old ISA card uses IRQ7 (no jumpers, no variants). Why I can not disable
parallel port’s interrupts in my program (bit d4 in port 0x37a for LPT1) in
order to use this line for my card? As far as I know, there is not hardware
conflict in this case. Hardware INT when -ACK goes false is not called at
all in this case. I feel I must to disable LPT1 usage for another process
in multitask environment, can I do it?

What about
if I wish to have my own ISR for LPT1 interrupt? I see interrupt
handler
is
not called if LPT1 is enabled in BIOS.

Hum that’s odd, this should work. Is it possible the BIOS is setting up
the hardware to NOT used interrupt. Parallel port have various mode
of operation… Have you tried your software in a different platform?

Just a though are you making sure devc-par is not running?

Sorry, I refered to Janusz’s message. I said in theory only. I evaluate QNX
for our tasks at this moment, no more. Is there other way than
InterruptAttach() in QNX?

[cut]

QNX6 does the same, all handler that attach to an interrupt are called.

In DOS it is my trouble to call all handlers. What about if I do not wish
to call all handlers? For example keyboard’s hardware interrupt: my handler
looks at scan-code, if it is a hotkey - itself exits from hdwr isr, else -
call OldHandler().

Thank you.very much,
Eduard.

“Eduard Kromskoy” <ed1k@yahoo.com> wrote in message
news:01c11f57$39556c80$396fa8c0@ED1K…

Hi Mario,

Mario Charest <> mcharest@zinformatic.com> > wrote in article
9kosui$3r2$> 1@inn.qnx.com> >…


NO NO > :wink: > I meant you cannot have another device use the same
interrupt as the parallel port even if you don’t use the parallel port.


It sounds strange a little for me. I mean parallel port usage. What if my
old ISA card uses IRQ7 (no jumpers, no variants).

If the port is disable in the BIOS then it should work.

Why I can not disable parallel port’s interrupts in my program
(bit d4 in port 0x37a for LPT1) in order to use this line for my card?

Are you sure writting to this bit is all that is required to disable
interrupts?

As far as I know, there is not hardware conflict in this case. Hardware
INT
when -ACK goes false is not called at all in this case.

I feel I must to disable LPT1 usage for another process in multitask
environment, can I do it?

You lost me there.

What about
if I wish to have my own ISR for LPT1 interrupt? I see interrupt
handler
is
not called if LPT1 is enabled in BIOS.

Hum that’s odd, this should work. Is it possible the BIOS is setting up
the hardware to NOT used interrupt. Parallel port have various mode
of operation… Have you tried your software in a different platform?

Just a though are you making sure devc-par is not running?

Sorry, I refered to Janusz’s message. I said in theory only. I evaluate
QNX
for our tasks at this moment, no more. Is there other way than
InterruptAttach() in QNX?

There is InterruptAttachEvent but that won’t make a difference in
your case.

I understood you were doing some testing right? If you are running
program that are accessing the parallel port you have to
make sure devc-par is not running.

[cut]

QNX6 does the same, all handler that attach to an interrupt are called.


In DOS it is my trouble to call all handlers. What about if I do not wish
to call all handlers? For example keyboard’s hardware interrupt: my
handler
looks at scan-code, if it is a hotkey - itself exits from hdwr isr, else -
call OldHandler().

You cannot. This is not how QNX works. The philosophy is different.
That is how most multi-tasking realtime os works.

Thank you.very much,
Eduard.

Hi Mario,

Mario Charest <mcharest@zinformatic.com> wrote in article
<9kp4dn$7ub$1@inn.qnx.com>…

If the port is disable in the BIOS then it should work.

I quite agree with you. It’s only attempt to do it without disabling :wink:

Why I can not disable parallel port’s interrupts in my program
(bit d4 in port 0x37a for LPT1) in order to use this line for my card?

Are you sure writting to this bit is all that is required to disable
interrupts?

Not all interrupts! Only INT 0x0f (IRQ7) from LPT1, I’m pretty sure, it is
parallel port hardware.

I understood you were doing some testing right? If you are running
program that are accessing the parallel port you have to
make sure devc-par is not running.

Thank you for hint. No, I was not doing any tests yet. Maybe, anybody else
in our company, I don’t know :wink:. I deal with DSP-based controllers, and
some my programs talk with those controllers via LPT or COM ports. I am
going to do test in QNX, but only after I’ll finish my current project
(it’s fully DSP’s assembler).

You cannot. This is not how QNX works. The philosophy is different.
That is how most multi-tasking realtime os works.

I heard in NT the same philosophy :wink:.

Thank you very much,
Best wishes,
Eduard.

“Eduard Kromskoy” <ed1k@yahoo.com> wrote in message
news:01c11f6a$93ed9560$396fa8c0@ED1K…

Hi Mario,

Mario Charest <> mcharest@zinformatic.com> > wrote in article
9kp4dn$7ub$> 1@inn.qnx.com> >…


If the port is disable in the BIOS then it should work.


I quite agree with you. It’s only attempt to do it without disabling > :wink:

The problem is that electricaly ISA isn’t meant to share interrupt. So
unless the interrupt line is left floating you may run into problem.
By disabling interrupt in the parallel port chip you only tell it to
not generate interrupt and not to disconnect from the interrupt
line which is usually done within the chipset.

All this doesn’t have anything to do with QNX though :wink:
If you can do it in DOS I don’t see why you couldn’t do it
with QNX.

Why I can not disable parallel port’s interrupts in my program
(bit d4 in port 0x37a for LPT1) in order to use this line for my card?

Are you sure writting to this bit is all that is required to disable
interrupts?

Not all interrupts! Only INT 0x0f (IRQ7) from LPT1, I’m pretty sure, it is
parallel port hardware.

Sorry I meant interrupt not interrupts (what a difference a single letter
can do)

I understood you were doing some testing right? If you are running
program that are accessing the parallel port you have to
make sure devc-par is not running.

Thank you for hint. No, I was not doing any tests yet. Maybe, anybody else
in our company, I don’t know > :wink:> . I deal with DSP-based controllers, and
some my programs talk with those controllers via LPT or COM ports. I am
going to do test in QNX, but only after I’ll finish my current project
(it’s fully DSP’s assembler).


You cannot. This is not how QNX works. The philosophy is different.
That is how most multi-tasking realtime os works.


I heard in NT the same philosophy > :wink:> .

In NT things would get even more complex as writting a program that
talks to hardwares requires quite a bit of setup.

Thank you very much,
Best wishes,
Eduard.

Hi Mario,

Mario Charest <mcharest@zinformatic.com> wrote in article
<9kpaie$bk9$1@inn.qnx.com>…

[snip]



The problem is that electricaly ISA isn’t meant to share interrupt. So
unless the interrupt line is left floating you may run into problem.
By disabling interrupt in the parallel port chip you only tell it to
not generate interrupt and not to disconnect from the interrupt
line which is usually done within the chipset.

The conversation with erudite man is a nice thing :wink:
If my memory serves me the open collector circuit sets IRQ request signal
at ISA bus. So, if hardware satesfies requirements of ISA, I can not see
cause for trouble.
I think LPT’s IRQ line is not directly connected to IRQ7 pin at the bus as
well.

All this doesn’t have anything to do with QNX though > :wink:

I agree :wink:

If you can do it in DOS I don’t see why you couldn’t do it
with QNX.

I was wondering how can I do it with QNX :wink:. Exact how can I write my own
ISR for hardware interrupt. I heard there are no differences between driver
and ordinary program in QNX, but it is recomended to use resource manager.
If I have no ability to “drown” standard ISR, how can I use my own ISR?
There are all standard system’s ISR in ROM BIOS. BIOS initializes vector
table during start up. Does QNX reinit vector tables? What is state of the
table after reinit? QNX seems to do not use BIOS’s keyboard interrupt (INT
0x09, IRQ1).When and how does QNX driver set own ISR if it has
InterruptAttach() only and BIOS has setted standard ISR for this vector?
Are two ISRs runnig while I press down or up key? :wink: It is absurd.

It will be nice if you point me any source and documents which include
clearly explanation about questions above.

Thank you very much,
Eduard.

“Eduard Kromskoy” <ed1k@yahoo.com> wrote in message
news:01c120ae$08632c40$396fa8c0@ED1K…

Hi Mario,

Mario Charest <> mcharest@zinformatic.com> > wrote in article
9kpaie$bk9$> 1@inn.qnx.com> >…


If you can do it in DOS I don’t see why you couldn’t do it
with QNX.


I was wondering how can I do it with QNX > :wink:> . Exact how can I write my own
ISR for hardware interrupt. I heard there are no differences between
driver
and ordinary program in QNX, but it is recomended to use resource manager.

The resource manager is a framework to help your driver be
POSIX compliant and hopefully provide a more generice interface
(open/read/write). Note that an ordinary program can be a resource
manager as well.

If I have no ability to “drown” standard ISR, how can I use my own ISR?

I’m not sure what you mean by drown.

There are all standard system’s ISR in ROM BIOS. BIOS initializes vector
table during start up. Does QNX reinit vector tables? What is state of the
table after reinit? QNX seems to do not use BIOS’s keyboard interrupt (INT
0x09, IRQ1).When and how does QNX driver set own ISR if it has
InterruptAttach() only and BIOS has setted standard ISR for this vector?
Are two ISRs runnig while I press down or up key? > :wink: > It is absurd.

When QNX start it takes over the BIOS (it’s possible to run QNX on
a PC without the BIOS). QNX doesn’t share vector with BIOS, it
overtake them. Once QNX is started you can forget about the BIOS.

The kernel takes care of setting up interrupt vector. With the keyboard
example, the devc-con driver is responsible for handling the keyboard
and it will do an InterruptAttach.

The difference with QNX and DOS in this regard is that your program
are not attaching a handler to the vector directly, only the kernel
can do that. What happen when you call InterruptAttach is you tell
the kernel to call your handler when there is an interrupt. The kernel
has to handle all interrupt first before calling driver handler. The reason
is that the system uses virtual memory so some stuff need to be
properly set before your handler can run.

In a nut shell driver/application are not taking over vector. They are
registering with the kernel to have their handler called. The kernel
is responsible with dealing with hardware details, hence this help
makes the code portable and attemps to abstract the hardware
to some degree. Since InterruptAttach talks to the kernel you
don’t even care about vectors. Other CPU like MIPS, PowerPC,
SH3 may have totaly different way of dealing with hardware
interrupt, vector and such. This is all taken care of by the kernel.

\

  • Mario


It will be nice if you point me any source and documents which include
clearly explanation about questions above.

The cvs.qnx.com repository contains source code of some of QNX6 component.
You can also download some driver DDK and see how they handle interrupts.

Thank you very much,
Eduard.

Hi Mario,

Mario Charest <mcharest@zinformatic.com> wrote in article
<9ktttd$6v6$1@inn.qnx.com>…

I’m not sure what you mean by drown.

I mean overwrite vector in the vectors table and don’t care about previous
handler. Do not attach ISR, but change ISR at all. I see I can’t do it in
QNX.

When QNX start it takes over the BIOS (it’s possible to run QNX on
a PC without the BIOS). QNX doesn’t share vector with BIOS, it
overtake them. Once QNX is started you can forget about the BIOS.

Ok, but my system has BIOS. As I understood QNX rewrites interrupts table
during start up, and puts its own vectors for hardware interrupts. I know
multi platforms are supported by QNX and I believe when image is created
the mkifs take care about appropriate to platform code is included.

Do you mean I can not use system’s real-time clock ICs with QNX? I mean not
periodic interrupt INT 0x1c (IRQ8), I hope QNX allows to use periodic
interrupt. I am about real time clock alarm. I often used my own handler
for INT 0x4a in DOS for seldom or/and non-periodical interrupt at knowen
times. Or QNX has C function “call me at this time”?

In a nut shell driver/application are not taking over vector. They are

Excuse my ignorance, what is nut shell and where it is in QNX?
Or it is only an example of hardware independence?

registering with the kernel to have their handler called. The kernel
is responsible with dealing with hardware details, hence this help
makes the code portable and attemps to abstract the hardware
to some degree. Since InterruptAttach talks to the kernel you
don’t even care about vectors. Other CPU like MIPS, PowerPC,
SH3 may have totaly different way of dealing with hardware

IMHO I must know hardware in details in order to write ISR for hardware
interrupt. I think you are about the same hardware but on different
platforms.

interrupt, vector and such. This is all taken care of by the kernel.

The cvs.qnx.com repository contains source code of some of QNX6
component.

Unfortunately I have access to internet only from Windows box. CVS looks
not very well in browser. But it is possible to download some stuff :slight_smile:.
And very many drivers are not included in CVS.

Thank you very much,
Eduard.

“Eduard Kromskoy” <ed1k@yahoo.com> wrote in message
news:01c120de$63d33860$396fa8c0@ED1K…

Hi Mario,

Mario Charest <> mcharest@zinformatic.com> > wrote in article
9ktttd$6v6$> 1@inn.qnx.com> >…

I’m not sure what you mean by drown.

I mean overwrite vector in the vectors table and don’t care about previous
handler. Do not attach ISR, but change ISR at all. I see I can’t do it in
QNX.

You cannot and must not overwrite vector. If you don’t want other software
to own this interrupt, just make sure they don’t run :wink:

Do you mean I can not use system’s real-time clock ICs with QNX? I mean
not
periodic interrupt INT 0x1c (IRQ8), I hope QNX allows to use periodic
interrupt.

Sure you use InterruptAttach() and specify IRQ 8.

I am about real time clock alarm. I often used my own handler
for INT 0x4a in DOS for seldom or/and non-periodical interrupt at knowen
times. Or QNX has C function “call me at this time”?

Yes there are many ways to do this, it’s called timer and pulse.

In a nut shell driver/application are not taking over vector. They are

Excuse my ignorance, what is nut shell and where it is in QNX?

LOL, a “nut shell” is an english expression that means to sumarize, to
make a statement in a few words. I’m french and I’m trying to sound
as english as possible, hence I’m using these expression :wink: Sorry
for the confusion.

Or it is only an example of hardware independence?

Well of you think of a nut (like in peanut) as hardware I guess you could ,

lol!

registering with the kernel to have their handler called. The kernel
is responsible with dealing with hardware details, hence this help
makes the code portable and attemps to abstract the hardware
to some degree. Since InterruptAttach talks to the kernel you
don’t even care about vectors. Other CPU like MIPS, PowerPC,
SH3 may have totaly different way of dealing with hardware

IMHO I must know hardware in details in order to write ISR for hardware
interrupt. I think you are about the same hardware but on different
platforms.

You must know about the hardware you written about but you don’t HAVE to
know (though is preverable) about how interrupt are handle. I’m happy
to not have to deal with take over vector and calling the “previous” handler
myself (which you could do with QNX since every program have their
own virtual address space).

interrupt, vector and such. This is all taken care of by the kernel.

The cvs.qnx.com repository contains source code of some of QNX6
component.

Unfortunately I have access to internet only from Windows box. CVS looks
not very well in browser. But it is possible to download some stuff > :slight_smile:> .

CVS is available for Windows.

And very many drivers are not included in CVS.

Thank you very much,
Eduard.

Hi Mario,

Mario Charest <mcharest@zinformatic.com> wrote in article
<9ku71m$c77$1@inn.qnx.com>…

Yes there are many ways to do this, it’s called timer and pulse.

Can I be sure it uses my system’s hardware RTC? I think it does not. I can
use timers in Windows (sorry :wink:, it’s only example), but perfomance is
different. When I use RTC alarm I just set alarm time in hardware
registers. When current time equal the alarm time, RTC hardware generates
INT 0x4a. It works fast (and does not disturb another processes) even on
slow i386.

LOL, a “nut shell” is an english expression that means to sumarize, to

Thanks for explanation. I’m ukrainian and my English is very bad :frowning:
By the way, what’s LOL? :wink:

You must know about the hardware you written about but you don’t HAVE to
know (though is preverable) about how interrupt are handle.

Sorry, I must know the interrupt line number in the system and how much
time it takes to pass control to my handler (maybe, useless to serve
interrupt if this time more than given)

CVS is available for Windows.

cvs utility for Windows!? Is it free? Where I can get it?

Thank you very much,
Eduard.

“Eduard Kromskoy” <ed1k@yahoo.com> wrote in message
news:01c120ea$782c74a0$396fa8c0@ED1K…

Hi Mario,

Mario Charest <> mcharest@zinformatic.com> > wrote in article
9ku71m$c77$> 1@inn.qnx.com> >…

Yes there are many ways to do this, it’s called timer and pulse.

Can I be sure it uses my system’s hardware RTC? I think it does not.

No it doesn’t.

I can
use timers in Windows (sorry > :wink:> , it’s only example), but perfomance is
different.

That’s the case for QNX as well.

When I use RTC alarm I just set alarm time in hardware
registers. When current time equal the alarm time, RTC hardware generates
INT 0x4a. It works fast (and does not disturb another processes) even on
slow i386.

You can do the same with QNX. However it will disturb other processes
but not enough so that you care (some other people may care).

In general people use OS support first (for timer an alarm for example),
and only if it doesn’t met their requirement will go directly to hardware.

You want to make your life easier by using the OS features first.
Of course in your case you seems to have more experience dealing
directly with DOS, so that is probably why your first reflexe is
to deal directly with the hardware. That is not what people
do in general with an OS such as QNX. For example the RTC hardware,
what if you want 10 program to be notify of an alarm, you can’t since
the hardware can only deal with one alarm at a time. OS services
will deal with all of that. So if you are the only programming and
know only one program is going to access RTC that fine. But if
there are 10 programmers it might be preferable to use
OS services without have to bother will hardware usage.
It all depends, fortunately you are in control and can use
whatever method fit your requirement.

LOL, a “nut shell” is an english expression that means to sumarize, to

Thanks for explanation. I’m ukrainian and my English is very bad > :frowning:

You should see some of my post. I often have a hard time
understanding what I wrote :wink:

By the way, what’s LOL? > :wink:

It’s an acronym for Laughing Out Loud.

You must know about the hardware you written about but you don’t HAVE to
know (though is preverable) about how interrupt are handle.

Sorry, I must know the interrupt line number in the system
and how much time it takes to pass control to my handler
(maybe, useless to serve interrupt if this time more than given)

It will take more time then DOS that’s for sure. There is only
one way to know the time and it’s to try and measure it.

CVS is available for Windows.


cvs utility for Windows!? Is it free? Where I can get it?

http://www.cvsgui.org/

I never tried it myself though.

Thank you very much,

My pleasure!

Eduard.

Hi Mario,

Mario Charest <mcharest@zinformatic.com> wrote in article

but perfomance is different.

That’s the case for QNX as well.

I do not wish to grieve you. I’m novice in QNX, so I can do something
wrong. But GUI’s front end (Photon) of QNX seems to be slowly than NT at
the same hardware. I have chaotic mouse events in Photon, and I have a list
Photon’s application which “moves my mouse to madness”. There are pfm,
shelf (both badly in 6.0 release), helpview and package manager (badly in
6.1 release) in the list. I repeat, I’m familiar with NT, but I’m fully
newbie in QNX.

In general people use OS support first (for timer an alarm for example),
and only if it doesn’t met their requirement will go directly to
hardware.

Some years ago (I was working with other R&D company) I was responsible for
software support of station for meteorological spacecraft NOAA series. The
data stream ran through interface card (DMA chanel and IRQ as well) and
program received those data, looked through data for bit- and frame
synchronization, saved them to disk, drew picture on the screen… We had
no other way to solve it on 286 PC/AT. Of course, we did not hear about QNX
:wink: QNX seems to be pretty good for that task. In fact, good bye half of
DOS as soon as our program runs.
Finally, our client requested Windows 3.1 and 386 PC/AT.

You want to make your life easier by using the OS features first.

I know. That’s why I installed QNX as soon as I’ve heard about free QNX
stuff. QNX seems to take care about many things. It is nice. For example, I
wrote my memory allocation function in order to get memory on page boundary
in DOS. I know, QNX does it for me :wink:.

Of course in your case you seems to have more experience dealing
directly with DOS, so that is probably why your first reflexe is
to deal directly with the hardware.

I have realtime task and I must solve it. That’s all :wink:

what if you want 10 program to be notify of an alarm, you can’t since
the hardware can only deal with one alarm at a time.

I can :wink:. I should write something like cron (or NT’s at) that will use
single RTC alarm :wink:.

there are 10 programmers it might be preferable to use

I fully agree. QNX and its services are preferable way for complex and
really big projects.

It’s an acronym for Laughing Out Loud.

Thanks a lot.
Just for fun russian short story in my translation (sorry, if
incomprehensible :wink:)):

Friends explained to lamer what the acronym RTFM means. “What kind of
relationship…?” was thinking lamer, but he had bought “Kamasutra”.

It will take more time then DOS that’s for sure. There is only
one way to know the time and it’s to try and measure it.

On my mind it is a bad way. I wish to know maximal time in system. I have
read the interrupt latency in QNX for different CPU. As far I can remember
I was doing it under QNX 4 demo floppy (that was included in floppy image),
but I can not find any information for QNX RTP. And I wish to change/rotate
interrupts priority (I have read in newsgroup that is able in QNX4, but it
does not support in QNX6).
Exact I wish to have a bit more documentation, and function to set my
handler (I’ve got it), and function to set interrupt priority.

http://www.cvsgui.org/

I never tried it myself though.

Thanks! I’ve downloaded it. I will try it and reply as soon as possible.

Thank you very much,
Eduard.