Home
JAQForum Ver 20.06
Log In or Join  
Active Topics
Local Time 16:14 16 May 2024 Privacy Policy
Jump to

Notice. New forum software under development. It's going to miss a few functions and look a bit ugly for a while, but I'm working on it full time now as the old forum was too unstable. Couple days, all good. If you notice any issues, please contact me.

Forum Index : Microcontroller and PC projects : GUI BITMAP issues

Author Message
Intellecta
Newbie

Joined: 07/05/2016
Location: Australia
Posts: 22
Posted: 03:42pm 11 Oct 2016
Copy link to clipboard 
Print this post

Dear members
Trying to use the BITMAP command to make some custom symbols for a data logging example we are developing for schools - MM28/screen/RTC/EEPROM/18b20 etc.
The bitmap option looks interesting but I have been unable to get anything to show on the screen.
I have tried binary integer representation as a good way to show the bitmap with no success.
Trolled through the examples and good not find a good piece of code to assist/emulate.

An assistance would be appreciated.
Thanks
Tony Pugatschew





option explicit
option base 1
dim Integer IMAGEBITS(8) = (1, 1, 1, 2, 3, 4, 5, 6)
' tried &b00000001 etc
' Just show something - imagebits is not real symbol at this time
do
gui bitmap 50, 50, IMAGEBITS , 8, 8, 1, rgb(cyan), rgb(blue)


Get errors such as indefined array
loop
 
TassyJim

Guru

Joined: 07/08/2011
Location: Australia
Posts: 5923
Posted: 04:03pm 11 Oct 2016
Copy link to clipboard 
Print this post

You can't use an array for the bitmap.
The easiest way is to see what you are doing is to use a string.
For 8 bytes a 64 bit integer is also OK once you have the data worked out.
  Quote  
OPTION EXPLICIT
OPTION BASE 1
DIM STRING IMAGEBITS = CHR$(1)+CHR$(1)+CHR$(1)+CHR$(2)+CHR$(3)+CHR$(4)+CHR$(5)+CHR$(6)

' tried &b00000001 etc
' Just show something - imagebits is not real symbol at this time
DO
gui bitmap
50, 50, IMAGEBITS , 8, 8, 1, rgb(cyan), rgb(blue)


'Get errors such as indefined array
LOOP


using integers:
  Quote  
DIM INTEGER IMAGEBITS = &h01010102030405



Jim
Edited by TassyJim 2016-10-13
VK7JH
MMedit   MMBasic Help
 
Intellecta
Newbie

Joined: 07/05/2016
Location: Australia
Posts: 22
Posted: 09:24pm 11 Oct 2016
Copy link to clipboard 
Print this post

Dear Jim,
Thanks for the feedback and the solution. Works a charm!!.
Maybe this example should be added to the manual for future references.

Will start to write some examples for the MM28 for our school program. As usual we are facing issues regarding visual programming versus text entry. Luckily the Australian curriculum supports text entry for years 7 and above.
I sort of like the picaxe flow chart entry to support the development of programming skills. We can abstract the details for some mm commands and look at subroutines etc.
Jim , thanks again. Where are you in Tasmania?
We will be in Strahan for two weeks from Sunday and you are most welcome for a cuppa etc.

Tony Pugatschew

Ps. We developed a MM28 board with on board cp2102 controller to prevent loss of adapters in the class. On board 5V regulator, 3.3V regulator, USB A connector to prevent SMD parts being ripped off. Bring our more 5V, GND, VIN lines etc.
Cannot make it idiot proof but doing aggressive design.
 
TassyJim

Guru

Joined: 07/08/2011
Location: Australia
Posts: 5923
Posted: 10:26am 12 Oct 2016
Copy link to clipboard 
Print this post

  Intellecta said  
Jim , thanks again. Where are you in Tasmania?
We will be in Strahan for two weeks from Sunday and you are most welcome for a cuppa etc.

Tony Pugatschew


Hopefully the weather has improved a bit in Strahan by then.

I am in hills behind Burnie. One degree this morning. Lucky the wind had dropped a bit.

Jim
VK7JH
MMedit   MMBasic Help
 
paceman
Guru

Joined: 07/10/2011
Location: Australia
Posts: 1329
Posted: 01:28am 29 Jan 2017
Copy link to clipboard 
Print this post


Jim, bringing up this thread from last Oct. here, but when you said that for the basic graphics GUI BITMAP command:

  TassyJim said   You can't use an array for the bitmap.
