Seppo Mustonen: Sukrojen ohjelmointi Survossa

8. Käyttäjän vuorovaikutus

Käyttäjien mahdollisuudet vaikuttaa sukron toimintaan perustuvat toisaalta nopeuden säätelyyn (napit + ja -) ja sukron väliaikaiseen (välilyöntinäppäin) tai lopulliseen (piste) pysäyttämiseen sekä toisaalta sukron puolelta tuleviin kehoituksiin vastata kysymyksiin tai painaa valittua näppäintä. Joskus sukrot saattavat tilapäisesti antaa käyttäjän toimia itsenäisesti (esim. tiedon tallennuksessa). Käyttäjän ja sukron välistä vuorovaikutusta säädellään sukro-ohjelmassa seuraavin keinoin.

Kysymykset

Sukro esittää kysymyksensä prompt-lauseella, jonka yleinen rakenne on

- prompt <Kysymys ?> {}
-   default <oletusvastaus>
-   answer  <muistipaikka, johon vastaus talletetaan>
-   length  <vastauksen enimmäispituus merkkeinä>
-   wait    <odotusaika 0.1 sek.>

Itse prompt-rivillä oleva kysymys tulee kohdistimen sillä hetkellä osoittamaan paikkaan kuvaruudulla. Vastaukselle on kysymyksen perässä varattu tila, jonka suurin mahdollinen pituus merkkeinä ilmoitetaan length-rivillä. Vastaustilassa on valmiina default-rivillä annettu oletusvastaus, joka voi kokonaan puuttua. Jos oletusvastaukseksi merkitään muistipaikan nimi, tämän paikan sisältö näkyy oletusvastauksena. Käyttäjän odotetaan kirjoittavan oletusvastauksen päälle tai sitä muunnellen oman vastauksensa. Aikaa vastauksen antamiseen on wait-rivillä ilmoitettu määrä. Käyttäjä vahvistaa vastauksensa ENTER-napilla. Ellei näin tapahdu, sukro valitsee enimmäisodotusajan kuluttua senhetkisen vastauksen ja jatkaa toimintaansa. Vastaus tallentuu answer-rivillä ilmoitettuun muistipaikkaan. answer-rivi voi kokonaan puuttua, jolloin vastaus sijoittuu sukromuistin loppuun.
     Käyttäjälle on jätetty myös mahdollisuus keskeyttää vastaaminen napilla ESC . Tällöin vastaukseksi tulee teksti (break) . Tarvittaessa tämä vaihtoehto on erikseen testattava ohjelmassa.
     Vaikka sekä kysymys että vastaus näkyvät kuvaruudussa, ne eivät tallennu toimituskenttään. Mikäli näin kuitenkin halutaan, kysymys on syytä kirjoittaa tekstinä ennen prompt-lausetta ja vastaus esim. print-käskyllä prompt-lauseen jälkeen.

Näytteenä esitämme sukron IKÄ, joka kysyy käyttäjän ikää ja vastauksesta riippuen kommentoi sitä eri tavoin:
  12  1 SURVO 84C EDITOR Tue May 07 19:33:19 1991         D:\SUOPAS\ 120  80 0
   1 *
   2 *TUTSAVE IKÄ_
   3 *{tempo -1}{init}{line start}{R}
   4 *{erase}{erase}SCRATCH {act}{line start}{erase}
   5 *{W1=}
   6 + Kysymys:
   7 - prompt Mikä on ikäsi ? {}
   8 -   default W1
   9 -   answer W2
  10 -   length 3
  11 -   wait 600
  12 *{R}{erase}
  13 - if W2 '=' {} then goto Ei_vastausta
  14 - if W2 '=' 0 then goto Liian_nuori
  15 - if W2 = 0 then goto Omituinen
  16 - if W2 < 3 then goto Liian_nuori
  17 - if W2 > 99 then goto Liian_vanha
  18 *Ikäsi on siis {print W2} vuotta.{goto Loppu}
  19 + Ei_vastausta:
  20 *Et vastannut mitään!{R}{goto Kysymys}
  21 + Omituinen:
  22 *Vastauksesi on muuta kuin kokonaisluku!{R}{goto Kysymys}
  23 + Liian_nuori:
  24 - if W1 '=' W2 then goto Uskotaan
  25 *Et voi olla noin nuori!
  26 *{W1=W2}{R}{goto Kysymys}
  27 + Liian_vanha:
  28 - if W1 '=' W2 then goto Uskotaan
  29 *Olisitko todella noin vanha?
  30 *{W1=W2}{R}{goto Kysymys}
  31 + Uskotaan: Uskotaan pois!
  32 + Loppu: {tempo +1}{end}
  33 *

Jos vastaus puuttuu tai se vaikuttaa oudolta, sukro toistaa kysymyksen. Keskustelu tämän sukron kanssa voi näyttää seuraavanlaiselta:
  15  1 SURVO 84C EDITOR Tue May 07 19:36:07 1991         D:\SUOPAS\ 120  80 0
  33 *
  34 */IKÄ
  35 *Mikä on ikäsi ?    *
  36 *Et vastannut mitään!
  37 *Mikä on ikäsi ? 0.0*
  38 *Vastauksesi on muuta kuin kokonaisluku!
  39 *Mikä on ikäsi ? 1  *
  40 *Et voi olla noin nuori!
  41 *Mikä on ikäsi ? 2  *
  42 *Et voi olla noin nuori!
  43 *Mikä on ikäsi ? 103*
  44 *Olisitko todella noin vanha?
  45 *Mikä on ikäsi ? 103*
  46 *Uskotaan pois!_
  47 *

