EZR
Dependencies: CRC16 FreescaleIAP FreescaleWatchdog GGSProtocol LM75B PIMA Parameters PersistentCircularQueue SerialNumberV2COM mbed-dev-watchdog_2016_03_04
Fork of smartRamalKW by
announce.cpp@35:78614a27b9e6, 2016-06-16 (annotated)
- Committer:
- fprado
- Date:
- Thu Jun 16 18:55:57 2016 +0000
- Revision:
- 35:78614a27b9e6
- Parent:
- 34:5ed86c867c08
temporary snapshot
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tpadovani | 25:2c578b923ea9 | 1 | #include "announce.h" |
tpadovani | 25:2c578b923ea9 | 2 | |
tpadovani | 25:2c578b923ea9 | 3 | Announce::Announce(){ |
tpadovani | 25:2c578b923ea9 | 4 | announceDelayAngCoef = 1; |
tpadovani | 25:2c578b923ea9 | 5 | announceDelayLinCoef = 0; |
tpadovani | 25:2c578b923ea9 | 6 | announceIntervalSec = 600; |
tpadovani | 25:2c578b923ea9 | 7 | silenceIntervalSec = 2; |
tpadovani | 25:2c578b923ea9 | 8 | sendNow = false; |
tpadovani | 25:2c578b923ea9 | 9 | } |
tpadovani | 25:2c578b923ea9 | 10 | |
tpadovani | 25:2c578b923ea9 | 11 | void Announce::setDelayCoefs(int delayAngCoef, int delayLinCoef){ |
tpadovani | 25:2c578b923ea9 | 12 | announceDelayAngCoef = delayAngCoef; |
tpadovani | 25:2c578b923ea9 | 13 | announceDelayLinCoef = delayLinCoef; |
tpadovani | 25:2c578b923ea9 | 14 | } |
tpadovani | 25:2c578b923ea9 | 15 | |
tpadovani | 25:2c578b923ea9 | 16 | void Announce::setIntervals(int announce, int silence){ |
tpadovani | 25:2c578b923ea9 | 17 | announceIntervalSec = announce; |
tpadovani | 25:2c578b923ea9 | 18 | silenceIntervalSec = silence; |
tpadovani | 25:2c578b923ea9 | 19 | } |
tpadovani | 25:2c578b923ea9 | 20 | |
tpadovani | 25:2c578b923ea9 | 21 | void Announce::startAnnounceTimer(){ |
tpadovani | 25:2c578b923ea9 | 22 | announceBuffer[0] = PREAMBULO1; |
tpadovani | 25:2c578b923ea9 | 23 | announceBuffer[1] = PREAMBULO2; |
tpadovani | 25:2c578b923ea9 | 24 | announceBuffer[2] = TAMANHO_ENDERECO + TAMANHO_ENDERECO + 2 + MEDIDOR_LENGTH; // 25 |
tpadovani | 25:2c578b923ea9 | 25 | |
tpadovani | 25:2c578b923ea9 | 26 | for(int i=0; i < TAMANHO_ENDERECO; i++){ |
tpadovani | 25:2c578b923ea9 | 27 | announceBuffer[i+3] = ((sn.get()[2*i+9] & 0x0f) << 4) | (sn.get()[2*i+10] & 0x0f); |
tpadovani | 25:2c578b923ea9 | 28 | } |
tpadovani | 25:2c578b923ea9 | 29 | |
tpadovani | 25:2c578b923ea9 | 30 | for(int i=0; i < 8; i++){ |
tpadovani | 25:2c578b923ea9 | 31 | announceBuffer[i+11] = 0xff; |
tpadovani | 25:2c578b923ea9 | 32 | } |
tpadovani | 25:2c578b923ea9 | 33 | announceBuffer[19] = 0x00; // Numero de sequencia |
tpadovani | 25:2c578b923ea9 | 34 | announceBuffer[20] = CMD_BUSCAR_CONCENTRADOR; |
tpadovani | 25:2c578b923ea9 | 35 | |
tpadovani | 25:2c578b923ea9 | 36 | delay = announceDelayAngCoef * (((sn.get()[23] & 0x0f)*10) + (sn.get()[24] & 0x0f)) + announceDelayLinCoef; // Delay variavel de acordo com o numero de serie do modulo |
tpadovani | 25:2c578b923ea9 | 37 | DEBUG(printf("[GGS] Sending announce in %d ms...\r\n", delay)); |
tpadovani | 25:2c578b923ea9 | 38 | |
tpadovani | 25:2c578b923ea9 | 39 | announceTimeout.attach_us(this, &Announce::triggerAnnounceSending, delay*1000); |
tpadovani | 25:2c578b923ea9 | 40 | } |
tpadovani | 25:2c578b923ea9 | 41 | |
tpadovani | 25:2c578b923ea9 | 42 | void Announce::stopAnnounceTimer(){ |
tpadovani | 25:2c578b923ea9 | 43 | announceTimeout.detach(); |
tpadovani | 25:2c578b923ea9 | 44 | } |
tpadovani | 25:2c578b923ea9 | 45 | |
tpadovani | 25:2c578b923ea9 | 46 | void Announce::triggerAnnounceSending(){ |
tpadovani | 25:2c578b923ea9 | 47 | sendNow = true; |
tpadovani | 25:2c578b923ea9 | 48 | } |
tpadovani | 25:2c578b923ea9 | 49 | |
tpadovani | 25:2c578b923ea9 | 50 | void Announce::handleAnnounceSending(){ |
tpadovani | 25:2c578b923ea9 | 51 | if(!sendNow){ |
tpadovani | 25:2c578b923ea9 | 52 | return; |
tpadovani | 25:2c578b923ea9 | 53 | } |
tpadovani | 25:2c578b923ea9 | 54 | sendNow = false; |
tpadovani | 25:2c578b923ea9 | 55 | |
tpadovani | 25:2c578b923ea9 | 56 | if(exec.getTimerGGS() < (float)silenceIntervalSec){ |
tpadovani | 25:2c578b923ea9 | 57 | DEBUG(printf("[GGS] Network busy. Sending announce in %d ms...\r\n", delay)); |
tpadovani | 25:2c578b923ea9 | 58 | announceTimeout.attach_us(this, &Announce::triggerAnnounceSending, delay*1000); |
tpadovani | 25:2c578b923ea9 | 59 | return; |
tpadovani | 25:2c578b923ea9 | 60 | } |
tpadovani | 25:2c578b923ea9 | 61 | |
fprado | 34:5ed86c867c08 | 62 | announceBuffer[19]++; |
fprado | 34:5ed86c867c08 | 63 | announceBuffer[19] %= 256; |
fprado | 26:03c9ca836c79 | 64 | #ifdef RAMAL |
fprado | 26:03c9ca836c79 | 65 | memcpy(announceBuffer+21, MEDIDOR_DEFAULT_SN, MEDIDOR_LENGTH); |
fprado | 26:03c9ca836c79 | 66 | #else |
tpadovani | 25:2c578b923ea9 | 67 | memcpy(announceBuffer+21, pima.getMeterNumber(), MEDIDOR_LENGTH); |
fprado | 26:03c9ca836c79 | 68 | #endif |
tpadovani | 25:2c578b923ea9 | 69 | unsigned short int crc = getCRC(announceBuffer, 2, announceBuffer[2] + 1); |
tpadovani | 25:2c578b923ea9 | 70 | announceBuffer[28] = crc%256; // CRC1 |
tpadovani | 25:2c578b923ea9 | 71 | announceBuffer[29] = crc/256; // CRC2 |
tpadovani | 25:2c578b923ea9 | 72 | enviaRespostaGGS(announceBuffer, 30); |
tpadovani | 25:2c578b923ea9 | 73 | |
tpadovani | 25:2c578b923ea9 | 74 | DEBUG(printf("[GGS] Sending new announce in %d s\r\n", announceIntervalSec + delay/1000)); |
tpadovani | 25:2c578b923ea9 | 75 | announceTimeout.attach_us(this, &Announce::triggerAnnounceSending, announceIntervalSec*1000*1000 + delay*1000); |
tpadovani | 25:2c578b923ea9 | 76 | } |