The easiest way is to see what you are doing is to use a string.
For 8 bytes a 64 bit integer is also OK once you have the data worked out.

does this mean that if using an integer variable (64 bit) it can at maximum provide the data for the default 8x8 bitmap, (or 16x4, 32x2 or 64x1)?

If so then a bigger bitmap, say 32x32, would presumably have to be specified using a string variable with the 'normal' size (also the maximum size) of 256 bytes and this 256 bytes then defines the maximum size of bitmap that can be specified.

I'm having trouble working this command out - could you show me the string that would need to be used for a 32x32 'simple' bitmap e.g. a diagonal line or something please. Also,is there a utility to produce appropriate strings from a bitmap grid that you know of?

Greg
 
matherp
Guru

Joined: 11/12/2012
Location: United Kingdom
Posts: 8601
Posted: 01:59am 29 Jan 2017
Copy link to clipboard 
Print this post

A 32x32 bitmap will need a string of length 128 (32x32/8)
and each line will take 4 bytes

For simplicity of understanding define the string as follows:

l1$=chr$(&B10000000)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)
l2$=chr$(&B01000000)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)
l3$=chr$(&B00100000)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)
......
l32$=chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000001)

bitmap$=l1$+l2$+l3$+.....+l32$

gui bitmap 0,0,bitmap$,32,32


and you should get a diagonal line from 0,0 to 31,31



 
paceman
Guru

Joined: 07/10/2011
Location: Australia
Posts: 1329
Posted: 03:24am 29 Jan 2017
Copy link to clipboard 
Print this post

Great, thanks Peter. It definitely does do exactly as you said and I think I understand now - thanks a lot. Converting a bitmap (of say a valve symbol or pump or some-such) to the byte string list is going to be a bit of a pain though unless there's a utility like Jim's FontTweak for it.

Here's the code for anyone else who wants to try it - just remove the REM quote on the second line of the 'bitmap$=...' before you try it though.

I guess that also means the maximum square grid we can use is 40x40 ??, i.e. closest multiple of 8 to the sq.rt.of 2048 - is that right?

Greg

l1$=chr$(&B10000000)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)
l2$=chr$(&B01000000)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)
l3$=chr$(&B00100000)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)
l4$=chr$(&B00010000)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)
l5$=chr$(&B00001000)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)
l6$=chr$(&B00000100)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)
l7$=chr$(&B00000010)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)
l8$=chr$(&B00000001)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)
l9$=chr$(&B00000000)+chr$(&B10000000)+chr$(&B00000000)+chr$(&B00000000)
l10$=chr$(&B00000000)+chr$(&B01000000)+chr$(&B00000000)+chr$(&B00000000)
l11$=chr$(&B00000000)+chr$(&B00100000)+chr$(&B00000000)+chr$(&B00000000)
l12$=chr$(&B00000000)+chr$(&B00010000)+chr$(&B00000000)+chr$(&B00000000)
l13$=chr$(&B00000000)+chr$(&B00001000)+chr$(&B00000000)+chr$(&B00000000)
l14$=chr$(&B00000000)+chr$(&B00000100)+chr$(&B00000000)+chr$(&B00000000)
l15$=chr$(&B00000000)+chr$(&B00000010)+chr$(&B00000000)+chr$(&B00000000)
l16$=chr$(&B00000000)+chr$(&B00000001)+chr$(&B00000000)+chr$(&B00000000)
l17$=chr$(&B00000000)+chr$(&B00000000)+chr$(&B10000000)+chr$(&B00000000)
l18$=chr$(&B00000000)+chr$(&B00000000)+chr$(&B01000000)+chr$(&B00000000)
l19$=chr$(&B00000000)+chr$(&B00000000)+chr$(&B00100000)+chr$(&B00000000)
l20$=chr$(&B00000000)+chr$(&B00000000)+chr$(&B00010000)+chr$(&B00000000)
l21$=chr$(&B00000000)+chr$(&B00000000)+chr$(&B00001000)+chr$(&B00000000)
l22$=chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000100)+chr$(&B00000000)
l23$=chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000010)+chr$(&B00000000)
l24$=chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000001)+chr$(&B00000000)
l25$=chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B10000000)
l26$=chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B01000000)
l27$=chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B00100000)
l28$=chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B00010000)
l29$=chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B00001000)
l30$=chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000100)
l31$=chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000010)
l32$=chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000000)+chr$(&B00000001)

