EZR
Dependencies: CRC16 FreescaleIAP FreescaleWatchdog GGSProtocol LM75B PIMA Parameters PersistentCircularQueue SerialNumberV2COM mbed-dev-watchdog_2016_03_04
Fork of smartRamalKW by
main.cpp@31:ef0e073126a1, 2016-02-24 (annotated)
- Committer:
- fprado
- Date:
- Wed Feb 24 14:31:25 2016 +0000
- Revision:
- 31:ef0e073126a1
- Parent:
- 29:fec8fdf25d87
- Child:
- 32:dee631435a62
- Diretiva DIRECT_COM substitu?da por USE_PINO para manter compatibilidade da Classe GGSProtocol com usos anteriores.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tpadovani | 0:999112ad27f0 | 1 | #include "main.h" |
tpadovani | 0:999112ad27f0 | 2 | |
fprado | 29:fec8fdf25d87 | 3 | ////////////////////////////////////////////////////////////// |
fprado | 29:fec8fdf25d87 | 4 | // Global Variables |
tpadovani | 1:6ac7168763b6 | 5 | static Watchdog wd; |
tpadovani | 1:6ac7168763b6 | 6 | static Ticker tickerWd; |
tpadovani | 5:1bc98277c257 | 7 | SerialNumber sn; |
tpadovani | 10:7a1d1abb5172 | 8 | Parameters param ((char *)&APP_PARAMETERS, sizeof(APP_PARAMETERS)); |
tpadovani | 10:7a1d1abb5172 | 9 | CommandExecutor exec; |
tpadovani | 10:7a1d1abb5172 | 10 | MemoriaMassa mm; |
tpadovani | 13:eed9484a89bc | 11 | Alarm alarm; |
fprado | 26:03c9ca836c79 | 12 | #ifndef RAMAL // objetos só existem se o equipamento é um smart breaker |
tpadovani | 19:1f623070b9dd | 13 | BoxAlarm boxAlarm; |
tpadovani | 19:1f623070b9dd | 14 | Pima pima; |
fprado | 26:03c9ca836c79 | 15 | #endif |
tpadovani | 25:2c578b923ea9 | 16 | Announce announce; |
tpadovani | 0:999112ad27f0 | 17 | |
fprado | 29:fec8fdf25d87 | 18 | ////////////////////////////////////////////////////////////// |
fprado | 29:fec8fdf25d87 | 19 | // External vars |
fprado | 29:fec8fdf25d87 | 20 | |
fprado | 29:fec8fdf25d87 | 21 | #ifdef MBED_COMPILER |
fprado | 29:fec8fdf25d87 | 22 | static const uint32_t _NodeAddress = DEFAULT_NODE_ADDRESS; |
fprado | 29:fec8fdf25d87 | 23 | static const uint32_t _NetworkAddress = DEFAULT_NETWORK_ADDRESS; |
fprado | 29:fec8fdf25d87 | 24 | static const uint32_t _NetworkChannel = DEFAULT_NETWORK_CHANNEL; |
fprado | 29:fec8fdf25d87 | 25 | static const uint32_t _NodeRole = DEFAULT_NODE_ROLE; |
fprado | 29:fec8fdf25d87 | 26 | static const uint32_t _SrcEndpoint = DEFAULT_SOURCE_ENDPOINT; |
fprado | 29:fec8fdf25d87 | 27 | static const uint32_t _DestNode = DEFAULT_DESTINATION_NODE; |
fprado | 29:fec8fdf25d87 | 28 | static const uint32_t _DestEndpoint = DEFAULT_DESTINATION_ENDPOINT; |
fprado | 29:fec8fdf25d87 | 29 | static const uint32_t _DynamicDest = DEFAULT_DYNAMIC_DESTINATION; |
fprado | 29:fec8fdf25d87 | 30 | static const uint32_t _AccessCycle = DEFAULT_ACCESS_CYCLE; |
fprado | 29:fec8fdf25d87 | 31 | static const uint8_t _AppConfigDataPayload[APP_CONFIG_DATA_SIZE] = { |
fprado | 29:fec8fdf25d87 | 32 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
fprado | 29:fec8fdf25d87 | 33 | }; |
fprado | 29:fec8fdf25d87 | 34 | #else |
fprado | 29:fec8fdf25d87 | 35 | extern volatile uint32_t _NodeAddress; |
fprado | 29:fec8fdf25d87 | 36 | extern volatile uint32_t _NetworkAddress; |
fprado | 29:fec8fdf25d87 | 37 | extern volatile uint32_t _NetworkChannel; |
fprado | 29:fec8fdf25d87 | 38 | extern volatile uint32_t _NodeRole; |
fprado | 29:fec8fdf25d87 | 39 | extern volatile uint32_t _SrcEndpoint; |
fprado | 29:fec8fdf25d87 | 40 | extern volatile uint32_t _DestNode; |
fprado | 29:fec8fdf25d87 | 41 | extern volatile uint32_t _DestEndpoint; |
fprado | 29:fec8fdf25d87 | 42 | extern volatile uint32_t _DynamicDest; |
fprado | 29:fec8fdf25d87 | 43 | extern volatile uint32_t _AccessCycle; |
fprado | 29:fec8fdf25d87 | 44 | extern volatile uint8_t _AppConfigData; |
fprado | 29:fec8fdf25d87 | 45 | const uint8_t * _AppConfigDataPayload = const_cast< const uint8_t * >( &_AppConfigData ); |
fprado | 29:fec8fdf25d87 | 46 | #endif |
fprado | 29:fec8fdf25d87 | 47 | |
fprado | 29:fec8fdf25d87 | 48 | ////////////////////////////////////////////////////////////// |
fprado | 29:fec8fdf25d87 | 49 | // Main |
fprado | 29:fec8fdf25d87 | 50 | |
tpadovani | 0:999112ad27f0 | 51 | int main() |
tpadovani | 0:999112ad27f0 | 52 | { |
fprado | 29:fec8fdf25d87 | 53 | #ifdef WATCHDOG_ENABLED |
tpadovani | 1:6ac7168763b6 | 54 | iniciaWd(); |
fprado | 29:fec8fdf25d87 | 55 | #endif |
tpadovani | 19:1f623070b9dd | 56 | blinkLeds(); |
tpadovani | 0:999112ad27f0 | 57 | |
tpadovani | 22:b66e36356dd4 | 58 | DEBUG(printf("##### %s #####\r\n", version)); |
tpadovani | 22:b66e36356dd4 | 59 | DEBUG(printSerialNumber()); |
tpadovani | 1:6ac7168763b6 | 60 | |
tpadovani | 3:21598044a47f | 61 | param.loadParameters(); |
tpadovani | 22:b66e36356dd4 | 62 | DEBUG(printParameters()); |
tpadovani | 22:b66e36356dd4 | 63 | |
tpadovani | 22:b66e36356dd4 | 64 | isopowerDisable = 0; // Habilita regulador (PIMA + Alarme Caixa) |
fprado | 29:fec8fdf25d87 | 65 | |
fprado | 26:03c9ca836c79 | 66 | #ifndef RAMAL |
tpadovani | 19:1f623070b9dd | 67 | boxAlarm.init(); |
fprado | 26:03c9ca836c79 | 68 | #endif |
tpadovani | 13:eed9484a89bc | 69 | alarm.loadQueue(APP_PARAMETERS.ALARMS_QUEUE_SIZE, 3); |
tpadovani | 22:b66e36356dd4 | 70 | mm.iniciaLeituras(APP_PARAMETERS.INTERVALO_MM_S, APP_PARAMETERS.MM_SIZE, 4, 5, 6); |
tpadovani | 10:7a1d1abb5172 | 71 | |
fprado | 26:03c9ca836c79 | 72 | #ifndef RAMAL |
tpadovani | 19:1f623070b9dd | 73 | pima.setExpirationTimeout(APP_PARAMETERS.PIMA_VALIDADE_MEDIDOR_S, APP_PARAMETERS.PIMA_VALIDADE_ENERGIA_ATIVA_S, APP_PARAMETERS.PIMA_VALIDADE_ENERGIA_REATIVA_INDUTIVA_S, APP_PARAMETERS.PIMA_VALIDADE_ENERGIA_REATIVA_CAPACITIVA_S); |
tpadovani | 19:1f623070b9dd | 74 | if(APP_PARAMETERS.PROTOCOLO_MEDIDOR == PROTOCOLO_PIMINHA){ |
tpadovani | 19:1f623070b9dd | 75 | pima.iniciaLeituraPiminha(APP_PARAMETERS.PIMA_AUTOBAUD_ENABLE, APP_PARAMETERS.PIMA_AUTOBAUD_TIMEOUT_S, APP_PARAMETERS.INTERVALO_WD_METER_S, APP_PARAMETERS.PIMA_TIMEOUT_PACOTE_S); |
tpadovani | 19:1f623070b9dd | 76 | } else{ |
tpadovani | 19:1f623070b9dd | 77 | pima.iniciaLeituraPima(APP_PARAMETERS.PIMA_AUTOBAUD_ENABLE, APP_PARAMETERS.PIMA_AUTOBAUD_TIMEOUT_S, APP_PARAMETERS.INTERVALO_WD_METER_S); |
tpadovani | 19:1f623070b9dd | 78 | } |
fprado | 26:03c9ca836c79 | 79 | #endif |
tpadovani | 19:1f623070b9dd | 80 | |
fprado | 31:ef0e073126a1 | 81 | // initializes serial |
fprado | 31:ef0e073126a1 | 82 | #ifdef USE_PINO |
fprado | 31:ef0e073126a1 | 83 | pinoSerial.baud( APP_PARAMETERS.RADIO_BAUDRATE_BPS ); |
fprado | 31:ef0e073126a1 | 84 | #ifdef UART_8N2 |
fprado | 31:ef0e073126a1 | 85 | pinoSerial.format( 8, Serial::None, 2 ); |
fprado | 31:ef0e073126a1 | 86 | #endif |
fprado | 31:ef0e073126a1 | 87 | #else |
fprado | 29:fec8fdf25d87 | 88 | ggsStream.baud( APP_PARAMETERS.RADIO_BAUDRATE_BPS ); |
fprado | 29:fec8fdf25d87 | 89 | #ifdef UART_8N2 |
fprado | 29:fec8fdf25d87 | 90 | ggsStream.format( 8, Serial::None, 2 ); |
fprado | 29:fec8fdf25d87 | 91 | #endif |
fprado | 29:fec8fdf25d87 | 92 | #endif |
fprado | 29:fec8fdf25d87 | 93 | |
tpadovani | 3:21598044a47f | 94 | exec.carregaEndereco(sn.get()); |
tpadovani | 10:7a1d1abb5172 | 95 | exec.iniciaExecutorComandos(APP_PARAMETERS.INTERVALO_WD_NETWORK_S, APP_PARAMETERS.INTERVALO_SILENCIO_S); |
tpadovani | 25:2c578b923ea9 | 96 | announce.setDelayCoefs(APP_PARAMETERS.DISCOVERY_DELAY_ANG_COEF_MS, APP_PARAMETERS.DISCOVERY_DELAY_LIN_COEF_MS); |
tpadovani | 25:2c578b923ea9 | 97 | announce.setIntervals(APP_PARAMETERS.ANNOUNCE_INTERVAL_S, APP_PARAMETERS.INTERVALO_SILENCIO_S); |
tpadovani | 10:7a1d1abb5172 | 98 | |
fprado | 29:fec8fdf25d87 | 99 | |
fprado | 31:ef0e073126a1 | 100 | #ifdef USE_PINO |
fprado | 29:fec8fdf25d87 | 101 | // configures Pino stack |
fprado | 29:fec8fdf25d87 | 102 | ggsStream.init( _SrcEndpoint, _DestNode, _DestEndpoint, _DynamicDest ); |
fprado | 29:fec8fdf25d87 | 103 | PinoCfgStr pinoCfg = { |
fprado | 29:fec8fdf25d87 | 104 | .nodeAddress = _NodeAddress, |
fprado | 29:fec8fdf25d87 | 105 | .networkAddress = _NetworkAddress, |
fprado | 29:fec8fdf25d87 | 106 | .networkChannel = static_cast< uint8_t >( _NetworkChannel ), |
fprado | 29:fec8fdf25d87 | 107 | .nodeRole = static_cast< uint8_t >( _NodeRole ) |
fprado | 29:fec8fdf25d87 | 108 | }; |
fprado | 29:fec8fdf25d87 | 109 | ggsStream.checkCfg( pinoCfg, DEFAULT_PINO_CFG_ATTEMPTS ); |
fprado | 29:fec8fdf25d87 | 110 | |
fprado | 29:fec8fdf25d87 | 111 | // configures access cycle |
fprado | 29:fec8fdf25d87 | 112 | uint16_t newCycle = static_cast< uint16_t >( _AccessCycle ); |
fprado | 29:fec8fdf25d87 | 113 | ggsStream.checkCycle( newCycle, newCycle, DEFAULT_PINO_CFG_ATTEMPTS ); |
fprado | 29:fec8fdf25d87 | 114 | |
fprado | 29:fec8fdf25d87 | 115 | // waits for the stack to start |
fprado | 29:fec8fdf25d87 | 116 | ggsStream.checkStop( DEFAULT_PINO_START_ATTEMPTS, _AppConfigDataPayload ); |
fprado | 29:fec8fdf25d87 | 117 | ggsStream.setPerPoll( 2000 ); |
fprado | 29:fec8fdf25d87 | 118 | |
fprado | 29:fec8fdf25d87 | 119 | //AppConfigData cfg; |
fprado | 29:fec8fdf25d87 | 120 | //ggsStream.readMsapAppDataConfiguration( cfg ); |
fprado | 29:fec8fdf25d87 | 121 | //printf( "%u", cfg.seqNumber ); |
fprado | 29:fec8fdf25d87 | 122 | |
fprado | 29:fec8fdf25d87 | 123 | #endif |
fprado | 29:fec8fdf25d87 | 124 | |
tpadovani | 3:21598044a47f | 125 | while(1){ |
fprado | 31:ef0e073126a1 | 126 | #ifdef USE_PINO |
fprado | 29:fec8fdf25d87 | 127 | ggsStream.handleFrames(); |
fprado | 29:fec8fdf25d87 | 128 | ggsStream.handleStream(); |
fprado | 29:fec8fdf25d87 | 129 | #endif |
tpadovani | 3:21598044a47f | 130 | exec.trataPacoteGGS(); |
fprado | 26:03c9ca836c79 | 131 | #ifndef RAMAL |
tpadovani | 19:1f623070b9dd | 132 | pima.trataPacotePiminha(); |
tpadovani | 25:2c578b923ea9 | 133 | if(pima.hasMeterChanged()){ |
tpadovani | 25:2c578b923ea9 | 134 | announce.startAnnounceTimer(); |
tpadovani | 25:2c578b923ea9 | 135 | } |
fprado | 26:03c9ca836c79 | 136 | #endif |
tpadovani | 10:7a1d1abb5172 | 137 | mm.executaLeitura(); |
fprado | 26:03c9ca836c79 | 138 | #ifndef RAMAL |
tpadovani | 19:1f623070b9dd | 139 | boxAlarm.checkState(); |
fprado | 26:03c9ca836c79 | 140 | #endif |
tpadovani | 25:2c578b923ea9 | 141 | announce.handleAnnounceSending(); |
tpadovani | 3:21598044a47f | 142 | } |
tpadovani | 0:999112ad27f0 | 143 | |
tpadovani | 0:999112ad27f0 | 144 | } |
tpadovani | 1:6ac7168763b6 | 145 | void iniciaWd(){ |
tpadovani | 1:6ac7168763b6 | 146 | wd.Configure(); |
tpadovani | 1:6ac7168763b6 | 147 | tickerWd.attach(&feedWd, WATCHDOG_INTERVAL); |
tpadovani | 1:6ac7168763b6 | 148 | } |
tpadovani | 1:6ac7168763b6 | 149 | |
tpadovani | 1:6ac7168763b6 | 150 | void feedWd(){ |
tpadovani | 1:6ac7168763b6 | 151 | wd.Service(); |
tpadovani | 1:6ac7168763b6 | 152 | } |
tpadovani | 1:6ac7168763b6 | 153 | |
tpadovani | 3:21598044a47f | 154 | void softReset(){ |
tpadovani | 22:b66e36356dd4 | 155 | DEBUG(printf("[main] SoftReset\r\n")); |
tpadovani | 3:21598044a47f | 156 | tickerWd.detach(); |
tpadovani | 3:21598044a47f | 157 | } |
tpadovani | 3:21598044a47f | 158 | |
tpadovani | 19:1f623070b9dd | 159 | void blinkLeds(){ |
tpadovani | 23:85202a52482d | 160 | ledPowerON = LED_ON; |
tpadovani | 19:1f623070b9dd | 161 | ledNetwork = LED_OFF; |
tpadovani | 19:1f623070b9dd | 162 | ledMeter = LED_OFF; |
tpadovani | 23:85202a52482d | 163 | ledLoad = LED_OFF; |
tpadovani | 19:1f623070b9dd | 164 | ledBox = LED_OFF; |
tpadovani | 19:1f623070b9dd | 165 | |
tpadovani | 19:1f623070b9dd | 166 | wait_ms(200); |
tpadovani | 19:1f623070b9dd | 167 | ledNetwork = LED_ON; |
tpadovani | 19:1f623070b9dd | 168 | wait_ms(200); |
tpadovani | 19:1f623070b9dd | 169 | ledNetwork = LED_OFF; |
tpadovani | 19:1f623070b9dd | 170 | ledMeter = LED_ON; |
tpadovani | 19:1f623070b9dd | 171 | wait_ms(200); |
tpadovani | 19:1f623070b9dd | 172 | ledMeter = LED_OFF; |
tpadovani | 23:85202a52482d | 173 | ledLoad = LED_ON; |
tpadovani | 23:85202a52482d | 174 | wait_ms(200); |
tpadovani | 23:85202a52482d | 175 | ledLoad = LED_OFF; |
tpadovani | 19:1f623070b9dd | 176 | ledBox = LED_ON; |
tpadovani | 19:1f623070b9dd | 177 | wait_ms(200); |
tpadovani | 19:1f623070b9dd | 178 | ledBox = LED_OFF; |
tpadovani | 19:1f623070b9dd | 179 | } |
tpadovani | 19:1f623070b9dd | 180 | |
tpadovani | 3:21598044a47f | 181 | void printSerialNumber(){ |
tpadovani | 12:0f549dfba86c | 182 | printf("[main] SN: "); |
tpadovani | 3:21598044a47f | 183 | for(int i=0; i < SERIAL_LENGTH; i++){ |
tpadovani | 3:21598044a47f | 184 | printf("%c", sn.get()[i]); |
tpadovani | 3:21598044a47f | 185 | } |
tpadovani | 3:21598044a47f | 186 | printf("\r\n"); |
tpadovani | 3:21598044a47f | 187 | } |
tpadovani | 9:e501499af4ef | 188 | |
tpadovani | 9:e501499af4ef | 189 | void printParameters(){ |
tpadovani | 12:0f549dfba86c | 190 | printf("[main] Parameters:"); |
tpadovani | 9:e501499af4ef | 191 | for(int i=0; i < sizeof(APP_PARAMETERS); i++){ |
tpadovani | 10:7a1d1abb5172 | 192 | printf(" %02x", ((char *)&APP_PARAMETERS)[i]); |
tpadovani | 9:e501499af4ef | 193 | } |
tpadovani | 9:e501499af4ef | 194 | printf("\r\n"); |
tpadovani | 9:e501499af4ef | 195 | } |