home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 500-599 / ff566.lza / AM / takt.c < prev   
C/C++ Source or Header  |  1991-11-21  |  3KB  |  167 lines

  1. /*
  2.  * Programm: Takt (Takterzeugung)
  3.  * Aufgabe : Verschickt in best. Abständen Signale
  4.  * Aufruf  : Takt microsek
  5.  *
  6.  * Auto: make takt
  7.  *
  8.  */
  9.  
  10. #include "AM.h"
  11.  
  12. #if 0
  13. # define D(debug) debug
  14. #else
  15. # define D(debug)
  16. #endif
  17.  
  18. #define ANZ_EMPF 16
  19. #define abbruch SIGBREAKF_CTRL_C
  20.  
  21. extern struct ExecBase *SysBase;
  22. extern struct Library  *DOSBase;
  23.  
  24. long                timer, msg;
  25.  
  26. struct MsgPort        *msgport, *timeport;
  27. struct timerequest    *timereq;
  28.  
  29. struct { struct Task *task; long sig; }
  30.                     empfaenger[ ANZ_EMPF ];
  31.  
  32.  
  33. void sendtimereq( long );
  34. void sendtakt( void );
  35. void handlemsg( struct TaktMsg * );
  36. void init( void );
  37. void closedown( void );
  38.  
  39.  
  40. main( int argc, char *argv[] )
  41. {
  42.     long sgns, ticks, atol( char * );
  43.  
  44.     if( argc != 2 ) exit(10);
  45.     ticks = atol( argv[1] );
  46.     
  47.     D(VPrintf("Ticks=%ld\n", &ticks));
  48.     
  49.     init();
  50.     sendtimereq( ticks );
  51.     
  52.     while(1)
  53.     {
  54.         sgns = Wait( abbruch | timer | msg );
  55.         
  56.         if( sgns & timer ) {
  57.             sendtakt();
  58.             sendtimereq( ticks );
  59.             SetSignal( 0L, timer ); }
  60.             
  61.         if( sgns & msg ) {
  62.             handlemsg( (struct TaktMsg *) GetMsg(msgport) );
  63.             SetSignal( 0L, msg ); }
  64.  
  65.         if( sgns & abbruch )
  66.             closedown();
  67.     }
  68. }
  69.  
  70.  
  71. void sendtimereq( long tcks )
  72. {
  73.     D(PutStr("sendtimereq\n"));
  74.     timereq->tr_time.tv_secs  = 0;
  75.     timereq->tr_time.tv_micro = tcks;
  76.     SendIO( timereq );
  77. }
  78.  
  79. void sendtakt( void )
  80. {
  81.     int i;
  82.  
  83.     D(PutStr("sendtakt\n"));
  84.     /* allen angeschl. Tasks Signal schicken */
  85.     for( i=0; i<ANZ_EMPF; i++ )
  86.         if( empfaenger[i].task )
  87.             Signal( empfaenger[i].task, empfaenger[i].sig );
  88. }
  89.  
  90. void handlemsg( struct TaktMsg *msg )
  91. {
  92.     int i;
  93.  
  94.     switch( msg->tm_op )
  95.     {
  96.         case OP_ADD:
  97.             D(PutStr("OP_ADD\n"));
  98.             for( i=0; i<ANZ_EMPF; i++ )
  99.                 if( !empfaenger[i].task )
  100.                 {
  101.                     empfaenger[i].task = msg->tm_task;
  102.                     empfaenger[i].sig  = msg->tm_sig;
  103.                     /* Erfolg! */
  104.                     msg->tm_task = NULL;
  105.                     break;
  106.                 }
  107.             break;
  108.  
  109.         case OP_REM:
  110.             D(PutStr("OP_REM\n"));
  111.             for( i=0; i<ANZ_EMPF; i++ )
  112.                 if( empfaenger[i].task == msg->tm_task )
  113.                 {
  114.                     empfaenger[i].task = NULL;
  115.                     empfaenger[i].sig  = 0;
  116.                 }
  117.             break;
  118.     }
  119.     
  120.     ReplyMsg( & msg->tm_msg );
  121. }
  122.  
  123. void init( void )
  124. {
  125.     D(PutStr("init\n"));
  126.     /* Port für Messages */
  127.     msgport = CreatePort( "TAKT", 0 );
  128.     msg = 1L << msgport->mp_SigBit;
  129.     
  130.     /* Timer-Device-Stuff */
  131.     timeport = CreateMsgPort();
  132.     timer = 1L << timeport->mp_SigBit;
  133.     timereq = CreateIORequest( timeport, sizeof(struct timerequest) );
  134.     OpenDevice( TIMERNAME, UNIT_MICROHZ, timereq, 0 );
  135.     timereq->tr_node.io_Command = TR_ADDREQUEST;
  136.     timereq->tr_node.io_Message.mn_ReplyPort = timeport;
  137. }
  138.  
  139. void closedown( void )
  140. {
  141.     int i;
  142.     struct Message *m;
  143.  
  144.     D(PutStr("closedown\n"));
  145.     /* Timer-Device schliessen */
  146.     AbortIO( timereq );
  147.     WaitIO( timereq );
  148.     CloseDevice( timereq );
  149.     DeleteIORequest( timereq );
  150.     DeleteMsgPort( timeport );
  151.     
  152.     /* msgPort schliessen (auch für angeschl. Tasks, damit die keine
  153.      * keine OP_REMs schicken beim folgenden Ctrl-C)
  154.      */
  155.     Forbid();
  156.      while( m=GetMsg(msgport) ) ReplyMsg(m);
  157.      DeletePort( msgport );
  158.     Permit();
  159.     
  160.     /* allen angeschl. Tasks CTRL-C schicken */
  161.     for( i=0; i<ANZ_EMPF; i++ )
  162.         if( empfaenger[i].task )
  163.             Signal( empfaenger[i].task, SIGBREAKF_CTRL_C );
  164.     
  165.     exit(0);
  166. }
  167.