PsiOn 1.4 Technical Guide ------------------------- THIS FILE IS DATED 2/Mar/97 I've had a number of requests for changes to the program which are useful functions in themselves, are a little too specialised or would push the size of the program up beyond a reasonable limit. This isn't a comprehensive list - I just jotted down the easier ones here. I'll TRY to keep it up-to-date and a copy of just this file will be posted on the web page http://www.hargreavesp.demon.co.uk Here are a couple of things you can do with PsiOn. You will need to be familiar with OPL to implement changes, and you'll need the source for PsiOn installed on your computer. A >> at the beginning of a line shows the line I'm getting you to change. ------------------------------------------------------------------- NEVER GIVE COPIES OF MODIFIED PsiOn CODE TO ANYONE !! Make sure you have a copy of the original PsiOn code somewhere, as you might find it difficult to debug if you haven't got anything to compare against. You MUST quit the existing running PsiOn before translating your version. If you don't then it will not translate. ------------------------------------------------------------------- 1. ALWAYS DO THIS CHANGE!!! Just do a replace on 1.4 and change 1.4 to 1.4Q. This way, if someone writes to me about a problem they have, if the version has a Q in it, I can ask for the source rather than me just wandering around in the dark. Thanks! ------------------------------------------------------------------- 2. Changing the Pause Time. Pause mode allows you to have PsiOn wait until 4am before re-enabling your password. Here is how you can change that time. Look for a section of code like this.... REM Check if agenda will need attn >> IF HOUR < 4 wakeagn% = 1: REM 1=go on alert, and always check time at ENDIF And change the HOUR value to another hour. For example 7 for 7am in the morning. Next look for this section of code REM Start pause if required, or cancel if not IF event%(1) = 624 OR event%(1) = %p :REM Psion-P (512 + 112 rearm& = srearm& :REM Restore default off time IF pause% = 0 pause% = 1 REM Work out what 04:00 is on the next day >> IF HOUR >= 4 SECSTODATE DATETOSECS(YEAR, MONTH, DAY, HOUR, MINUT ELSE SECSTODATE DATETOSECS(YEAR, MONTH, DAY, HOUR, MINUT ENDIF >> rearmtm& = DATETOSECS(event%(1), event%(2), event%(3), >> 4, 0, 0) :REM This is one line in the real source event%(1) = 0 CONTINUE :REM Around the while testevent again ENDIF :REM Pause = 0 ENDIF :REM Event = 624 And again, change the 4 to your new hour time. Now look for this last bit of code... REM See if agenda needs looking at IF currday% <> DAY wakeagn% = 1 :REM 1=check time on turn on ENDIF >> IF ((wakeagn% <> 0 AND HOUR >= 4) OR agn% = 3) AND agn% > 1 wakeagn% = 2 :REM 2=Display agenda ENDIF And again, change the 4 to your new hour time. Now translate and run. When you next use the Pause mode, it will wait for YOUR hour time and not 4am. ------------------------------------------------------------------- 3. Reduce the Size of PsiOn. Currently, PsiOn is 1 byte off 3k. You can reduce it by a lot (608 bytes) just by deleting one line of code! Look for the following code near the top of the program APP PsiOn EXT "ODB" PATH "\OPD" >> ICON "\OPL\PSI-ON.ICO" TYPE $1000 ENDA Remove the ICON line and re-translate. PsiOn will not have an icon anymore, just a box above it. I'd suggest to put it in a group list. ------------------------------------------------------------------- 4. Run PsiOn from the RunOPO icon only. You can reduce the total size of PsiOn by even more (648 bytes) by turning PsiOn into an OPO (just like "normal" translated programs). Look for those first lines again >> APP PsiOn >> EXT "ODB" >> PATH "\OPD" >> ICON "\OPL\PSI-ON.ICO" >> TYPE $1000 >> ENDA and just Delete them. When you retranslate, you'll have a Psi-on.opo in the OPO directory. Delete the copy of PsiOn you put into APP, and run PsiOn from the RunOPO icon. NOTE : You MUST use the Psion-X or Psion-Escape keys to quit PsiOn. If you ask it to quit using the System screen (delete or Exit Application), then your passsword will be left OFF rather than ON. This is due to OPO programs not having any System events (like QUIT) sent to them. ------------------------------------------------------------------- 5. Turning PsiOn into an APP. 99% of OPA's can be happily renamed to APP's without any ill effects. Just remember to remove the desktop icon before you rename it and use the System screen to INSTALL it again afterwards. ------------------------------------------------------------------- 6. Controlling a program other than Agenda. PsiOn isn't limited to controlling Agenda - it can control any program YOU can from the keyboard. There are limitations - namely that certain programs do not have a Unique name as far as SPY and PsiOn determine. If you look in SPY and find the name begins with SYS$, then you should leave it alone. Look for the following code... REM Display agenda screen if required IF wakeagn% = 2 :REM 2=Display now wakeagn% = 0 >> text$ = "AGENDA" + CHR$(0) Just replace the "AGENDA" with the name of the other program. Again - you'll need to use something like SPY to determine what it should be. Next, you'll want to control which keys to send it. Currently, PsiOn sends 2 different key combiniations (Psion-Space and then Psion-Shift-View Key). Work out which keys you want to send. Write down if the Psion key or Shift or Control needs to be sent as well. Then, use the following to convert them into combinations to send. event%(2) holds the Shift, Psion and Control key combinations using logic. Just add the values below together to get more than one key together. Control is 4, Psion is 8 and Shift is 2. event%(1) hold the ASCII value of the key. If Psion is being pressed at the same time, you should add 512 to this value. (Most programs don't check the Flags part and just check if 512 has been added, so don't think you can just set the flag value correctly). For example, to send just the character A event%(2) = 0 :REM No flags event%(1) = %A :REM Ascii A To send Shift-A event%(2) = 2 :REM Shift event%(1) = %A :REM Ascii A To send Psion-A event%(2) = 8 :REM Psion event%(1) = %A + 512 :REM Ascii A and 512 for Psion To Send Psion-Shift-A event%(2) = 10 :REM Psion AND shift event%(1) = %A + 512 :REM Ascii A and 512 for Psion I'm sure you get the idea. Look for the following code (just below the "AGENDA" string) CALL($198d, 0, pid%) :gUPDATE :REM Now view agenda screen >> event%(2) = 4 :REM Control-Space - Move to today in Day vie >> event%(1) = 32 >> CALL($0483, pid%, 49, 0, ADDR(event%())) >> >> IF view$ <> "" AND view$ <> " " :REM Any other view wanted? >> >> event%(2) = 10 :REM Send Key + 512(psion), and flags ( S >> event%(1) = 512 + ASC(view$) >> CALL($0483, pid%, 49, 0, ADDR(event%())) >> ENDIF Note that the CALL lines are the ones that actually send the keys. Delete this whole section of code. I'm assuming you DO want to send different keys. Now replace it with your new keypresses. Here's an example. I've included the whole section of code that I've been showing you. This example should call up word if it's running, and will type a few chars into it. Then it will call the spelling checker for the word. Not useful, but it is an example ;) IF wakeagn% = 2 :REM 2=Display now wakeagn% = 0 >> text$ = "WORD" + CHR$(0) oscalls%(1) = $0100 oscalls%(2) = UADD(ADDR(text$), 1) IF (OS($88, ADDR(oscall%())) AND 1) pid% = oscalls%(1) CALL($198d, 0, pid%) :gUPDATE :REM Now view agenda scre event%(2) = 0 :REM Send new-line event%(1) = 13 CALL($0483, pid%, 49, 0, ADDR(event%())) event%(2) = 0 event%(1) = %D CALL($0483, pid%, 49, 0, ADDR(event%())) event%(2) = 0 event%(1) = %o CALL($0483, pid%, 49, 0, ADDR(event%())) event%(2) = 0 event%(1) = %p CALL($0483, pid%, 49, 0, ADDR(event%())) event%(2) = 8 :REM Psion key event%(1) = %U + 512 :REM U + Psion key (Spell check) CALL($0483, pid%, 49, 0, ADDR(event%())) event%(2) = 8 :REM Psion key event%(1) = %W + 512 :REM W + Psion key (Check word) CALL($0483, pid%, 49, 0, ADDR(event%())) ENDIF :REM OS = 0 ENDIF :REM wakeagn% = 2 You should get a list of words starting with dip, do, doe, dog, don. Note : I haven't tested this code! -------------------------------------------------------------------