bitmap$=l1$+l2$+l3$+l4$+l5$+l6$+l7$+l8$+l9$+l10$+l11$+l12$+l13$+l14$+l15$+l16$
'+l17$+l18$+l19$+l20$+l21$+l22$+l23$+l24$+l25$+l26$+l27$+l28$+l29$+l30$+l31$+l32$

gui bitmap 0,0,bitmap$,32,32
 
robert.rozee
Guru

Joined: 31/12/2012
Location: New Zealand
Posts: 2294
Posted: 03:44am 29 Jan 2017
Copy link to clipboard 
Print this post

note that those 32 strings will consume in excess of 8k of RAM if they are the default length of 255 characters; in some applications this may be an issue.

a more 'economical' approach would be to use an array of strings:


Dim L$(32) length 4
L$(1)=chr$(&B10000000)+...
...
L$(32)=...+chr$(&B00000001)

bitmap$=""
for I=1 to 32
bitmap$=bitmap$+L$(I)
next I


or you could place the bitmap numbers into DATA statements, which could then be read and poked into the string.


cheers,
rob :-)Edited by robert.rozee 2017-01-30
 
paceman
Guru

Joined: 07/10/2011
Location: Australia
Posts: 1329
Posted: 11:48am 29 Jan 2017
Copy link to clipboard 
Print this post

Yes, good point Robert - your example above is nice and straightforward. It'd be a good example for Geoff to expand his explanation on page 20 of the 'standard' Micromite Manual.

Greg
 
TassyJim

Guru

Joined: 07/08/2011
Location: Australia
Posts: 5923
Posted: 06:16pm 29 Jan 2017
Copy link to clipboard 
Print this post

  paceman said  Converting a bitmap (of say a valve symbol or pump or some-such) to the byte string list is going to be a bit of a pain though unless there's a utility like Jim's FontTweak for it.


  Quote  
' heartx.bas
mYBm$ = ""
mYBm$ = mYBm$+
CHR$(3)+CHR$(240)+CHR$(15)+CHR$(192)+CHR$(15)+CHR$(248)+CHR$(31)
mYBm$ = mYBm$+
CHR$(240)+CHR$(31)+CHR$(254)+CHR$(127)+CHR$(248)+CHR$(63)+CHR$(254)
mYBm$ = mYBm$+
CHR$(127)+CHR$(252)+CHR$(127)+CHR$(255)+CHR$(255)+CHR$(254)+CHR$(127)
mYBm$ = mYBm$+
CHR$(255)+CHR$(255)+CHR$(254)+CHR$(255)+CHR$(255)+CHR$(255)+CHR$(255)
mYBm$ = mYBm$+
CHR$(255)+CHR$(255)+CHR$(255)+CHR$(255)+CHR$(255)+CHR$(255)+CHR$(255)
mYBm$ = mYBm$+
CHR$(255)+CHR$(255)+CHR$(255)+CHR$(255)+CHR$(255)+CHR$(255)+CHR$(255)
mYBm$ = mYBm$+
CHR$(255)+CHR$(255)+CHR$(255)+CHR$(255)+CHR$(255)+CHR$(255)+CHR$(255)
mYBm$ = mYBm$+
CHR$(255)+CHR$(255)+CHR$(255)+CHR$(127)+CHR$(255)+CHR$(255)+CHR$(254)
mYBm$ = mYBm$+
CHR$(127)+CHR$(255)+CHR$(255)+CHR$(254)+CHR$(127)+CHR$(255)+CHR$(255)
mYBm$ = mYBm$+
CHR$(252)+CHR$(63)+CHR$(255)+CHR$(255)+CHR$(252)+CHR$(31)+CHR$(255)
mYBm$ = mYBm$+
CHR$(255)+CHR$(248)+CHR$(31)+CHR$(255)+CHR$(255)+CHR$(240)+CHR$(15)
mYBm$ = mYBm$+
CHR$(255)+CHR$(255)+CHR$(224)+CHR$(7)+CHR$(255)+CHR$(255)+CHR$(224)
mYBm$ = mYBm$+
CHR$(3)+CHR$(255)+CHR$(255)+CHR$(192)+CHR$(1)+CHR$(255)+CHR$(255)
mYBm$ = mYBm$+
CHR$(0)+CHR$(0)+CHR$(255)+CHR$(254)+CHR$(0)+CHR$(0)+CHR$(127)+CHR$(252)
mYBm$ = mYBm$+
CHR$(0)+CHR$(0)+CHR$(63)+CHR$(248)+CHR$(0)+CHR$(0)+CHR$(31)+CHR$(240)
mYBm$ = mYBm$+
CHR$(0)+CHR$(0)+CHR$(15)+CHR$(240)+CHR$(0)+CHR$(0)+CHR$(7)+CHR$(224)
mYBm$ = mYBm$+
CHR$(0)+CHR$(0)+CHR$(3)+CHR$(192)+CHR$(0)+CHR$(0)+CHR$(1)+CHR$(128)
mYBm$ = mYBm$+
CHR$(0)+CHR$(0)+CHR$(1)+CHR$(128)+CHR$(0)
' End Define bitmap

