/*
                    __ 
              _____/ / ____  ____      
             / ___/ __/ __ \/ _  \     
            (__  ) /_/ /_/ / /_/ /     
            ____/\__/\____/ .___/
                         /_/
 
   
   Stop Signal support for Tscope.
   Author: Frederick Verbruggen
   
*/


#include <tscope.h>
#include <tscope/internal.h>

struct stopsignal_param {
    int freq;
    int staircase;
    int ssd;
    int step;
    __int64 soundtime;
    __int64 cleartime;
    __int64 maxtime;
} stopsignal;


int ts_stop(__int64 * time, __int64 * errortime, int tmp_ssd)
{
    ts_sinefreq(stopsignal.freq);
    stopsignal.ssd = tmp_ssd;

    ts_flushresp();

    int usrnput = 0, ddln = 0, cleared = 0, stop_sound = 0;
    __int64 prev, start, tm;
    __int64 err = 0, lapse = 0;

    AUDIOSTREAM *str;
    str = ts_makestream();

    // de loop
    start = prev = ts_time();
    do {

        if (lapse > mtt(stopsignal.ssd)
            && (lapse < mtt(stopsignal.ssd) + stopsignal.soundtime))
            ts_updatestream(str);

        // measure time
        tm = ts_time();
        err = tm - prev;
        prev = tm;
        lapse = tm - start;
        usrnput = ts_respstatus();

        if (stopsignal.maxtime > 0)
            if (lapse >= stopsignal.maxtime)
                ddln = 1;

        if (stopsignal.cleartime > 0)
            if (lapse >= stopsignal.cleartime && !cleared) {
                cleared = 1;
                ts_clrscr();
            }

        if ((lapse > mtt(stopsignal.ssd) + stopsignal.soundtime)
            && !stop_sound) {
            stop_sound = 1;
            ts_killstream(str);
        }

    } while (!usrnput && !ddln);

    // close
    if (!stop_sound)
        ts_killstream(str);
    *time = tm;
    *errortime = err;



    //implemented staircase trackingprocedure 
    if (stopsignal.staircase == ON) {
        if ((usrnput > 0 && stopsignal.ssd > stopsignal.step))  //thanks to boris burle for the suggestion of the stopsignal.step parameter
            stopsignal.ssd = stopsignal.ssd - stopsignal.step;
        else if (usrnput == 0)
            stopsignal.ssd = stopsignal.ssd + stopsignal.step;
    }

    return usrnput;
}


int ts_go(__int64 * time, __int64 * errortime)
{

    ts_flushresp();
    int usrnput = 0, ddln = 0, cleared = 0;
    __int64 prev, start, tm;
    __int64 err = 0, lapse = 0;


    start = prev = ts_time();
    do {

        tm = ts_time();
        err = tm - prev;
        prev = tm;
        lapse = tm - start;
        usrnput = ts_respstatus();

        if (stopsignal.maxtime > 0)
            if (lapse >= stopsignal.maxtime)
                ddln = 1;

        if (stopsignal.cleartime > 0)
            if (lapse >= stopsignal.cleartime && !cleared) {
                cleared = 1;
                ts_clrscr();
            }


    } while (!usrnput && !ddln);

    // sluiten 
    *time = tm;
    *errortime = err;
    return usrnput;
}


void stop_init()
{
    stopsignal.freq = 750;
    stopsignal.soundtime = mtt(75);
    stopsignal.cleartime = mtt(0);
    stopsignal.maxtime = mtt(1500);
    stopsignal.staircase = ON;
    stopsignal.step = 50;
    ts_volume(60);
}

// -----------------------------------------------------------------------------


top
Persoonlijke pagina Universiteit GentTscope
Allegro | Cygwin | Gcc
© See license.html for copyright information