Commit bea85f0ebc1e231d1b8451fe19174ff1aaf2f320

Authored by NabiyevTR
Committed by GitHub
1 parent 9a4c5621

Update Dali.cpp

Showing 1 changed file with 144 additions and 33 deletions
Dali.cpp
1 1  
  2 +
2 3 #include "Dali.h"
3 4 #include <SoftwareSerial.h>
4 5  
... ... @@ -54,6 +55,7 @@ void Dali::setupTransmit(uint8_t pin)
54 55 #else
55 56 delay1 = (HALF_BIT_INTERVAL >> speedFactor) - compensationFactor;
56 57 delay2 = (HALF_BIT_INTERVAL >> speedFactor) - 2;
  58 + period = delay1 + delay2;
57 59  
58 60 #if F_CPU == 1000000UL
59 61 delay2 -= 22; //22+2 = 24 is divisible by 8
... ... @@ -186,7 +188,7 @@ int Dali::maxResponseLevel()
186 188  
187 189  
188 190 for (idalistep = 0; idalistep < dali.daliTimeout; idalistep = idalistep + dalistep) {
189   - dalidata = analogRead(RxAnalogPin);
  191 + dalidata = analogRead(dali.RxAnalogPin);
190 192 if (dalidata > rxmax) {
191 193 rxmax = dalidata;
192 194 };
... ... @@ -205,44 +207,65 @@ void Dali::scanShortAdd()
205 207 const uint8_t finish_ind_adress = 127;
206 208 uint8_t add_byte;
207 209 uint8_t device_short_add;
208   - String response;
  210 + uint8_t response;
209 211  
210 212 dali.transmit(BROADCAST_C, OFF_C); // Broadcast Off
211 213 delay(delayTime);
212   - Serial.println("Short addresses:");
  214 +
  215 + if (dali.msgMode) {
  216 + Serial.println("Short addresses:");
  217 + }
213 218  
214 219 for (device_short_add = start_ind_adress; device_short_add <= 63; device_short_add++) {
215 220  
216 221 add_byte = 1 + (device_short_add << 1); // convert short address to address byte
217   -
218 222  
219   - dali.transmit(add_byte, QUERY_STATUS); //query status
220   -
  223 +
  224 + dali.transmit(add_byte, 0xA1);
  225 +
  226 + response = dali.receive();
  227 +
  228 + if (dali.getResponse) {
221 229  
222   - if (minResponseLevel() < dali.analogLevel) {
223   - response = "YES";
224 230 dali.transmit(add_byte, ON_C); // switch on
225 231 delay(1000);
226 232 dali.transmit(add_byte, OFF_C); // switch off
227 233 delay(1000);
  234 +
228 235 }
229 236 else {
230   - response = "NO";
  237 + response = 0;
231 238 }
232 239  
233 240  
234   - Serial.print("BIN: ");
235   - Serial.print(device_short_add, BIN);
236   - Serial.print(" ");
237   - Serial.print("DEC: ");
238   - Serial.print(device_short_add, DEC);
239   - Serial.print(" ");
240   - Serial.print("HEX: ");
241   - Serial.print(device_short_add, HEX);
242   - Serial.print(" ");
243   - Serial.print("Response: ");
244   - Serial.print(response);
245   - Serial.println();
  241 +
  242 + if (dali.msgMode) {
  243 + Serial.print("BIN: ");
  244 + Serial.print(device_short_add, BIN);
  245 + Serial.print(" ");
  246 + Serial.print("DEC: ");
  247 + Serial.print(device_short_add, DEC);
  248 + Serial.print(" ");
  249 + Serial.print("HEX: ");
  250 + Serial.print(device_short_add, HEX);
  251 + Serial.print(" ");
  252 + if (dali.getResponse) {
  253 + Serial.print("Get response");
  254 + }
  255 + else {
  256 + Serial.print("No response");
  257 + }
  258 + Serial.println();
  259 + }
  260 + else {
  261 + if (dali.getResponse) {
  262 + Serial.println(255, BIN);
  263 + }
  264 + else {
  265 + Serial.println(0, BIN);
  266 + }
  267 +
  268 + }
246 269  
247 270 }
248 271  
... ... @@ -303,7 +326,6 @@ void Dali::initialisation() {
303 326 uint8_t short_add = 0;
304 327 uint8_t cmd2;
305 328  
306   -
307 329 delay(delaytime);
308 330 dali.transmit(BROADCAST_C, RESET);
309 331 delay(delaytime);
... ... @@ -319,7 +341,9 @@ void Dali::initialisation() {
319 341 delay(delaytime);
320 342 dali.transmit(0b10100111, 0b00000000); //randomise
321 343  
322   - Serial.println("Searching fo long addresses:");
  344 + if (dali.msgMode) {
  345 + Serial.println("Searching fo long addresses:");
  346 + }
323 347  
324 348 while (longadd <= 0xFFFFFF - 2 and short_add <= 64) {
325 349 while ((high_longadd - low_longadd) > 1) {
... ... @@ -345,15 +369,20 @@ void Dali::initialisation() {
345 369  
346 370 longadd = (low_longadd + high_longadd) / 2; //center
347 371  
348   - Serial.print("BIN: ");
349   - Serial.print(longadd + 1, BIN);
350   - Serial.print(" ");
351   - Serial.print("DEC: ");
352   - Serial.print(longadd + 1, DEC);
353   - Serial.print(" ");
354   - Serial.print("HEX: ");
355   - Serial.print(longadd + 1, HEX);
356   - Serial.println();
  372 + if (dali.msgMode) {
  373 + Serial.print("BIN: ");
  374 + Serial.print(longadd + 1, BIN);
  375 + Serial.print(" ");
  376 + Serial.print("DEC: ");
  377 + Serial.print(longadd + 1, DEC);
  378 + Serial.print(" ");
  379 + Serial.print("HEX: ");
  380 + Serial.print(longadd + 1, HEX);
  381 + Serial.println();
  382 + }
  383 + else {
  384 + Serial.println(longadd + 1);
  385 + }
357 386 } // second while
358 387  
359 388  
... ... @@ -376,14 +405,18 @@ void Dali::initialisation() {
376 405 delay(delaytime);
377 406 short_add++;
378 407  
  408 + if (dali.msgMode) {
379 409 Serial.println("Assigning a short address");
  410 + }
380 411  
381 412 high_longadd = 0xFFFFFF;
382 413 longadd = (low_longadd + high_longadd) / 2;
383 414  
384 415 }
385 416 else {
386   - Serial.println("End");
  417 + if (dali.msgMode) {
  418 + Serial.println("End");
  419 + }
387 420 }
388 421 } // first while
389 422  
... ... @@ -393,6 +426,84 @@ void Dali::initialisation() {
393 426 }
394 427  
395 428  
  429 +uint8_t Dali::receive() {
  430 +
  431 +
  432 +
  433 + unsigned long startFuncTime = 0;
  434 + bool previousLogicLevel = 1;
  435 + bool currentLogicLevel = 1;
  436 + uint8_t arrLength = 20;
  437 + int timeArray[arrLength];
  438 + int i = 0;
  439 + int k = 0;
  440 + bool logicLevelArray[arrLength];
  441 + int response = 0;
  442 +
  443 + dali.getResponse = false;
  444 + startFuncTime = micros();
  445 +
  446 + // add check for micros overlap here!!!
  447 +
  448 + while (micros() - startFuncTime < dali.daliTimeout and i < arrLength)
  449 + {
  450 + // geting response
  451 + if (analogRead(dali.RxAnalogPin) > dali.analogLevel) {
  452 + currentLogicLevel = 1;
  453 + }
  454 + else {
  455 + currentLogicLevel = 0;
  456 + }
  457 +
  458 + if (previousLogicLevel != currentLogicLevel) {
  459 + timeArray[i] = micros() - startFuncTime;
  460 + logicLevelArray[i] = currentLogicLevel;
  461 + previousLogicLevel = currentLogicLevel;
  462 + dali.getResponse = true;
  463 + i++;
  464 +
  465 + }
  466 + }
  467 +
  468 +
  469 +
  470 + arrLength = i;
  471 +
  472 + //decoding to manchester
  473 + for (i = 0; i < arrLength - 1; i++) {
  474 + if ((timeArray[i + 1] - timeArray[i]) > 0.75 * dali.period) {
  475 + for (k = arrLength; k > i; k--) {
  476 + timeArray[k] = timeArray[k - 1];
  477 + logicLevelArray[k] = logicLevelArray[k - 1];
  478 + }
  479 + arrLength++;
  480 + timeArray[i + 1] = (timeArray[i] + timeArray[i + 2]) / 2;
  481 + logicLevelArray[i + 1] = logicLevelArray[i];
  482 + }
  483 + }
  484 +
  485 +
  486 +
  487 +
  488 +
  489 + k = 8;
  490 +
  491 + for (i = 1; i < arrLength; i++) {
  492 + if (logicLevelArray[i] == 1) {
  493 + if ((int)round((timeArray[i] - timeArray[0]) / (0.5 * dali.period)) & 1) {
  494 + response = response + (1 << k);
  495 + }
  496 + k--;
  497 + }
  498 + }
  499 +
  500 +
  501 + //remove start bit
  502 + response = (uint8_t)response;
  503 +
  504 + return response;
  505 +
  506 +}
396 507  
397 508  
398 509  
... ...