GUI BITMAP 0,0,myBm$,32,32



Would something like that do?

Create your image in FontTweak at the required size.
In the file menu, select "save char as GUI bitmap string"

Paste resulting file into your program

This version of FontTweak needs more work so use carefully.
I haven't updated the help file yet and there are no sanity checks.
2017-01-30_041546_FontTweak.zip

Jim

VK7JH
MMedit   MMBasic Help
 
paceman
Guru

Joined: 07/10/2011
Location: Australia
Posts: 1329
Posted: 02:49am 30 Jan 2017
Copy link to clipboard 
Print this post

Great stuff Jim, now I just have to learn to draw!
I've been with the grandchildren all day so just got on to this. Didn't know you were such an old romantic - I wondered about a cupid for a reply but decided I couldn't make it cute enough.

How much trouble would it be to make the bitmap size variable - and rectangles as well as squares?

Here's one for you anyway.

Greg

EDIT: BTW how do you produce your nice coloured MMEdit output for the forum. I remember you posting about it earlier but I'm not sure what to search for: I'm sure it isn't 'magic'!

' JimsSmiley.bas
myBm$ = ""
myBm$ = myBm$+CHR$(128)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(64)+CHR$(0)+CHR$(112)+CHR$(0)
myBm$ = myBm$+CHR$(32)+CHR$(0)+CHR$(216)+CHR$(0)+CHR$(16)+CHR$(1)+CHR$(136)+CHR$(0)
myBm$ = myBm$+CHR$(8)+CHR$(1)+CHR$(0)+CHR$(0)+CHR$(4)+CHR$(1)+CHR$(0)+CHR$(0)+CHR$(2)
myBm$ = myBm$+CHR$(1)+CHR$(0)+CHR$(0)+CHR$(1)+CHR$(7)+CHR$(128)+CHR$(0)+CHR$(0)
myBm$ = myBm$+CHR$(156)+CHR$(112)+CHR$(0)+CHR$(0)+CHR$(112)+CHR$(28)+CHR$(0)+CHR$(0)
myBm$ = myBm$+CHR$(96)+CHR$(6)+CHR$(0)+CHR$(0)+CHR$(144)+CHR$(2)+CHR$(0)+CHR$(1)
myBm$ = myBm$+CHR$(136)+CHR$(3)+CHR$(0)+CHR$(1)+CHR$(4)+CHR$(1)+CHR$(128)+CHR$(3)
myBm$ = myBm$+CHR$(50)+CHR$(49)+CHR$(128)+CHR$(2)+CHR$(49)+CHR$(48)+CHR$(128)+CHR$(2)
myBm$ = myBm$+CHR$(0)+CHR$(128)+CHR$(128)+CHR$(3)+CHR$(1)+CHR$(65)+CHR$(128)+CHR$(3)
myBm$ = myBm$+CHR$(1)+CHR$(33)+CHR$(0)+CHR$(1)+CHR$(153)+CHR$(49)+CHR$(0)+CHR$(0)
myBm$ = myBm$+CHR$(140)+CHR$(106)+CHR$(0)+CHR$(0)+CHR$(199)+CHR$(198)+CHR$(0)+CHR$(0)
myBm$ = myBm$+CHR$(96)+CHR$(6)+CHR$(0)+CHR$(0)+CHR$(48)+CHR$(9)+CHR$(0)+CHR$(0)
myBm$ = myBm$+CHR$(28)+CHR$(112)+CHR$(128)+CHR$(0)+CHR$(3)+CHR$(192)+CHR$(64)+CHR$(0)
myBm$ = myBm$+CHR$(0)+CHR$(0)+CHR$(32)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(16)+CHR$(0)
myBm$ = myBm$+CHR$(0)+CHR$(0)+CHR$(8)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(4)+CHR$(0)+CHR$(0)
myBm$ = myBm$+CHR$(0)+CHR$(2)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(1)+CHR$(0)+CHR$(0)+CHR$(0)
myBm$ = myBm$+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)
myBm$ = myBm$+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)
myBm$ = myBm$+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)
myBm$ = myBm$+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)
myBm$ = myBm$+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)
myBm$ = myBm$+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)
myBm$ = myBm$+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)
myBm$ = myBm$+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)
' End Define bitmap
GUI BITMAP 0,0,myBm$,32,32
Edited by paceman 2017-01-31
 
