Accessories
Arduino for motors and lights library.
AccessoryLightMulti.cpp
1 /**********************************************************************
2 project: <Accessories>
3 author: <Thierry PARIS>
4 description: <Class for a light, flashing or not, with optional fading>
5 ***********************************************************************/
6 
7 #include "Accessories.h"
8 #include "AccessoryLightMulti.hpp"
9 
10 #ifndef NO_LIGHT
11 
13 {
14  this->lightsSize = 0;
15  this->pLights = NULL;
16  this->pMovingPositionBlinks = NULL;
17 }
18 
19 #ifdef ACCESSORIES_DEBUG_MODE
20 void AccessoryLightMulti::CheckPort() const
21 {
22  for (uint8_t i = 0; i < this->lightsSize; i++)
23  {
24  if (this->pLights[i].GetPort() == NULL)
25  {
26  Serial.println(F("One light in a multilight accessory have no port !"));
27  }
28  }
29 }
30 #endif
31 
32 void AccessoryLightMulti::begin(unsigned long inId, uint8_t inSize, unsigned long inBlinkDuration)
33 {
34  this->lightsSize = inSize;
35 
36  this->pLights = new AccessoryBaseLight[inSize];
37  this->SetDuration(inBlinkDuration);
38 
39  for (uint8_t i = 0; i < inSize; i++)
40  {
41  this->pLights[i].pOwner = this;
42  // This is the default value for the blinking delay, which can be overwritten by individual SetBlinking()
43  // on a particular light.
44  this->pLights[i].SetBlinking(inBlinkDuration);
45  }
46 
47  this->pMovingPositionBlinks = NULL;
48 }
49 
51 {
52  if (this->pMovingPositionBlinks == NULL || inNewSize > this->GetMovingPositionSize())
53  {
54  int i = 0;
55  int *pNewMovingPositionBlinks = new int[inNewSize];
56  if (pMovingPositionBlinks != NULL)
57  for (i = 0; i < this->GetMovingPositionSize(); i++)
58  pNewMovingPositionBlinks[i] = this->pMovingPositionBlinks[i];
59 
60  for (; i < inNewSize; i++)
61  pNewMovingPositionBlinks[i] = 0;
62 
63  if (this->pMovingPositionBlinks != NULL)
64  delete[] this->pMovingPositionBlinks;
65  this->pMovingPositionBlinks = pNewMovingPositionBlinks;
66  }
67 }
68 
69 unsigned char AccessoryLightMulti::AddMovingPosition(unsigned long inIdMin, int inOnMask, int inBlinkMask)
70 {
71  unsigned char pos = Accessory::AddMovingPosition(inIdMin, inOnMask);
72 
74  this->pMovingPositionBlinks[pos] = inBlinkMask;
75 
76  return pos;
77 }
78 
79 void AccessoryLightMulti::beginLight(uint8_t inIndex, Port *inpPort, int inIntensity)
80 {
81  this->pLights[inIndex].begin(inpPort, inIntensity, this);
82  this->LightOff(inIndex);
83 }
84 
86 {
87  for (uint8_t i = 0; i < this->lightsSize; i++)
88  this->LightOn(i);
89 }
90 
92 {
93  for (uint8_t i = 0; i < this->lightsSize; i++)
94  this->LightOff(i);
95 }
96 
98 {
99  for (uint8_t i = 0; i < this->lightsSize; i++)
100  this->Blink(i);
101 }
102 
103 bool AccessoryLightMulti::ActionEnded()
104 {
105  bool res = false;
106  for (uint8_t i = 0; i < this->lightsSize; i++)
107  res |= this->ActionEnded(i);
108 
109  return res;
110 }
111 
112 ACC_STATE AccessoryLightMulti::Toggle()
113 {
114  ACC_STATE localState = ACC_STATE::STATE_NONE;
115 
116  for (uint8_t i = 0; i < this->lightsSize; i++)
117  localState = this->Toggle(i);
118 
119  return localState;
120 }
121 
122 void AccessoryLightMulti::Move(int inPosition)
123 {
124  if (inPosition != -1)
125  {
126  for (uint8_t i = 0; i < this->lightsSize; i++)
127  if (inPosition & (1 << i))
128  this->SetState(i, LIGHTON);
129  else
130  this->SetState(i, LIGHTOFF);
131  }
132 }
133 
134 void AccessoryLightMulti::MoveBlink(int inOnMask, int inBlinkMask)
135 {
136  if (inOnMask != -1)
137  {
138  for (uint8_t i = 0; i < this->lightsSize; i++)
139  {
140  this->SetBlinking(i, 0);
141  if (inOnMask & (1 << i))
142  {
143  if (inBlinkMask & (1 << i))
144  {
145  this->SetBlinking(i, this->GetDuration());
146  this->SetState(i, LIGHTBLINK);
147  }
148  else
149  this->SetState(i, LIGHTON);
150  }
151  else
152  this->SetState(i, LIGHTOFF);
153  }
154  }
155 }
156 
157 void AccessoryLightMulti::Move(unsigned long inId)
158 {
159  int positionIndex = this->IndexOfMovingPositionById(inId);
160 
161  if (positionIndex != -1)
162  {
163  int position = this->GetMovingPositionValueById(inId);
164  if (this->pMovingPositionBlinks != NULL)
165  MoveBlink(position, this->pMovingPositionBlinks[positionIndex]);
166  else
167  Move(position);
168  }
169  else
170  {
171  for (uint8_t i = 0; i < this->lightsSize; i++)
172  this->Toggle(i);
173  }
174 }
175 
176 void AccessoryLightMulti::Event(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent, int inData)
177 {
178  int positionIndex = -1;
179  if (inEvent == ACCESSORIES_EVENT_MOVEPOSITIONID)
180  positionIndex = this->IndexOfMovingPositionById(inId);
181  if (inEvent == ACCESSORIES_EVENT_MOVEPOSITIONINDEX)
182  positionIndex = inData;
183 
184  if (positionIndex > -1)
185  {
186  this->SetLastMovingPosition(positionIndex);
187 
188  if (this->pMovingPositionBlinks != NULL)
189  this->MoveBlink(this->GetMovingPositionValueByIndex(positionIndex), this->pMovingPositionBlinks[positionIndex]);
190  else
191  this->Move(this->GetMovingPositionValueByIndex(positionIndex));
192  return;
193  }
194 
195  switch (inEvent)
196  {
197  case ACCESSORIES_EVENT_TOGGLE:
198  this->Toggle();
199  break;
200 
201  case ACCESSORIES_EVENT_MOVE:
202  switch (inData)
203  {
204  case ACCESSORIES_MOVE_STRAIGHT:
205  case ACCESSORIES_MOVE_TOP:
206  case ACCESSORIES_MOVE_LEFT:
207  case ACCESSORIES_MOVE_DIVERGE:
208  case ACCESSORIES_MOVE_BOTTOM:
209  case ACCESSORIES_MOVE_RIGHT:
210  case ACCESSORIES_MOVE_ON:
211  this->LightOn();
212  break;
213  case ACCESSORIES_MOVE_OFF:
214  case ACCESSORIES_MOVE_STOP:
215  this->LightOff();
216  break;
217  case ACCESSORIES_MOVE_MORE:
218  case ACCESSORIES_MOVE_LESS:
219  {
220  for (uint8_t i = 0; i < this->lightsSize; i++)
221  {
222  int oldValue = this->pLights[i].pPort->GetSpeed();
223  this->pLights[i].pPort->SetSpeed(oldValue + inData);
224  this->LightOn(i);
225  this->pLights[i].pPort->SetSpeed(oldValue);
226  }
227  }
228  break;
229  }
230  break;
231 
232  case ACCESSORIES_EVENT_MOVEPOSITION:
233  {
234  for (uint8_t i = 0; i < this->lightsSize; i++)
235  {
236  int oldValue = this->pLights[i].pPort->GetSpeed();
237  this->pLights[i].pPort->SetSpeed(inData);
238  this->LightOn(i);
239  this->pLights[i].pPort->SetSpeed(oldValue);
240  }
241  }
242  break;
243 
244  case ACCESSORIES_EVENT_SETSPEED:
245  for (uint8_t i = 0; i < this->lightsSize; i++)
246  this->pLights[i].pPort->SetSpeed(inData);
247  break;
248 
249  default:
250  break;
251  }
252 }
253 
254 #ifndef NO_EEPROM
255 int AccessoryLightMulti::EEPROMSave(int inPos, bool inSimulate)
256 {
257  for (uint8_t i = 0; i < this->lightsSize; i++)
258  inPos = this->pLights[i].EEPROMSave(inPos, inSimulate);
259 
260  return inPos;
261 }
262 
263 int AccessoryLightMulti::EEPROMLoad(int inPos)
264 {
265  for (uint8_t i = 0; i < this->lightsSize; i++)
266  inPos = this->pLights[i].EEPROMLoad(inPos);
267 
268  return inPos;
269 }
270 #endif
271 #ifdef ACCESSORIES_PRINT_ACCESSORIES
272 void AccessoryLightMulti::printAccessory()
273 {
274  Serial.println(F(" LightMulti"));
275  for (uint8_t i = 0; i < this->lightsSize; i++)
276  {
277  Serial.print(F(" Light "));
278  Serial.print(i);
279  Serial.print(F(" : "));
280  this->pLights[i].printAccessory();
281  }
282  this->printMovingPositions();
283 }
284 
285 void AccessoryLightMulti::printMovingPositions()
286 {
287  for (int i = 0; i < this->GetMovingPositionSize(); i++)
288  {
289  Serial.print(F(" MovingPosition "));
290  Serial.print(i);
291  Serial.print(F(": id "));
292  Serial.print(this->GetMovingPositionIdByIndex(i));
293  Serial.print(F(" / pos "));
294  Serial.print(this->GetMovingPositionValueByIndex(i), BIN);
295  if (this->pMovingPositionBlinks != NULL)
296  {
297  Serial.print(F(" / blink "));
298  Serial.println(this->pMovingPositionBlinks[i], BIN);
299  }
300  else
301  Serial.println("");
302  }
303 }
304 #endif
305 
306 #endif
unsigned long GetMovingPositionIdByIndex(uint8_t inIndex) const
Definition: Accessory.hpp:339
Port * pPort
Definition: Accessory.hpp:187
virtual int SetSpeed(int inSpeed)
Definition: Port.cpp:108
int GetMovingPositionValueByIndex(uint8_t inIndex) const
Definition: Accessory.hpp:333
void Event(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONID, int inData = 0)
int GetMovingPositionValueById(unsigned long inId) const
Definition: Accessory.hpp:327
uint8_t IndexOfMovingPositionById(unsigned long inId) const
Definition: Accessory.cpp:95
unsigned long GetDuration() const
Definition: Accessory.hpp:266
void SetBlinking(uint8_t inIndex, unsigned long inBlinkingDelay)
void SetLastMovingPosition(uint8_t inLastPositionIndex)
Definition: Accessory.cpp:216
void begin(Port *inpPort, int inIntensity = 255, Accessory *inpOwner = 0)
Definition: Port.hpp:61
void beginLight(uint8_t inIndex, Port *inpPort, int inIntensity = 255)
uint8_t AddMovingPosition(unsigned long inId, int inPosition)
Definition: Accessory.cpp:58
int GetSpeed() const
Definition: Port.hpp:126
unsigned char AddMovingPosition(unsigned long inId, int inOnMask, int inBlinkMask = 0)
const uint8_t GetMovingPositionSize() const
Definition: Accessory.hpp:349
void AdjustMovingPositionBlinksSize(uint8_t inNewSize)
void SetBlinking(unsigned long inBlinkingDelay)
void SetDuration(unsigned long inDuration)
Definition: Accessory.hpp:370
void begin(unsigned long inId, uint8_t inSize, unsigned long inBlinkDuration)
Port * GetPort() const
Definition: Accessory.hpp:205