PDA

View Full Version : Array and IF - THEN



Gusse
- 22nd January 2010, 18:42
I tried to search info about how to handle input strings (arrays) and do selections based on what was received to an array, but not so good success. Most probably I don't know what are the right key words..., but anyway.
Below is sample code, which is very similar that I have in the program. Only difference is that I use 6 bytes instead of 4. Code is working OK.

Question is, can I do this more sophisticated way?
I have lots of similar IF - THEN and I really want to know if there would be a more simple way to do this.


<code><font color="#000000">LED <b>VAR </b>PortB.0
Data_Array <b>VAR BYTE </b>[4]

Mainloop:
<b>DEBUGIN </b>1000, Mainloop, [<b>STR </b>Data_Array\4]
<b>IF </b>Rele_Array[0] = <font color="#FF0000">&quot;A&quot; </font><b>THEN
IF </b>Rele_Array[1] = <font color="#FF0000">&quot;B&quot; </font><b>THEN
IF </b>Rele_Array[2] = <font color="#FF0000">&quot;C&quot; </font><b>THEN
IF </b>Rele_Array[3] = <font color="#FF0000">&quot;1&quot; </font><b>THEN
HIGH </b>LED <font color="#000080"><i>'If received ABC1
</i></font><b>PAUSE </b>1000 <font color="#000080"><i>'then turn LED on
</i></font><b>LOW </b>LED <font color="#000080"><i>'for 1s and return
</i></font><b>GOTO </b>Mainloop <font color="#000080"><i>'to Mainloop
</i></font><b>ENDIF
IF </b>Rele_Array[3] = <font color="#FF0000">&quot;2&quot; </font><b>THEN
HIGH </b>LED <font color="#000080"><i>'If received ABC2
</i></font><b>PAUSE </b>2000 <font color="#000080"><i>'then turn LED on
</i></font><b>LOW </b>LED <font color="#000080"><i>'for 2s and return
</i></font><b>GOTO </b>Mainloop <font color="#000080"><i>'to Mainloop
</i></font><b>ENDIF
ENDIF
ENDIF
ENDIF

END

</b></code>

BR,
-Gusse-

Bruce
- 22nd January 2010, 20:09
LED VAR PortB.0
Dat VAR BYTE

Mainloop:
DEBUGIN 1000, Mainloop, [WAIT("ABC"),Dat]
Dat=Dat-48
HIGH LED
PAUSE Dat * 1000
LOW LED
GOTO Mainloop
END

Gusse
- 22nd January 2010, 20:53
Thanks Bruce, but what if I have several different prefixes?

1) ABC1, ABC2, etc...
2) DEF1, DEF2, etc...
3) GHI1, GHI2, etc...
4) etc...

I cannot wait only "ABC", but basically whatever I might have in the code.

BR,
-Gusse-

Bruce
- 22nd January 2010, 21:08
If you have several different prefixes, then you're stuck checking the 1st 3 bytes
pretty much like in your original example.

Gusse
- 22nd January 2010, 21:25
Thanks Bruce!

I'll continue to use IF - THENs. This is probably something that could be placed to "PBP Wish List" if it would be benefit also someone else.

BR,
-Gusse-

Darrel Taylor
- 22nd January 2010, 22:44
If you have PBP 2.60, you might do something like this ...
LED VAR PortB.0
CmdIdx VAR BYTE
Data_Array VAR BYTE[4]
CmdString VAR BYTE[3]

;--- Subroutine to parse commands -----------------------------
Parse:
FOR CmdIdx = 0 to 3
SELECT CASE CmdIdx
CASE 0 : ARRAYWRITE CmdString,["ABC"]
CASE 1 : ARRAYWRITE CmdString,["DEF"]
CASE 2 : ARRAYWRITE CmdString,["GHI"]
CASE 3 : ARRAYWRITE CmdString,["JKL"]
END SELECT
ARRAYREAD Data_Array,3,NoCmd,[WAITSTR CmdString\3]
ON CmdIdx GOTO cmd_ABC, cmd_DEF, cmd_GHI, cmd_JKL ; found cmd
NoCmd:
NEXT CmdIdx
; if it gets here no commands were found
RETURN

cmd_ABC:
SELECT CASE Data_Array[3]
CASE "1"
HIGH LED 'If received ABC1
PAUSE 1000 'then turn LED on
LOW LED 'for 1s and return
CASE "2"
HIGH LED 'If received ABC2
PAUSE 2000 'then turn LED on
LOW LED 'for 2s and return
END SELECT
RETURN

cmd_DEF:

RETURN

cmd_GHI:

RETURN

cmd_JKL:

RETURN

Gusse
- 22nd January 2010, 23:35
Hi Darrel,

At the moment I don't have PBP2.60, still working with 2.50c.
I was wondering what is benefit to upgrade to 2.60, but now I see it clearly :)
This parse script is something new and ARRAYREAD -function is great.

So in Mainloop, after DEBUGIN, I should call parse? Sounds so easy!

<code><font color="#000000">Mainloop:
<b>DEBUGIN </b>1000, Mainloop, [<b>STR </b>Data_Array\4]
<b>GOSUB </b>Parse
<b>GOTO </b>Mainloop
<b>END </b></code>

PBP 2.60 will definitely be on my "Wish List". :cool:

BR,
-Gusse-

Charles Linquis
- 23rd January 2010, 03:27
Darrel,

Perfect!

I was just in the process of writing my own routines to do the same thing.
I was comparing element 1 in an array with every element in the second array, then element 2 in the first array against every element in the second. If I found a match, I would increment the pointers to both arrays and compare again.
What a mess that was!

Of course, your routine is better/faster/smaller.

Thanks!

Darrel Taylor
- 23rd January 2010, 05:03
So in Mainloop, after DEBUGIN, I should call parse? Sounds so easy!
You got it! And hopefully it is...


I was just in the process of writing my own routines to do the same thing.

I was working on a NMEA sentence parser, and Gusse's problem seemed to fit right in.

I may have killed 3 birds with one stone :eek:

Hope it works,

Gusse
- 25th February 2010, 12:52
You got it! And hopefully it is...


I was working on a NMEA sentence parser, and Gusse's problem seemed to fit right in.

I may have killed 3 birds with one stone :eek:

Hope it works,

Now I can confirm that Darrel's code is working well.
Thank You very much!

BR,
-Gusse-