home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / PROG / MISC / DATAREP.ZIP / MAKESTIM.INC < prev    next >
Encoding:
Text File  |  1990-02-22  |  18.4 KB  |  496 lines

  1. {This long procedure makes stimulus files from character strings.   }
  2. {It can also do some element by element manipulation and can add    }
  3. {stimuli together, as well as allowing inspection of single elements}
  4. {in the vectors.  These facilities are rarely used, but are provided}
  5. {anyway.  The various options available in this procedure are       }
  6. {discussed at length in the Manual.                                 }
  7.  
  8. PROCEDURE Make_stimulus;
  9.  
  10.     TYPE  Byte = ARRAY [1..8] OF INTEGER;
  11.  
  12.     VAR Nr_of_characters: INTEGER;
  13.         Quit: BOOLEAN;
  14.                 
  15.    PROCEDURE Showvals; 
  16.    VAR Input_char: CHAR;
  17.        Quit: BOOLEAN;
  18.        Stim: STIMULUS;
  19.        Stimulus_set: CHAR;
  20.        Stimulus_number: INTEGER;
  21.   
  22.    PROCEDURE Write_box;
  23.        BEGIN
  24.        Clear_box;
  25.        WRITELN ('Threshold       : ', Threshold: 8);
  26.        WRITE   ('Current Stimulus: ');
  27.        WRITELN (Stimulus_set:2, Stimulus_number:3);
  28.        END;
  29.  
  30.    PROCEDURE Showvals_initialize;
  31.        BEGIN
  32.        Quit:= FALSE;
  33.        Save_cursor;  
  34.        Stim := F_set [1];   
  35.        Stimulus_number := 1;  
  36.        Stimulus_set := 'F';
  37.        Write_box;
  38.        END;
  39.  
  40.    PROCEDURE Display_stimulus;
  41.     VAR I, Row_nr, Elements_per_line: INTEGER;
  42.         Stim_interpretation: String;
  43.     BEGIN
  44.         Interpret (Threshold, Stim.Val, Stim_Interpretation);
  45.         Write_box;
  46.     WRITELN ('            Name: ', Stim.Name);
  47.         WRITELN ('  Interpretation: ', Stim_interpretation);
  48.         Clear_block; Scroll_block;
  49.     Elements_per_line := 8;    {Single byte. Number of elements in a line.}
  50.     FOR I:= 1 TO Dimensionality DO 
  51.                 BEGIN
  52.                 IF (I MOD Elements_per_line = 1) THEN
  53.                          BEGIN
  54.                          Row_nr:= 1 + I DIV Elements_per_line;
  55.                          WRITE ( I:4);
  56.                          WRITE (' ',Stim_interpretation [Row_nr], '  '); 
  57.                          END;
  58.                 WRITE (Stim.Val [I]:8);
  59.                 IF (I MOD Elements_per_line = 0) 
  60.                    THEN BEGIN WRITE ( I:4); WRITELN  END;
  61.                 END;
  62.     END;
  63.  
  64.      PROCEDURE New_value;
  65.         VAR Element_number: INTEGER;
  66.             New_element_value: REAL;
  67.         BEGIN
  68.         Write_box;
  69.         REPEAT WRITE  ('Which element   : '); READLN (Element_number);
  70.         UNTIL Element_number IN [1..Dimensionality];
  71.         WRITE ('Old Value       : ');  WRITELN (Stim.Val [Element_number]:8);
  72.         WRITE ('New Value       : ');  READLN (New_element_value);
  73.         Stim.Val [Element_number] := New_element_value; 
  74.         CASE Stimulus_set OF
  75.              'F','f': F_set [Stimulus_number]:= Stim;
  76.              'G','g': G_set [Stimulus_number]:= Stim;
  77.              'T','t': T_set [Stimulus_number]:= Stim;
  78.              END;
  79.         END;
  80.  
  81.      PROCEDURE Choose_stimulus;
  82.         BEGIN
  83.         Write_box;
  84.         REPEAT
  85.           WRITE   ('New Stimulus    : ');
  86.           READLN  (Stimulus_set, Stimulus_number);
  87.         UNTIL ((Stimulus_set IN ['f','F','g','G','t','T'])
  88.           AND (Stimulus_number IN [1..Maximum_set_size]) );
  89.         Write_box;
  90.         CASE Stimulus_set OF
  91.              'F','f': Stim:= F_set [Stimulus_number];
  92.              'G','g': Stim:= G_set [Stimulus_number];
  93.              'T','t': Stim:= T_set [Stimulus_number];
  94.              END;
  95.         END; 
  96.  
  97.      PROCEDURE Choose_action;
  98.          BEGIN
  99.          Bottom_line;
  100.          IF FG_mode THEN WRITE ('FG') ELSE WRITE ('TF');
  101.    WRITE ( ' Shows Values C)hoose D)ispl L)ist M)ode Q)uit T)hresh X)chng > ');
  102.          READLN (Input_char);
  103.          CASE Input_char OF 
  104.               'C','c': Choose_stimulus;
  105.               'D','d': Display_stimulus;
  106.               'L','l': List_test_set;
  107.               'M','m': FG_mode:= NOT FG_mode;
  108.               'Q','q': Quit:= TRUE;
  109.               'T','t': BEGIN 
  110.                        Bottom_line;
  111.                        WRITE ('New Threshold: '); READLN (Threshold);
  112.                        Write_box END;
  113.               'X','x': New_value;
  114.               END; 
  115.          END;
  116.  
  117.     BEGIN {Procedure Showvals.}
  118.     Showvals_initialize;
  119.     REPEAT Choose_action UNTIL Quit;
  120.     Restore_cursor;
  121.     END;  {Procedure Showvals.} 
  122.  
  123.     PROCEDURE Zero_Byte (VAR B: Byte);
  124.        VAR I: INTEGER;
  125.        BEGIN
  126.        FOR I:= 8 DOWNTO 1 DO B[I]:= 0;
  127.        END;
  128.  
  129.     PROCEDURE W (S: String);
  130.        VAR I: INTEGER;
  131.        BEGIN
  132.        FOR I:= 1 to Nr_of_characters DO WRITE (S [I]);
  133.        END;       
  134.  
  135.     PROCEDURE Blank_String (VAR S: String);
  136.        VAR I: INTEGER;
  137.        BEGIN
  138.        FOR I:= 1 TO 60 DO S[I]:= ' ';
  139.        END;
  140.  
  141.     PROCEDURE Zero_stimulus (VAR St: Stimulus);
  142.        VAR I: INTEGER;
  143.        BEGIN
  144.        Blank_string (St.Name);
  145.        FOR I:= 1 TO Dimensionality DO St.Val [I]:= 0;
  146.        END;
  147.  
  148.     PROCEDURE Nr_to_Byte (Nr: INTEGER; VAR B: BYTE);
  149.        VAR I, Power_of_2, Remainder, Parity: INTEGER;
  150.        BEGIN
  151.        IF Nr > 128 THEN WRITELN ('Too large. ASCII conversion fails.'      );
  152.        IF Nr < 0   THEN WRITELN ('Negative number. ASCII conversion fails.');
  153.        Remainder:= Nr;    Parity:= 0;     Power_of_2:= 256;
  154.        FOR I:= 8 DOWNTO 1 DO {msb in B[8], lsb in B[1]}
  155.               BEGIN
  156.               Power_of_2:= Power_of_2 DIV 2;
  157.               IF ( (Remainder - Power_of_2) <  0 ) THEN B[I]:= -1;
  158.               IF ( (Remainder - Power_of_2) >= 0 ) THEN
  159.                      BEGIN
  160.                      B[I]:= 1;
  161.                      Remainder:= Remainder - Power_of_2;
  162.                      Parity:= Parity + 1;
  163.                      END;
  164.               END;
  165.        IF ODD (Parity) THEN B[8]:= 1 ELSE B[8]:= -1;
  166.        END;
  167.  
  168.      PROCEDURE Add_Byte_to_Vector (VAR V: VECTOR; I: INTEGER; B: BYTE);
  169.        VAR J: INTEGER;
  170.        BEGIN
  171.        IF I > (Dimensionality DIV 8) THEN 
  172.               WRITELN ('Addbyte failure.  I too big.');
  173.        FOR J:= 1 TO 8 DO V[ (I-1)*8 + J ]:= B [9-J];
  174.        END;
  175.  
  176.      PROCEDURE Edit_stimulus;
  177.        VAR Read_string, Input_string: VARYING [132] OF CHAR;
  178.            New_stimulus, Old_stimulus: Stimulus;
  179.            I, Edit_nr: INTEGER;
  180.            B: Byte;
  181.            Edit_set: CHAR;
  182.        BEGIN
  183.        Bottom_line;
  184.        Erase_line;
  185.        REPEAT
  186.           WRITE   ('Edit which stimulus (set, number) : ');
  187.           READLN  (Edit_set, Edit_nr);
  188.        UNTIL ((Edit_set IN ['f','F','g','G','t','T'])
  189.           AND (Edit_nr IN [1..Maximum_set_size]));
  190.        CASE Edit_set OF
  191.           'F','f': Old_stimulus:= F_set [Edit_nr];
  192.           'G','g': Old_stimulus:= G_set [Edit_nr];
  193.           'T','t': Old_stimulus:= T_set [Edit_nr];
  194.           END;
  195.        Clear_box;  Scroll_box;
  196.        Blank_string (New_stimulus.Name);
  197.        WRITELN ('Edit    : ', Edit_set:1, Edit_nr:3);
  198.        WRITE   ('Old     : ');         WRITELN  (Old_stimulus.Name);
  199.        WRITE   ('New     : ');         READLN (Read_string);
  200.        Input_String.Length:= Nr_of_Characters;
  201.        FOR I:= 1 TO Nr_of_Characters DO Input_String [I]:= '_';
  202.        IF Read_String.Length < Nr_of_Characters
  203.           THEN FOR I:= 1 to Read_String.Length DO
  204.                Input_String [I]:= Read_String [I];
  205.        IF Read_String.Length >= Nr_of_Characters 
  206.           THEN FOR I:= 1 to Nr_of_Characters DO
  207.                Input_String [I]:= Read_String [I];
  208.        FOR I:= 1 TO Nr_of_Characters DO
  209.           BEGIN
  210.           Nr_to_byte ( ORD (Input_String [I]), B);
  211.           IF (Input_String [I] = '_') THEN Zero_byte (B); 
  212.           Add_Byte_to_vector (New_stimulus.Val, I, B);
  213.           New_stimulus.Name [I] := Input_String [I];
  214.           END;
  215.        CASE Edit_set OF
  216.           'F','f': F_set [Edit_nr]:= New_stimulus;
  217.           'G','g': G_set [Edit_nr]:= New_stimulus;
  218.           'T','t': T_set [Edit_nr]:= New_stimulus;
  219.           END;
  220.        END;       
  221.  
  222.      PROCEDURE Replace;
  223.        VAR Read_string, Input_string: VARYING [132] OF CHAR;
  224.            New_stimulus: Stimulus;
  225.            I, Replace_nr: INTEGER;
  226.            B: Byte;
  227.            Replace_set: CHAR;
  228.        BEGIN
  229.        Bottom_line;
  230.        Erase_line;
  231.        REPEAT
  232.           WRITE   ('Replace which stimulus (set, number) : ');
  233.           READLN  (Replace_set, Replace_nr);
  234.        UNTIL ((Replace_set IN ['f','F','g','G','t','T'])
  235.           AND (Replace_nr IN [1..Maximum_set_size]));
  236.        Clear_box;  Scroll_box;
  237.        Blank_string (New_stimulus.Name);
  238.        WRITELN ('Replace : ', Replace_set:1, Replace_nr:3);
  239.        WRITE   ('Template: ');          WRITELN  (Template);
  240.        WRITE   ('New     : ');         READLN (Read_string);
  241.        Input_String.Length:= Nr_of_Characters;
  242.        FOR I:= 1 TO Nr_of_Characters DO Input_String [I]:= '_';
  243.        IF Read_String.Length < Nr_of_Characters
  244.           THEN FOR I:= 1 to Read_String.Length DO
  245.                Input_String [I]:= Read_String [I];
  246.        IF Read_String.Length >= Nr_of_Characters 
  247.           THEN FOR I:= 1 to Nr_of_Characters DO
  248.                Input_String [I]:= Read_String [I];
  249.        FOR I:= 1 TO Nr_of_Characters DO
  250.           BEGIN
  251.           Nr_to_byte ( ORD (Input_String [I]), B);
  252.           IF (Input_String [I] = '_') THEN Zero_byte (B); 
  253.           Add_Byte_to_vector (New_stimulus.Val, I, B);
  254.           New_stimulus.Name [I] := Input_String [I];
  255.           END;
  256.        CASE Replace_set OF
  257.           'F','f': F_set [Replace_nr]:= New_stimulus;
  258.           'G','g': G_set [Replace_nr]:= New_stimulus;
  259.           'T','t': T_set [Replace_nr]:= New_stimulus;
  260.           END;
  261.        END;       
  262.   
  263.      {The default template is a string of digits indicating    }
  264.      {place.  Individually constructed templates are sometimes }
  265.      {useful.                                                  }
  266.  
  267.  
  268.      PROCEDURE Make_Template;
  269.        VAR      Model_char, Model_set: CHAR;
  270.                 I, Model_number: INTEGER;
  271.                 Read_Template,
  272.                 Input_String,
  273.                 Read_String: VARYING [60] OF CHAR; 
  274.         BEGIN
  275.         Clear_box;             Scroll_box;
  276.         Template.Length:= Nr_of_Characters;
  277.         FOR I:= 1 TO Nr_of_Characters DO Template[I]:= '_';
  278.         WRITE   ('New stimulus template.  Use Model? Y/N : ');
  279.         READLN (Model_char);
  280.         IF Model_char IN ['Y','y'] 
  281.            THEN BEGIN REPEAT
  282.                        WRITE   ('Which stimulus as model (set, number)  : ');
  283.                        READLN  (Model_set, Model_number);
  284.                       UNTIL ((Model_set IN ['f','F','g','G','t','T'])
  285.                          AND (Model_number IN [1..Maximum_set_size]));
  286.  
  287.                       WRITE ('          ');
  288.                       CASE Model_set OF
  289.                          'F','f': W (F_set [Model_number].Name);
  290.                          'G','g': W (G_set [Model_number].Name);
  291.                          'T','t': W (T_set [Model_number].Name);
  292.                          END;
  293.                 END
  294.            ELSE BEGIN
  295.                 WRITE ('          ');
  296.                 FOR I:= 1 TO Nr_of_Characters DO WRITE ((I MOD 10):1)
  297.                 END;
  298.         WRITELN;
  299.         WRITE ('Template: ');
  300.         READLN (Read_Template);
  301.         IF Read_Template.Length < Nr_of_Characters
  302.             THEN FOR I:= 1 TO Read_Template.Length DO
  303.                       Template [I]:=Read_Template [I];
  304.         IF Read_Template.Length >= Nr_of_Characters
  305.             THEN FOR I:= 1 to Nr_of_Characters DO
  306.                       Template [I]:= Read_Template [I];
  307.         END;
  308.  
  309.     {Sometimes it is convenient to sum stimuli together. }
  310.  
  311.  
  312.     PROCEDURE Sum_stimuli;
  313.        VAR I, Ones_digit, Tens_digit,
  314.            To_number, From_number, How_many_stimuli: INTEGER;
  315.            To_set, From_set: CHAR;
  316.            Sum: Stimulus;
  317.            Number_string: VARYING [2] OF CHAR;
  318.  
  319.            PROCEDURE Add_stimuli (S1, S2: Stimulus; VAR Sum: Stimulus);
  320.                VAR I: INTEGER;
  321.                BEGIN
  322.                FOR I:= 1 TO Dimensionality 
  323.                    DO Sum.Val [I]:= S1.Val [I] + S2.Val [I];
  324.                END;
  325.  
  326.            PROCEDURE Divide_stimulus (D: Integer; VAR S: Stimulus);
  327.                VAR I: INTEGER;
  328.                BEGIN
  329.                IF D <> 0 THEN FOR I:= 1 TO Dimensionality
  330.                          DO S.Val [I]:= S.Val [I]/D;
  331.                END;
  332.  
  333.        BEGIN
  334.        Zero_stimulus (Sum);
  335.        Sum.Name [1]:= 'S'; Sum.Name [2]:= 'u'; 
  336.        Sum.Name [3]:= 'm'; Sum.Name [4]:= ' ';
  337.        Bottom_line; Erase_line;
  338.  
  339.        REPEAT
  340.           WRITE    ('How many stimuli? (Averages sum): ');  
  341.           READLN   (How_many_stimuli);
  342.        UNTIL (How_many_stimuli IN [1..Maximum_set_size]);
  343.        IF NOT VT100 THEN WRITELN;
  344.  
  345.        FOR I:= 1 TO How_many_stimuli DO
  346.                BEGIN
  347.                Erase_line;
  348.  
  349.                REPEAT
  350.                  WRITE   ('Add stimulus number ', I:2,
  351.                           ' of', How_many_stimuli:3,
  352.                           ' stimuli (set, number) : ');
  353.                  READLN  (From_set, From_number);
  354.                UNTIL ((From_set IN ['f','F','g','G','t','T'])
  355.                        AND (From_number IN [1..Maximum_set_size]));
  356.                IF NOT VT100 THEN WRITELN;
  357.                CASE From_set OF
  358.                     'F','f': Add_stimuli (Sum, F_set [From_number], Sum);
  359.                     'G','g': Add_stimuli (Sum, G_set [From_number], Sum);
  360.                     'T','t': Add_stimuli (Sum, T_set [From_number], Sum);
  361.                     END;
  362.                Tens_digit:= From_number DIV 10;
  363.                Ones_digit:= From_number - Tens_digit*10;
  364.                IF I < 14 THEN BEGIN
  365.                          Sum.Name [4*I + 1] := From_set;
  366.                          Sum.Name [4*I + 2] := CHR (48 + Tens_digit);
  367.                          Sum.Name [4*I + 3] := CHR (48 + Ones_digit);
  368.                          Sum.Name [4*I + 4] := ' ';  
  369.                          END;
  370.                END;
  371.        Divide_stimulus (How_many_stimuli, Sum); 
  372.        Erase_line;
  373.        REPEAT WRITE   ('Copy to   (set, number): '); 
  374.               READLN  (To_set, To_number);
  375.        UNTIL ((To_set IN ['f','F','g','G','t','T'])
  376.               AND (To_number IN [1..Maximum_set_size]));
  377.        IF NOT VT100 THEN WRITELN;
  378.        Erase_line;
  379.        WRITELN ('Name of sum: ',Sum.Name);
  380.        CASE To_set OF
  381.             'F','f': F_set [To_number]:= Sum;
  382.             'G','g': G_set [To_number]:= Sum;
  383.             'T','t': T_set [To_number]:= Sum;
  384.             END;
  385.        END;
  386.  
  387.     PROCEDURE Change_stimulus_name;
  388.        VAR Change_name_set: CHAR;
  389.            I, Change_name_number, String_length: INTEGER;
  390.            Old_name, New_name: STRING;
  391.            Changed_name: VARYING [132] OF CHAR;
  392.        BEGIN
  393.        Bottom_line; Erase_line;
  394.        WRITELN ('Change the name of a stimulus.');
  395.        REPEAT WRITE   ('Change name of (set, number): '); 
  396.               READLN  (Change_name_set, Change_name_number);
  397.        UNTIL (Change_name_set IN ['f','F','g','G','t','T']) 
  398.               AND (Change_name_number IN [1..Maximum_set_size]);
  399.  
  400.        CASE Change_name_set OF
  401.               'F','f': Old_name:= F_set [Change_name_number].Name;
  402.               'G','g': Old_name:= G_set [Change_name_number].Name;
  403.               'T','t': Old_name:= T_set [Change_name_number].Name;
  404.               END;
  405.  
  406.        Clear_box; Scroll_box;
  407.        WRITE ('Template: ');    WRITELN (Template);
  408.        WRITE ('Old Name: ');    WRITELN (Old_name);
  409.        WRITE ('New Name: ');    READLN (Changed_name);
  410.        Blank_string (New_name);
  411.        IF Length(Changed_name) >= 60 THEN String_length:= 60
  412.                                      ELSE String_length:= Length(Changed_name);
  413.        FOR I:= 1 TO String_length DO New_name [I]:= Changed_name [I];
  414.         
  415.        CASE Change_name_set OF
  416.               'F','f': F_set [Change_name_number].Name := New_name;
  417.               'G','g': G_set [Change_name_number].Name := New_name;
  418.               'T','t': T_set [Change_name_number].Name := New_name;
  419.               END;
  420.        END;
  421.  
  422.  
  423.     PROCEDURE Copy_stimulus;
  424.        VAR From_number, To_number: INTEGER;
  425.            From_set, To_set: CHAR;
  426.            Duplicate: Stimulus;
  427.        BEGIN
  428.        Bottom_line; Erase_line;
  429.        WRITELN ('Copy a stimulus.');
  430.  
  431.        REPEAT WRITE   ('Copy from (set, number): '); 
  432.               READLN  (From_set, From_number);
  433.        UNTIL (From_set IN ['f','F','g','G','t','T']) 
  434.               AND (From_number IN [1..Maximum_set_size]);
  435.  
  436.        REPEAT WRITE   ('Copy from ', From_set:1, From_number:3,
  437.                        '.  Copy to   (set, number): '); 
  438.               READLN  (To_set, To_number);
  439.        UNTIL (To_set IN ['f','F','g','G','t','T'])
  440.               AND (To_number IN [1..Maximum_set_size]);
  441.  
  442.        CASE From_set OF 
  443.             'F','f': Duplicate:= F_set [From_number];
  444.             'G','g': Duplicate:= G_set [From_number];
  445.             'T','t': Duplicate:= T_set [From_number];
  446.             END;
  447.  
  448.        CASE To_set OF
  449.             'F','f': F_set [To_number]:= Duplicate;
  450.             'G','g': G_set [To_number]:= Duplicate;
  451.             'T','t': T_set [To_number]:= Duplicate;
  452.             END;
  453.        END;
  454.  
  455.     PROCEDURE Make_stimulus_command;
  456.        VAR Command_string: STRING;
  457.            Command_char, Which_set: CHAR;
  458.            Replace_nr: INTEGER;
  459.        BEGIN
  460.        Quit:= FALSE;
  461.        REPEAT
  462.          Bottom_line;
  463.          IF FG_mode     THEN WRITE ('FG ');
  464.          IF NOT FG_mode THEN WRITE ('T  ');
  465.          WRITE 
  466. ('A)dd C)opy E)dit I)ndiv. L)ist M)ode N)ame Q)uit R)epl. S)ave T)empl. > ');
  467.          READLN (Command_char);
  468.          Bottom_line; Erase_line;
  469.          CASE Command_char OF
  470.               'A','a' : Sum_stimuli;
  471.               'C','c' : Copy_stimulus;
  472.               'E','e' : Edit_stimulus;
  473.               'I','i' : Showvals;              {Work with individual elements.}
  474.               'M','m' : BEGIN WRITE ('Toggle Mode'); FG_mode:= NOT FG_mode END;
  475.               'N','n' : Change_stimulus_name;
  476.               'L','l' : List_test_set;
  477.               'Q','q' : Quit:= TRUE; 
  478.               'R','r' : Replace;
  479.               'S','s' : BEGIN
  480.                         Bottom_line;
  481.                         WRITE  ('Write to which file F, G, or T? ');
  482.                         READLN (Which_file);
  483.                         Write_file (Which_file);
  484.                         END;
  485.               'T','t' : Make_template;
  486.               END;
  487.        UNTIL Quit;
  488.        END; 
  489.     
  490.        BEGIN  {Make_stimulus.}
  491.        Clear_box; Scroll_box;
  492.        Nr_of_Characters:= Dimensionality DIV 8;
  493.        REPEAT Make_stimulus_command UNTIL Quit;
  494.        END;   {Make_stimulus.}
  495.  
  496.