File: SignalSender.cpp

package info (click to toggle)
pinball 0.3.20230219-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 8,572 kB
  • sloc: cpp: 15,776; makefile: 1,037; sh: 588; xml: 24
file content (99 lines) | stat: -rw-r--r-- 3,167 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/***************************************************************************
                          SignalVisitor.cpp  -  description
                             -------------------
    begin                : Wed Jan 26 2000
    copyright            : (C) 2000 by Henrik Enqvist
    email                : henqvist@excite.com
 ***************************************************************************/


#include "Private.h"
#include "SignalSender.h"
#include "Group.h"
#include "Behavior.h"

#include <cstddef>

SignalSender * SignalSender::p_SignalSender = NULL;

SignalSender::SignalSender() {
}

SignalSender::~SignalSender() {
  p_SignalSender = NULL;
}

SignalSender * SignalSender::getInstance() {
  if (p_SignalSender == NULL) {
    p_SignalSender = new SignalSender();
  }
  return p_SignalSender;
}

void SignalSender::addSignal(int signal, int delay, Group * sender, Group * reciever) {
  SignalStruct sig;
  sig.signal = signal;
  sig.delay = delay;
  sig.sender = sender;
  sig.reciever = reciever;
  // add the signal to the buffer 
  m_vSignalBuffer.push_back(sig);
}

void SignalSender::addGroup(Group * g) {
  EmAssert(g != NULL, "Added NULL as a group to SignalSender");
  // TODO: check that the group is not added already
  m_vGroup.push_back(g);
}

void SignalSender::clear() {
  EM_COUT("SignalSender::clear()", 1);
  m_vSignal.clear();
  m_vSignalBuffer.clear();
  m_vGroup.clear();
}

/* Called each engine tick. */
void SignalSender::tick() {
  EM_COUT("SignalSender::tick() " << m_vGroup.size() << " groups", 0);
  // use a buffer to avoid changes in m_vSignal during loop
  vector<SignalStruct>::iterator sigIter = m_vSignalBuffer.begin();
  vector<SignalStruct>::iterator sigEnd = m_vSignalBuffer.end();
  for (; sigIter != sigEnd; sigIter++) {
    m_vSignal.push_back((*sigIter));
  }
  m_vSignalBuffer.clear();

  // send signals
  sigIter = m_vSignal.begin();
  sigEnd = m_vSignal.end();
  for (; sigIter != sigEnd; ++sigIter) {
    // check the delay and re-add it to the buffer
    if ((*sigIter).delay > 0) {
      (*sigIter).delay--;
      m_vSignalBuffer.push_back((*sigIter));
      continue;
    }
    // send to groups
    vector<Group*>::iterator groupIter = m_vGroup.begin();
    vector<Group*>::iterator groupEnd = m_vGroup.end();
    for(; groupIter != groupEnd; ++groupIter) {
      if ((*groupIter)->m_iProperties & EM_GROUP_NO_SIGNAL) continue;
      // check the address, NULL is multicast
      if ((*sigIter).reciever != NULL && (*sigIter).reciever != (*groupIter)) continue;
      // call onSignal function i behaviors
      // TODO: should use a hashtable for groups
      //cerr << "size " << (*groupIter)->m_vBehavior.size() << endl;

      // 			vector<Behavior*>::iterator behIter = (*groupIter)->m_vBehavior.begin();
      // 			vector<Behavior*>::iterator behEnd = (*groupIter)->m_vBehavior.end();
      // 			for (; behIter != behEnd; ++behIter) {
      // 				(*behIter)->onSignal((*sigIter).signal, (*sigIter).sender);
      // 			}
      if ((*groupIter)->getBehavior() != NULL) {
	(*groupIter)->getBehavior()->onSignal((*sigIter).signal, (*sigIter).sender);
      }
    }
  }
  m_vSignal.clear();
}