TassyJim

Guru

Joined: 07/08/2011
Location: Australia
Posts: 5923
Posted: 11:44am 30 Jan 2017
Copy link to clipboard 
Print this post

  paceman said  
How much trouble would it be to make the bitmap size variable - and rectangles as well as squares?

EDIT: BTW how do you produce your nice coloured MMEdit output for the forum. I remember you posting about it earlier but I'm not sure what to search for: I'm sure it isn't 'magic'!


  Quote   myBm$ = ""
myBm$=myBm$+
CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(128)
myBm$=myBm$+
CHR$(0)+CHR$(6)+CHR$(1)+CHR$(192)+CHR$(0)+CHR$(204)+CHR$(0)
myBm$=myBm$+
CHR$(14)+CHR$(3)+CHR$(0)+CHR$(1)+CHR$(61)+CHR$(128)+CHR$(10)
myBm$=myBm$+
CHR$(2)+CHR$(255)+CHR$(11)+CHR$(6)+CHR$(240)+CHR$(14)+CHR$(3)
myBm$=myBm$+
CHR$(128)+CHR$(14)+CHR$(0)+CHR$(24)+CHR$(30)+CHR$(0)+CHR$(0)
myBm$=myBm$+
CHR$(0)+CHR$(0)+CHR$(7)+CHR$(227)+CHR$(192)+CHR$(0)+CHR$(0)
myBm$=myBm$+
CHR$(0)+CHR$(0)+CHR$(0)+CHR$(127)+CHR$(255)
' End Define bitmap
CLS
GUI BITMAP 0,0,myBm$,8,48


You can set the font size when you start a new font.

I will update FontTweak to add the GUI BITMAP code line but I will wait until the width and height order is fixed.

To get the coloured code, try "format for TBS" in the file menu. First, select the code you want to post or if no code is selected, the full program is copied into the clipboard ready to paste into your post.

I had the heart available from when I used it in a heart rate monitor.

Jim
VK7JH
MMedit   MMBasic Help
 
paceman
Guru

Joined: 07/10/2011
Location: Australia
Posts: 1329
Posted: 08:03pm 30 Jan 2017
Copy link to clipboard 
Print this post

  TassyJim said  
You can set the font size when you start a new font.

Ah, should have realized that - I wasn't really thinking of it as a font.

  Quote  I will update FontTweak to add the GUI BITMAP code line but I will wait until the width and height order is fixed.

Great - it would probably be worth adding FontTweak to the File menu in MMEdit as you've done with 'TFT Colour'. I think it would be worth adding the size of the bitmap to the filename comment line too. Otherwise it's not easy to know what size to specify in the GUI BITMAP command if the bitmap(s) were done previously. The one below is 16x16.

BTW, I didn't find a description of how to use the 'Format for TBS' in MMEdit's Help file; am I a bit blind or was it missed? I can do it now though.

Greg

  Quote  
' testX.bas
myBm$ = ""
myBm$ = myBm$+
CHR$(128)+CHR$(1)+CHR$(64)+CHR$(2)+CHR$(32)+CHR$(4)+CHR$(16)+CHR$(8)
myBm$ = myBm$+
CHR$(8)+CHR$(16)+CHR$(4)+CHR$(32)+CHR$(2)+CHR$(64)+CHR$(1)+CHR$(128)
myBm$ = myBm$+
CHR$(1)+CHR$(128)+CHR$(2)+CHR$(64)+CHR$(4)+CHR$(32)+CHR$(8)+CHR$(16)
myBm$ = myBm$+
CHR$(16)+CHR$(8)+CHR$(32)+CHR$(4)+CHR$(64)+CHR$(2)+CHR$(128)+CHR$(1)
myBm$ = myBm$
' End Define bitmap

Edited by paceman 2017-02-01
 
Print this page


To reply to this topic, you need to log in.

© JAQ Software 2024