Nappien painallukset

Lyhyempiä, yhdellä napilla toimitettavia käyttäjän ohjauksia varten sukrokieleen kuuluu on key -lause. Sen rakenne on

- on key
-    key <nappi1>: goto <viite1>
-    key <nappi2>: goto <viite2>
-      jne.
-    wait <odotusaika 0.1 sek.>

Sukro odottaa, kunnes käyttäjä on painanut jotain nappia ja valitsee vastaavan vaihtoehdon key-riveiltä. goto-käskyjen asemasta kullakin key-rivillä jatkoa voi osoittaa myös load-käsky tai continue. Viimeksimainittu tarkoittaa jatkamista suoraan on key -lauseen (wait-rivin) jälkeisestä toiminnasta.
     Jos käyttäjä ei paina wait-rivin sallimana odotusaikana mitään nappia tai painaa nappia, jota ei esiinny key-riveillä, sukron toiminta jatkuu ensimmäisen key-rivin mukaisesti.
     Sukro saattaa tiedustella käyttäjän halua jatkaa toimintaa esim. seuraavasti. Tässä on vain ote sukron listauksesta:
  39  1 SURVO 84C EDITOR Wed May 08 19:16:18 1991         D:\SUOPAS\ 120  80 0
      - - -
  51 *Jatketaanko (K/E) ?
  52 - on key
  53 -    key E: goto Loppu
  54 -    key K: continue
  55 -    key k: continue
  56 - wait 300
  57 *{line start}{erase}Siis haluat jatkaa!_
      - - -

Koska käyttäjältä ei tämmöisessä tilanteessa ole syytä odottaa, että hän painaisi nimenomaan isoa K-kirjainta, myös pieni k-kirjain kelpuutetaan jatkon hyväksymiseen. Kaikki muut painallukset johtavat E:n lailla viitteeseen Loppu.

Näppäinten vaikutuksen estäminen

Joissain tapauksissa on välttämätöntä estää se, ettei käyttäjä keskeytä sukron toimintaa sopimattomassa paikassa eikä myöskään pääse esim. muuttamaan nopeutta napeilla + ja -. Tämä on tarpeen esim. opetusohjelmissa silloin, kun ne valmistelevat jotain tehtävää ja haluavat tehdä sen rauhassa.
     Painallusten vaikutukset estetään käskyllä {break off} ja ne saatetaan uudelleen voimaan käskyllä {break on}.
     Tällä käskyparilla on tärkeä tehtävä myös näppäimistösukroissa, joilla muutetaan näppäinten merkitystä jotain erikoissovellusta varten. Tästä kerrotaan lisää myöhemmin.
     Huolimaton {break off} -käskyn käyttö johtaa vaikeuksiin. Esim. seuraava sukro jää kiinni ohjelmakierrokseen, jota ei voi keskeyttää napilla piste. Se onnistuu vain painamalla ctrl-C -näppäinyhdistelmää:

      * TUTSAVE LOUKKU
      + A: {break off}{goto A}{end}

Käyttäjän itsenäinen toiminta sukron aikana

Monesti sukroja tehdään avustamaan sellaista käyttäjää, joka ei hallitse Survon peruskäyttötapoja, mutta joka esim. tarvitsee keinoja tietojen tallettamiseen Survon havaintotiedostoihin. Ajatus on tällöin se, että käyttäjä voi aloittaa työskentelyn yksinkertaisella sukron aloituskomennolla, joka erinäisten kysymysten jälkeen johdattaa hänet varsinaiseen talletusvaiheeseen. Tämä saattaa tapahtua esim. FILE SHOW -operaatiolla. Normaalisti sukro ei kuitenkaan salli käyttäjän omaa sooloilua vaan hallitsee työtä talletuksenkin aikana.
     Jotta käyttäjä voisi kuitenkin toimia tuossa vaiheessa itsenäisesti, sukro saadaan irtautumaan työn ohjauksesta tilapäisesti antamalla ennen FILE SHOW -komentoa (tai vastaavaa) ohjelmassa käsky {interaction on}. Tällöin sukro lepää koko tallennuksen ajan. Vasta kun käyttäjä lopettaa oman toimintansa (esim. F8-napilla FILE SHOW -tallennuksessa), sukro jatkaa. Tällöin on hyvä antaa käsky {interaction off}, joka palauttaa sukron normaaliin toimintatapaan.
     Koodi voi näiltä osin olla seuraavanlainen:

    FILE SHOW {print Wdata}
    {interaction on}{act}{interaction off}

Sukrojen ohjelmointi Survossa - Seppo Mustonen 1991
  1. Johdanto
  2. Esimerkki
  3. Sukrokielen koodisanoja
  4. Sukromuisti
  5. Hapuilukoodit, tulostus ja kohdistimen liikuttelu
  6. Sukrojen aloittaminen ja kytkeminen toisiinsa
  7. Ehdolliset toiminnat
  8. Käyttäjän vuorovaikutus
  9. Aritmetiikka ja muistin välitön hallinta
  10. Sukrotiedostot
  11. Sukrojen lajit
  12. Sukrojen laatiminen käytännössä
  13. Virhetilanteet
  14. Näytesovelluksia
Liite: Sukrokielen koodisanat