Test program for FF1705.

Dependencies:   libxDot-dev-mbed5-deprecated ISL29011

Committer:
jernej_vrscaj
Date:
Tue Nov 07 11:22:06 2017 +0000
Revision:
1:12a289bd6b82
Parent:
0:d96e7e513c16
Child:
2:9b44950b84af
Testing program for FF1705.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jernej_vrscaj 0:d96e7e513c16 1 #include "dot_util.h"
jernej_vrscaj 0:d96e7e513c16 2 #include "RadioEvent.h"
jernej_vrscaj 0:d96e7e513c16 3 #include "mDotEvent.h"
jernej_vrscaj 0:d96e7e513c16 4 #include "C12832.h"
jernej_vrscaj 0:d96e7e513c16 5
jernej_vrscaj 0:d96e7e513c16 6 #if ACTIVE_EXAMPLE == PEER_TO_PEER_EXAMPLE
jernej_vrscaj 0:d96e7e513c16 7
jernej_vrscaj 1:12a289bd6b82 8 #define TEST_board
jernej_vrscaj 1:12a289bd6b82 9 //#define REFERENCE_board
jernej_vrscaj 0:d96e7e513c16 10
jernej_vrscaj 0:d96e7e513c16 11
jernej_vrscaj 0:d96e7e513c16 12 /////////////////////////////////////////////////////////////////////////////
jernej_vrscaj 0:d96e7e513c16 13 // -------------------- DOT LIBRARY REQUIRED ------------------------------//
jernej_vrscaj 0:d96e7e513c16 14 // * Because these example programs can be used for both mDot and xDot //
jernej_vrscaj 0:d96e7e513c16 15 // devices, the LoRa stack is not included. The libmDot library should //
jernej_vrscaj 0:d96e7e513c16 16 // be imported if building for mDot devices. The libxDot library //
jernej_vrscaj 0:d96e7e513c16 17 // should be imported if building for xDot devices. //
jernej_vrscaj 0:d96e7e513c16 18 // * https://developer.mbed.org/teams/MultiTech/code/libmDot-dev-mbed5/ //
jernej_vrscaj 0:d96e7e513c16 19 // * https://developer.mbed.org/teams/MultiTech/code/libmDot-mbed5/ //
jernej_vrscaj 0:d96e7e513c16 20 // * https://developer.mbed.org/teams/MultiTech/code/libxDot-dev-mbed5/ //
jernej_vrscaj 0:d96e7e513c16 21 // * https://developer.mbed.org/teams/MultiTech/code/libxDot-mbed5/ //
jernej_vrscaj 0:d96e7e513c16 22 /////////////////////////////////////////////////////////////////////////////
jernej_vrscaj 0:d96e7e513c16 23
jernej_vrscaj 0:d96e7e513c16 24 /////////////////////////////////////////////////////////////
jernej_vrscaj 0:d96e7e513c16 25 // * these options must match between the two devices in //
jernej_vrscaj 0:d96e7e513c16 26 // order for communication to be successful
jernej_vrscaj 0:d96e7e513c16 27 /////////////////////////////////////////////////////////////
jernej_vrscaj 0:d96e7e513c16 28
jernej_vrscaj 0:d96e7e513c16 29 /*============================= INIT =========================================*/
jernej_vrscaj 0:d96e7e513c16 30
jernej_vrscaj 0:d96e7e513c16 31 static uint8_t network_address[] = { 0x01, 0x02, 0x03, 0x04 };
jernej_vrscaj 0:d96e7e513c16 32 static uint8_t network_session_key[] = { 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04 };
jernej_vrscaj 0:d96e7e513c16 33 static uint8_t data_session_key[] = { 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04 };
jernej_vrscaj 0:d96e7e513c16 34
jernej_vrscaj 0:d96e7e513c16 35 mDot* dot = NULL;
jernej_vrscaj 0:d96e7e513c16 36 lora::ChannelPlan* plan = NULL;
jernej_vrscaj 0:d96e7e513c16 37
jernej_vrscaj 0:d96e7e513c16 38 Serial pc(USBTX, USBRX);
jernej_vrscaj 0:d96e7e513c16 39
jernej_vrscaj 0:d96e7e513c16 40 #ifdef TEST_board
jernej_vrscaj 0:d96e7e513c16 41 C12832 lcd(PB_15, PB_13, PB_14, PA_12, PB_12); // init LCD
jernej_vrscaj 0:d96e7e513c16 42
jernej_vrscaj 0:d96e7e513c16 43 DigitalIn joystick_up(PB_2); // init button to start the send routine
jernej_vrscaj 0:d96e7e513c16 44 DigitalOut led(PB_8, 1); // init LED to indicate sending messages
jernej_vrscaj 0:d96e7e513c16 45
jernej_vrscaj 0:d96e7e513c16 46 DigitalIn BTN_1(PA_5); // init LoRa button
jernej_vrscaj 0:d96e7e513c16 47 DigitalOut LED_1(PA_4, 0); // init LoRa LED
jernej_vrscaj 0:d96e7e513c16 48
jernej_vrscaj 0:d96e7e513c16 49
jernej_vrscaj 0:d96e7e513c16 50 uint8_t trx = 0x2F; // initial sending value (0x2F dec 47)
jernej_vrscaj 0:d96e7e513c16 51 uint8_t sent = 0;
jernej_vrscaj 0:d96e7e513c16 52 uint8_t sent_rx = 0;
jernej_vrscaj 0:d96e7e513c16 53
jernej_vrscaj 0:d96e7e513c16 54 #elif defined(REFERENCE_board)
jernej_vrscaj 0:d96e7e513c16 55 DigitalOut led(PA_4, 0); // init LED to indicate sending messages
jernej_vrscaj 0:d96e7e513c16 56
jernej_vrscaj 0:d96e7e513c16 57 uint8_t received = 0; // check for RadioEvent
jernej_vrscaj 0:d96e7e513c16 58
jernej_vrscaj 0:d96e7e513c16 59 uint16_t *ptr_rx; // init pointer to RxBuffer
jernej_vrscaj 0:d96e7e513c16 60
jernej_vrscaj 0:d96e7e513c16 61 #endif
jernej_vrscaj 0:d96e7e513c16 62
jernej_vrscaj 0:d96e7e513c16 63 /*============================ END INIT ======================================*/
jernej_vrscaj 0:d96e7e513c16 64
jernej_vrscaj 0:d96e7e513c16 65
jernej_vrscaj 0:d96e7e513c16 66 /*============================== MAIN ========================================*/
jernej_vrscaj 0:d96e7e513c16 67
jernej_vrscaj 0:d96e7e513c16 68 int main()
jernej_vrscaj 0:d96e7e513c16 69 {
jernej_vrscaj 0:d96e7e513c16 70 // Custom event handler for automatically displaying RX data
jernej_vrscaj 0:d96e7e513c16 71 RadioEvent events;
jernej_vrscaj 0:d96e7e513c16 72 uint32_t tx_frequency;
jernej_vrscaj 0:d96e7e513c16 73 uint8_t tx_datarate;
jernej_vrscaj 0:d96e7e513c16 74 uint8_t tx_power;
jernej_vrscaj 0:d96e7e513c16 75 uint8_t frequency_band;
jernej_vrscaj 0:d96e7e513c16 76
jernej_vrscaj 0:d96e7e513c16 77 // sending data
jernej_vrscaj 0:d96e7e513c16 78
jernej_vrscaj 0:d96e7e513c16 79 pc.baud(115200);
jernej_vrscaj 0:d96e7e513c16 80
jernej_vrscaj 0:d96e7e513c16 81 mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL);
jernej_vrscaj 0:d96e7e513c16 82
jernej_vrscaj 0:d96e7e513c16 83 #if CHANNEL_PLAN == CP_US915
jernej_vrscaj 0:d96e7e513c16 84 plan = new lora::ChannelPlan_US915();
jernej_vrscaj 0:d96e7e513c16 85 #elif CHANNEL_PLAN == CP_AU915
jernej_vrscaj 0:d96e7e513c16 86 plan = new lora::ChannelPlan_AU915();
jernej_vrscaj 0:d96e7e513c16 87 #elif CHANNEL_PLAN == CP_EU868
jernej_vrscaj 0:d96e7e513c16 88 plan = new lora::ChannelPlan_EU868();
jernej_vrscaj 0:d96e7e513c16 89 #elif CHANNEL_PLAN == CP_KR920
jernej_vrscaj 0:d96e7e513c16 90 plan = new lora::ChannelPlan_KR920();
jernej_vrscaj 0:d96e7e513c16 91 #elif CHANNEL_PLAN == CP_AS923
jernej_vrscaj 0:d96e7e513c16 92 plan = new lora::ChannelPlan_AS923();
jernej_vrscaj 0:d96e7e513c16 93 #elif CHANNEL_PLAN == CP_AS923_JAPAN
jernej_vrscaj 0:d96e7e513c16 94 plan = new lora::ChannelPlan_AS923_Japan();
jernej_vrscaj 0:d96e7e513c16 95 #elif CHANNEL_PLAN == CP_IN865
jernej_vrscaj 0:d96e7e513c16 96 plan = new lora::ChannelPlan_IN865();
jernej_vrscaj 0:d96e7e513c16 97 #endif
jernej_vrscaj 0:d96e7e513c16 98 assert(plan);
jernej_vrscaj 0:d96e7e513c16 99
jernej_vrscaj 0:d96e7e513c16 100 dot = mDot::getInstance(plan);
jernej_vrscaj 0:d96e7e513c16 101 assert(dot);
jernej_vrscaj 0:d96e7e513c16 102
jernej_vrscaj 0:d96e7e513c16 103 logInfo("mbed-os library version: %d", MBED_LIBRARY_VERSION);
jernej_vrscaj 0:d96e7e513c16 104
jernej_vrscaj 0:d96e7e513c16 105 // start from a well-known state
jernej_vrscaj 0:d96e7e513c16 106 logInfo("defaulting Dot configuration");
jernej_vrscaj 0:d96e7e513c16 107 dot->resetConfig();
jernej_vrscaj 0:d96e7e513c16 108
jernej_vrscaj 0:d96e7e513c16 109 // make sure library logging is turned on
jernej_vrscaj 0:d96e7e513c16 110 dot->setLogLevel(mts::MTSLog::INFO_LEVEL);
jernej_vrscaj 0:d96e7e513c16 111
jernej_vrscaj 0:d96e7e513c16 112 // attach the custom events handler
jernej_vrscaj 0:d96e7e513c16 113 dot->setEvents(&events);
jernej_vrscaj 0:d96e7e513c16 114
jernej_vrscaj 0:d96e7e513c16 115 // update configuration if necessary
jernej_vrscaj 0:d96e7e513c16 116 if (dot->getJoinMode() != mDot::PEER_TO_PEER) {
jernej_vrscaj 0:d96e7e513c16 117 logInfo("changing network join mode to PEER_TO_PEER");
jernej_vrscaj 0:d96e7e513c16 118 if (dot->setJoinMode(mDot::PEER_TO_PEER) != mDot::MDOT_OK) {
jernej_vrscaj 0:d96e7e513c16 119 logError("failed to set network join mode to PEER_TO_PEER");
jernej_vrscaj 0:d96e7e513c16 120 }
jernej_vrscaj 0:d96e7e513c16 121 }
jernej_vrscaj 0:d96e7e513c16 122 frequency_band = dot->getFrequencyBand();
jernej_vrscaj 0:d96e7e513c16 123 switch (frequency_band) {
jernej_vrscaj 0:d96e7e513c16 124 case lora::ChannelPlan::EU868_OLD:
jernej_vrscaj 0:d96e7e513c16 125 case lora::ChannelPlan::EU868:
jernej_vrscaj 0:d96e7e513c16 126 // 250kHz channels achieve higher throughput
jernej_vrscaj 0:d96e7e513c16 127 // DR_6 : SF7 @ 250kHz
jernej_vrscaj 0:d96e7e513c16 128 // DR_0 - DR_5 (125kHz channels) available but much slower
jernej_vrscaj 0:d96e7e513c16 129 tx_frequency = 869850000;
jernej_vrscaj 0:d96e7e513c16 130 tx_datarate = lora::DR_6;
jernej_vrscaj 0:d96e7e513c16 131 // the 869850000 frequency is 100% duty cycle if the total power is under 7 dBm - tx power 4 + antenna gain 3 = 7
jernej_vrscaj 0:d96e7e513c16 132 tx_power = 4;
jernej_vrscaj 0:d96e7e513c16 133 break;
jernej_vrscaj 0:d96e7e513c16 134
jernej_vrscaj 0:d96e7e513c16 135 case lora::ChannelPlan::US915_OLD:
jernej_vrscaj 0:d96e7e513c16 136 case lora::ChannelPlan::US915:
jernej_vrscaj 0:d96e7e513c16 137 case lora::ChannelPlan::AU915_OLD:
jernej_vrscaj 0:d96e7e513c16 138 case lora::ChannelPlan::AU915:
jernej_vrscaj 0:d96e7e513c16 139 // 500kHz channels achieve highest throughput
jernej_vrscaj 0:d96e7e513c16 140 // DR_8 : SF12 @ 500kHz
jernej_vrscaj 0:d96e7e513c16 141 // DR_9 : SF11 @ 500kHz
jernej_vrscaj 0:d96e7e513c16 142 // DR_10 : SF10 @ 500kHz
jernej_vrscaj 0:d96e7e513c16 143 // DR_11 : SF9 @ 500kHz
jernej_vrscaj 0:d96e7e513c16 144 // DR_12 : SF8 @ 500kHz
jernej_vrscaj 0:d96e7e513c16 145 // DR_13 : SF7 @ 500kHz
jernej_vrscaj 0:d96e7e513c16 146 // DR_0 - DR_3 (125kHz channels) available but much slower
jernej_vrscaj 0:d96e7e513c16 147 tx_frequency = 915500000;
jernej_vrscaj 0:d96e7e513c16 148 tx_datarate = lora::DR_13;
jernej_vrscaj 0:d96e7e513c16 149 // 915 bands have no duty cycle restrictions, set tx power to max
jernej_vrscaj 0:d96e7e513c16 150 tx_power = 20;
jernej_vrscaj 0:d96e7e513c16 151 break;
jernej_vrscaj 0:d96e7e513c16 152
jernej_vrscaj 0:d96e7e513c16 153 case lora::ChannelPlan::AS923:
jernej_vrscaj 0:d96e7e513c16 154 case lora::ChannelPlan::AS923_JAPAN:
jernej_vrscaj 0:d96e7e513c16 155 // 250kHz channels achieve higher throughput
jernej_vrscaj 0:d96e7e513c16 156 // DR_6 : SF7 @ 250kHz
jernej_vrscaj 0:d96e7e513c16 157 // DR_0 - DR_5 (125kHz channels) available but much slower
jernej_vrscaj 0:d96e7e513c16 158 tx_frequency = 924800000;
jernej_vrscaj 0:d96e7e513c16 159 tx_datarate = lora::DR_6;
jernej_vrscaj 0:d96e7e513c16 160 tx_power = 16;
jernej_vrscaj 0:d96e7e513c16 161 break;
jernej_vrscaj 0:d96e7e513c16 162
jernej_vrscaj 0:d96e7e513c16 163 case lora::ChannelPlan::KR920:
jernej_vrscaj 0:d96e7e513c16 164 // DR_5 : SF7 @ 125kHz
jernej_vrscaj 0:d96e7e513c16 165 tx_frequency = 922700000;
jernej_vrscaj 0:d96e7e513c16 166 tx_datarate = lora::DR_5;
jernej_vrscaj 0:d96e7e513c16 167 tx_power = 14;
jernej_vrscaj 0:d96e7e513c16 168 break;
jernej_vrscaj 0:d96e7e513c16 169
jernej_vrscaj 0:d96e7e513c16 170 default:
jernej_vrscaj 0:d96e7e513c16 171 while (true) {
jernej_vrscaj 0:d96e7e513c16 172 logFatal("no known channel plan in use - extra configuration is needed!");
jernej_vrscaj 0:d96e7e513c16 173 wait(5);
jernej_vrscaj 0:d96e7e513c16 174 }
jernej_vrscaj 0:d96e7e513c16 175 break;
jernej_vrscaj 0:d96e7e513c16 176 }
jernej_vrscaj 0:d96e7e513c16 177 // in PEER_TO_PEER mode there is no join request/response transaction
jernej_vrscaj 0:d96e7e513c16 178 // as long as both Dots are configured correctly, they should be able to communicate
jernej_vrscaj 0:d96e7e513c16 179 update_peer_to_peer_config(network_address, network_session_key, data_session_key, tx_frequency, tx_datarate, tx_power);
jernej_vrscaj 0:d96e7e513c16 180
jernej_vrscaj 0:d96e7e513c16 181 // save changes to configuration
jernej_vrscaj 0:d96e7e513c16 182 logInfo("saving configuration");
jernej_vrscaj 0:d96e7e513c16 183 if (!dot->saveConfig()) {
jernej_vrscaj 0:d96e7e513c16 184 logError("failed to save configuration");
jernej_vrscaj 0:d96e7e513c16 185 }
jernej_vrscaj 0:d96e7e513c16 186
jernej_vrscaj 0:d96e7e513c16 187 // display configuration
jernej_vrscaj 0:d96e7e513c16 188 display_config();
jernej_vrscaj 0:d96e7e513c16 189
jernej_vrscaj 0:d96e7e513c16 190 #ifdef TEST_board
jernej_vrscaj 0:d96e7e513c16 191
jernej_vrscaj 0:d96e7e513c16 192 while (true) {
jernej_vrscaj 0:d96e7e513c16 193
jernej_vrscaj 0:d96e7e513c16 194 lcd.locate(0,0);
jernej_vrscaj 0:d96e7e513c16 195 lcd.printf("Zacni test s pritiskom na JOYSTICK tipko...");
jernej_vrscaj 0:d96e7e513c16 196
jernej_vrscaj 0:d96e7e513c16 197 // join network if not joined
jernej_vrscaj 0:d96e7e513c16 198 if (!dot->getNetworkJoinStatus()) {
jernej_vrscaj 0:d96e7e513c16 199 join_network();
jernej_vrscaj 0:d96e7e513c16 200 }
jernej_vrscaj 0:d96e7e513c16 201
jernej_vrscaj 0:d96e7e513c16 202 while(!BTN_1) LED_1 = 1; // press btn to light up led
jernej_vrscaj 0:d96e7e513c16 203 LED_1 = 0; // clear LED
jernej_vrscaj 0:d96e7e513c16 204
jernej_vrscaj 0:d96e7e513c16 205
jernej_vrscaj 0:d96e7e513c16 206 if(joystick_up) { // wait for user input
jernej_vrscaj 0:d96e7e513c16 207
jernej_vrscaj 0:d96e7e513c16 208 sent = 1;
jernej_vrscaj 0:d96e7e513c16 209
jernej_vrscaj 0:d96e7e513c16 210 lcd.cls();
jernej_vrscaj 0:d96e7e513c16 211 led = 0;
jernej_vrscaj 0:d96e7e513c16 212
jernej_vrscaj 0:d96e7e513c16 213 std::vector<uint8_t> tx_data;
jernej_vrscaj 0:d96e7e513c16 214
jernej_vrscaj 0:d96e7e513c16 215 trx++; // +1 to value to be send
jernej_vrscaj 0:d96e7e513c16 216 tx_data.push_back((trx >> 8) & 0xFF); // shift data eg. 0x0031 -> 0x3100
jernej_vrscaj 0:d96e7e513c16 217 tx_data.push_back(trx & 0xFF);
jernej_vrscaj 0:d96e7e513c16 218 logInfo("send_data: 0x%x", trx);
jernej_vrscaj 0:d96e7e513c16 219
jernej_vrscaj 0:d96e7e513c16 220 lcd.locate(0,0);
jernej_vrscaj 0:d96e7e513c16 221 lcd.printf("Poslano: %u", trx);
jernej_vrscaj 0:d96e7e513c16 222
jernej_vrscaj 0:d96e7e513c16 223 send_data(tx_data); // send data
jernej_vrscaj 0:d96e7e513c16 224
jernej_vrscaj 0:d96e7e513c16 225 wait(1);
jernej_vrscaj 0:d96e7e513c16 226
jernej_vrscaj 0:d96e7e513c16 227 if(!(sent && sent_rx))
jernej_vrscaj 0:d96e7e513c16 228 {
jernej_vrscaj 0:d96e7e513c16 229
jernej_vrscaj 0:d96e7e513c16 230 lcd.locate(0,10);
jernej_vrscaj 0:d96e7e513c16 231 lcd.printf("FAIL!");
jernej_vrscaj 0:d96e7e513c16 232 lcd.locate(0,20);
jernej_vrscaj 0:d96e7e513c16 233 lcd.printf("Preveri REFERENCNO platico.");
jernej_vrscaj 0:d96e7e513c16 234 }
jernej_vrscaj 0:d96e7e513c16 235
jernej_vrscaj 0:d96e7e513c16 236 wait(4);
jernej_vrscaj 0:d96e7e513c16 237
jernej_vrscaj 0:d96e7e513c16 238 sent = 0;
jernej_vrscaj 0:d96e7e513c16 239 sent_rx = 0;
jernej_vrscaj 0:d96e7e513c16 240
jernej_vrscaj 0:d96e7e513c16 241 lcd.cls();
jernej_vrscaj 0:d96e7e513c16 242 led = 1;
jernej_vrscaj 0:d96e7e513c16 243
jernej_vrscaj 0:d96e7e513c16 244 }
jernej_vrscaj 0:d96e7e513c16 245 }
jernej_vrscaj 0:d96e7e513c16 246
jernej_vrscaj 0:d96e7e513c16 247 #elif defined(REFERENCE_board)
jernej_vrscaj 0:d96e7e513c16 248
jernej_vrscaj 0:d96e7e513c16 249 while (true) {
jernej_vrscaj 0:d96e7e513c16 250
jernej_vrscaj 0:d96e7e513c16 251 std::vector<uint8_t> tx_data;
jernej_vrscaj 0:d96e7e513c16 252
jernej_vrscaj 0:d96e7e513c16 253 // join network if not joined
jernej_vrscaj 0:d96e7e513c16 254 if (!dot->getNetworkJoinStatus()) {
jernej_vrscaj 0:d96e7e513c16 255 join_network();
jernej_vrscaj 0:d96e7e513c16 256 }
jernej_vrscaj 0:d96e7e513c16 257
jernej_vrscaj 0:d96e7e513c16 258 if(received) // RadioEvent happened
jernej_vrscaj 0:d96e7e513c16 259 {
jernej_vrscaj 0:d96e7e513c16 260
jernej_vrscaj 0:d96e7e513c16 261 led = 1;
jernej_vrscaj 0:d96e7e513c16 262
jernej_vrscaj 0:d96e7e513c16 263 received = 0; // clear event flag
jernej_vrscaj 0:d96e7e513c16 264 ++*ptr_rx; // +1 to received value
jernej_vrscaj 0:d96e7e513c16 265 tx_data.push_back((*ptr_rx >> 8) & 0xFF); // shift data eg. 0x0031 -> 0x3100
jernej_vrscaj 0:d96e7e513c16 266 tx_data.push_back(*ptr_rx & 0xFF);
jernej_vrscaj 0:d96e7e513c16 267 logInfo("Sent *ptr_rx: %#x", *ptr_rx);
jernej_vrscaj 0:d96e7e513c16 268 send_data(tx_data); // then send back
jernej_vrscaj 0:d96e7e513c16 269
jernej_vrscaj 0:d96e7e513c16 270 wait(1);
jernej_vrscaj 0:d96e7e513c16 271
jernej_vrscaj 0:d96e7e513c16 272 led = 0;
jernej_vrscaj 0:d96e7e513c16 273
jernej_vrscaj 0:d96e7e513c16 274 NVIC_SystemReset(); // reset Reference board
jernej_vrscaj 0:d96e7e513c16 275
jernej_vrscaj 0:d96e7e513c16 276 }
jernej_vrscaj 0:d96e7e513c16 277 }
jernej_vrscaj 0:d96e7e513c16 278
jernej_vrscaj 0:d96e7e513c16 279 #endif
jernej_vrscaj 0:d96e7e513c16 280
jernej_vrscaj 0:d96e7e513c16 281 return 0;
jernej_vrscaj 0:d96e7e513c16 282 }
jernej_vrscaj 0:d96e7e513c16 283
jernej_vrscaj 0:d96e7e513c16 284 #endif
jernej_vrscaj 0:d96e7e513c16 285
jernej_vrscaj 0:d96e7e513c16 286 /*============================ END MAIN =======================================*/
jernej_vrscaj 0:d96e7e513c16 287