SD-card инициализируется, но работает, если скетч менее 24к

RomAndry
RomAndry аватар
Offline
Зарегистрирован: 20.02.2014

С наступающим!
Хороших проектов!

Подскажите пожалуйста, пробую использовать:
- GSM/GPRS Shield (SIM900.h)
- DHT11
- LCD 1602
- SD
- RTC 1302

- Arduino UNO (328)
- Arduino IDE 1.0.6

Проблема возникает в том, что при превышении скетча более 24к, SD карта инициализируется, но писать в нее отказывается. Пробую отключать либы или вызовы, уменьшая размер скетча и все работает ок.

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#include "DHT.h"
DHT dht(A0, DHT11);
// SD
#include <SD.h>

SoftwareSerial Serial1(2, 3);

SMSGSM sms;

boolean gsmstarted=false;

void setup() 
{
  Serial.begin(9600);
  Serial.println("GSM-SD testing.");
  
  if (gsm.begin(9600)){
    Serial.println("\nstatus=READY");
    gsmstarted=true;  
  }
  else Serial.println("\nstatus=IDLE");
  
  if(gsmstarted){
    Serial.println("GSM OK");
  }
  
  if (!SD.begin(10)) {
    Serial.println("Card failed, or not present");
  }
  else
    Serial.println("Card initialized.");
}

void loop() {
  String dataString = ""; // for SD-card
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  dataString += "foo";
  Serial.println("\nwaiting...");
  
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
    Serial.println(dataString);
    Serial.println("\nbaaar...");
  }else {
    Serial.println("error opening datalog.txt");
  }
  delay(2000);

}

Вот такой вариант занимает 23 690 и при запуске получаю

Card initialized
и затем всегда 
error opening datalog.txt

стоит закоментировать работу с DHT
// DHT dht(A0, DHT11);
23 665 байт и все работает.

при том не обязательно эту строчку, просто уменьшить чуть размер.
Или как вообще правильно программно реализовать работу кода с этими библиотеками?
Почему такое ограничение для SD карт?

Спасибо 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Это не ограничение, как таковое. Просто в УНО мало памяти. Я сталкивался с таким уже - на МЕГЕ работает, на УНО виснет. Вопрос не в размере скетча, а в том, сколько памяти осталось после объявления экземпляров всех классов. Если у вас IDE 1.5.. - вы должны увидеть строку, мол "под глобальные переменные использовано 99% ...". И для работы какой-то функции ардуино просто не может выделить память.

RomAndry
RomAndry аватар
Offline
Зарегистрирован: 20.02.2014

Спасибо за исчерпывающий ответ.
IDE 1.0.6 использую, т.к. пробовал 1.5.х - не все либы к нему коннектятся нормально, потому и вернулся к 1.0

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

RomAndry пишет:

Спасибо за исчерпывающий ответ.
IDE 1.0.6 использую, т.к. пробовал 1.5.х - не все либы к нему коннектятся нормально, потому и вернулся к 1.0

Это какие, например? Никогда такого не замечал...

RomAndry
RomAndry аватар
Offline
Зарегистрирован: 20.02.2014

я уже не помню, если честно.
установил 1.5.8 Java7 и загрузил скетч, вынес не нужные шлобальные переменные внутрь loop()

Sketch uses 24 972 bytes (77%) of program storage space. Maximum is 32 256 bytes.
Global variables use 1 721 bytes (84%) of dynamic memory, leaving 327 bytes for local variables. Maximum is 2 048 bytes.
Low memory available, stability problems may occur.

Подскажите из опыта какой же % допустимый? Как считать то правильно?
Очень смущает последняя строка.

Спасибо

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

RomAndry пишет:

я уже не помню, если честно.
установил 1.5.8 Java7 и загрузил скетч, вынес не нужные шлобальные переменные внутрь loop()

Sketch uses 24 972 bytes (77%) of program storage space. Maximum is 32 256 bytes.
Global variables use 1 721 bytes (84%) of dynamic memory, leaving 327 bytes for local variables. Maximum is 2 048 bytes.
Low memory available, stability problems may occur.

Подскажите из опыта какой же % допустимый? Как считать то правильно?
Очень смущает последняя строка.

Спасибо

Нет такого понятия "допустимый %".  Если вы уверены, что ни одна библиотека не требует динамического выделения памяти - то и 99% по идее может стабильно работать. Но запись на карточку явно буферизируется - значит в вашем случае ни в чем нельзя быть уверенным. Выходов несколько - простой и в лоб - использовать МЕГУ (я если честно вообще УНО не понимаю - пинов мало, памяти мало, стоит почти столько-же...).

Не простой, но понтовый - не использовать библиотеки.

Можно попытаться PROGMEM заюзать - часто это выход.

 

P.S. С Новым годом!

 

RomAndry
RomAndry аватар
Offline
Зарегистрирован: 20.02.2014

Так теперь понятно, раньше на ZX-Spectrum хватало и 16к =)

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

RomAndry пишет:

Так теперь понятно, раньше на ZX-Spectrum хватало и 16к =)

 

Не знаю, кому хватало кастрированного спектрума с 16 кб, Обычный имел 48 кб. И этих 48 кб, с ассемблером еле-еле хватало...

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

RomAndry пишет:

я уже не помню, если честно.
установил 1.5.8 Java7 и загрузил скетч, вынес не нужные шлобальные переменные внутрь loop()

Sketch uses 24 972 bytes (77%) of program storage space. Maximum is 32 256 bytes.
Global variables use 1 721 bytes (84%) of dynamic memory, leaving 327 bytes for local variables. Maximum is 2 048 bytes.
Low memory available, stability problems may occur.

Подскажите из опыта какой же % допустимый? Как считать то правильно?
Очень смущает последняя строка.

Спасибо

Здравствуйте,

Не увидел сразу эту тему и создал свою.

Дело в том что у меня та же проблема

Sketch uses 20 302 bytes (62%) of program storage space. Maximum is 32 256 bytes.
Global variables use 1 732 bytes (84%) of dynamic memory, leaving 316 bytes for local variables. Maximum is 2 048 bytes.
Low memory available, stability problems may occur.

Дело тут не в размере скетча а в том, что не хватает места под глобальные переменные.

SRAM  всего 2КБ. Как я понял из них должно быть свободно не менее 25%.

Все свои глобальные переменные сократил до минимума. Видимо чтобы не превышать размер SRAM придется убирать из библиотек все неиспользуемые переменные.

Либо использовать Arduino MEGA, но уж очень не хочется, так как у нее большая избыточность в пинах.

 

RomAndry
RomAndry аватар
Offline
Зарегистрирован: 20.02.2014

Я решил вопрос заменив библиотеку SIM900 на стандартный пакет GSM
Но и это не помогло - пришлось выкинуть SD. А так же убрал временно RTC на DS1302
Жду посылку с 1307 и через I2C надеюсь, что хоть таймер заработает =)
 

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

RomAndry пишет:

Я решил вопрос заменив библиотеку SIM900 на стандартный пакет GSM
Но и это не помогло - пришлось выкинуть SD. А так же убрал временно RTC на DS1302
Жду посылку с 1307 и через I2C надеюсь, что хоть таймер заработает =)
 

А почему DS1307 а не DS3231?

Как я читал у DS1307 очень большой уход по времени за сутки. У меня DS3231 как раз I2C но это не помогает. Как я посмотрел мне от часов нужна всего пара функций - установка и возврат текущего времени. в последствии может быть и будильник. А библиотека что я использую очень большая и предоставляет массу ненужного сервиса.

А вот с SD будет сложнее, кушает она тоже много SRAM но переделать ее думаю не получится.

Вместо GSM у меня ENC28J60, вчера проверил, ест прилично. Так что сейчас просто соберу скетч со всеми используемыми библиотеками и функциями, и посмотрю как и где можно подкрутить. Если не получится придется делать на меге.

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Andrey12 пишет:

...

Вместо GSM у меня ENC28J60, вчера проверил, ест прилично. Так что сейчас просто соберу скетч со всеми используемыми библиотеками и функциями, и посмотрю как и где можно подкрутить. Если не получится придется делать на меге.

А еще - выкиньте ENC28J60 и возьмите W5100. Или даже начните именно с этого. В вашем шилде IP-стек реализован программно...

RomAndry
RomAndry аватар
Offline
Зарегистрирован: 20.02.2014

Andrey12 пишет:

А почему DS1307 а не DS3231?

Как я читал у DS1307 очень большой уход по времени за сутки. У меня DS3231 как раз I2C но это не помогает. Как я посмотрел мне от часов нужна всего пара функций - установка и возврат текущего времени. в последствии может быть и будильник. А библиотека что я использую очень большая и предоставляет массу ненужного сервиса.

Так получилось. В принципе время необходимо только для логгирования в SD карту, но спасибо, закажу еще DS3231 для переделки потом на MEGA
Еще читал, что время можно брать от GSM сервиса.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

Gippopotam пишет:

А еще - выкиньте ENC28J60 и возьмите W5100. Или даже начните именно с этого. В вашем шилде IP-стек реализован программно...

Тут не могу не согласится. Вот компиляция стандартного скетча WebServer из комплекта к Aduino IDE 1.5.8

Sketch uses 12 586 bytes (39%) of program storage space. Maximum is 32 256 bytes.
Global variables use 547 bytes (26%) of dynamic memory, leaving 1 501 bytes for local variables. Maximum is 2 048 bytes.
 

Вот то же WebServer который идет с библиотекой UIPEthernet

Sketch uses 19 592 bytes (60%) of program storage space. Maximum is 32 256 bytes.
Global variables use 1 136 bytes (55%) of dynamic memory, leaving 912 bytes for local variables. Maximum is 2 048 bytes.

Как видно с шилдом W5100 памяти расходуется гораздо меньше.

Спасибо за совет, может приобрету W5100, они вроде еще как бывают с SD ридером?

А про W5500 ничего не можете сказать? очень размером они понравились.

http://www.aliexpress.com/item/W5500-Ethernet-Module-Hardware-TCP-IP-Protocol-Stack-SPI-Interface-Ethernet-To-SPI/2039279736.html

А модули ENC28J60 привлекли ценой. Но как выясняется везде свои недостатки.
 

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

RomAndry пишет:

Так получилось. В принципе время необходимо только для логгирования в SD карту, но спасибо, закажу еще DS3231 для переделки потом на MEGA

Еще читал, что время можно брать от GSM сервиса.

Если будет доступ к интернету то однозначно можно. Хотя и без доступа к инету телефоны могут синхронизировать время с мобильным оперетором.

А что собираете если не секрет?

Я хотел построить на UNO автоматику для теплицы, поэтому взял DS3231. У нее есть будильники.

Но видимо на UNO построить не получится, всетаки маловато у нее памяти.

В итоге приобрету наверное MEGA. Тогда и GSM можно будет подключить для удаленного мониторнига и управления.

 

RomAndry
RomAndry аватар
Offline
Зарегистрирован: 20.02.2014

Andrey12 пишет:

А что собираете если не секрет?

Для начала это GSM модуль с приемо-передатчиками 433Мгц для контроля температур и подогрев перед нашим приездом (обогреватели работают в режиме антизаморозки 7-9 градусов).
Это зимний вариант с расширением для остальных сезонов =)

Я так же понимаю, что UNO это ничтожно мало и буду переходить на MEGA

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

W5100 все идут с кардридером, ибо полноценный сервер без карточки - никак.

А про W5500 даже не слышал, вероятно новинка...

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

Gippopotam пишет:

W5100 все идут с кардридером, ибо полноценный сервер без карточки - никак.

А про W5500 даже не слышал, вероятно новинка...

Не всегда, встречаются и усеченные варианты. Вот например:

http://www.aliexpress.com/item/TOP-Mini-W5100-LAN-Ethernet-Shield-Network-Module-board-for-Arduino-Best/1990146986.html

Да все мои изыскания привели к тому что надо брать MEGA + W5100 ну а остальное у меня есть :-)

Так же сейчас продают W5200, тоже с SD ридером. Вот описание по стравнению с W5100

http://www.aliexpress.com/store/product/Free-shipping-New-Ethernet-SHIELD-W5200-FOR-arduino-UNO-R3-mega-2560-R3/1184212_32261803925.html

Спасибо за подсказки :-)

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

RomAndry пишет:

Andrey12 пишет:

А что собираете если не секрет?

Для начала это GSM модуль с приемо-передатчиками 433Мгц для контроля температур и подогрев перед нашим приездом (обогреватели работают в режиме антизаморозки 7-9 градусов).
Это зимний вариант с расширением для остальных сезонов =)

Я так же понимаю, что UNO это ничтожно мало и буду переходить на MEGA

Да, я уже смотрю цены на MEGA.

А GSM модуль у вас какой? Я нашел такой, но както не дешево :-(

http://www.aliexpress.com/store/product/Free-shipping-GSM-SIM900-SIM900A-Module-GPRS-Shield-Compatible-for-Arduino-for-GSM-Cell-Phone-Achieve/1184212_32218573011.html

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Если позволите - дам еще один совет - не связывайтесь с алиэкспрессом. На ибэе то-же самое, как минимум не дороже, но зато с такой защитой покупателя, что али нервно курит в сторонке.

Это я как шопер с пятилетним стежем советую...

http://www.ebay.com/itm/261679201038?_trksid=p2060778.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

 

RomAndry
RomAndry аватар
Offline
Зарегистрирован: 20.02.2014

Да, на Али иногда бывает дешевле, но сроки доставки и непонятная защита клиента не впечатляют. Ebay самое оно.

По поводу модуля GSM, я брал shield ибо перед этим намучался с упрощенным модулем очень сильно. 
 

RomAndry
RomAndry аватар
Offline
Зарегистрирован: 20.02.2014

Цены на MEGA на Али 8.45 на Ebay - 10.50 минимум

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

RomAndry пишет:

Цены на MEGA на Али 8.45 на Ebay - 10.50 минимум

Интересные цены...

Я и по 10.5 с доставкой не видел. Хватать и тикать! (с)

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

Gippopotam пишет:

Если позволите - дам еще один совет - не связывайтесь с алиэкспрессом. На ибэе то-же самое, как минимум не дороже, но зато с такой защитой покупателя, что али нервно курит в сторонке.

Это я как шопер с пятилетним стежем советую...

http://www.ebay.com/itm/261679201038?_trksid=p2060778.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

Насчет защиты на али - всем доволен!
Было пару конфликтов, но первый раз продавец добровольно уладил конфликт, второй раз модератор вернул деньги после жалобы. Просто продавец упертый попался, я долго с ним переписывался. В итоге написал администрации, там есть кнопочка, из переписки с продавцшм можно стразу администрации все переслать. И сразу деньги вернули. Все остальные покупки проходили без проблем.

А на ebay тоже покупал года 2 назад, но на али нравится навигация больше. Хотя ebay тоже за последние пару лет, что у них не покупаю, немного подтянул функционал.

Покупаю Arduino в этом магазине http://www.aliexpress.com/store/1184212
Пока и качеством и сроками доволен.

вот MEGA за $8.8
http://www.aliexpress.com/store/product/Freeshipping-Mega-2560-R3-Mega2560-REV3-ATmega2560-16AU-Board-USB-Cable-compatible-for-arduino-good-quality/1184212_1718380594.html

А вот GSM шилды на али подороже, но не на много. Рублей на 200.

RomAndry
RomAndry аватар
Offline
Зарегистрирован: 20.02.2014
Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

RomAndry пишет:

Да, на Али иногда бывает дешевле, но сроки доставки и непонятная защита клиента не впечатляют. Ebay самое оно.

По поводу модуля GSM, я брал shield ибо перед этим намучался с упрощенным модулем очень сильно. 

А какой именно, я нашел только под UNO
Для MEGA не нашел.
Вот самый компактный который нашел.

http://www.aliexpress.com/store/product/SIM900A-Extension-Module-GSM-GPRS-900-1800MHz-Board-Antenna-for-Arduino/203833_32224068807.html

RomAndry
RomAndry аватар
Offline
Зарегистрирован: 20.02.2014

я как раз с подобным и намучался, пока не купил shield
и вообще понял, что покупая новый, не знакомый модуль, сначала надо погуглить хорошо
вот например сначала купил DC1302 намучался (не хватало портов), увидел DC1307 на I2C... обрадовался и купил, а теперь, в этой теме выяснилось, что надо было брать DS3231

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Andrey12 пишет:

А какой именно, я нашел только под UNO
Для MEGA не нашел.

Это он и есть. Мега - это удлинненый УНО, "голова" у них одинаковая.

 

не советую, "900 А" - не совсем кошерный модуль. Нужно просто "900" брать. Хотя на этом форуме есть ветка - вроде бы разница только в прошивке и можно перешить.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Жалко мне не нужно - у меня и так 6 разных ардуин...

RomAndry
RomAndry аватар
Offline
Зарегистрирован: 20.02.2014

Изучаю DS3231 и вон уже DS3232 оказывается есть, так что не уследишь =)

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

RomAndry пишет:

Изучаю DS3231 и вон уже DS3232 оказывается есть, так что не уследишь =)

На самом деле DC1307 не так уж и плох. Во всяком случае он полностью совместим с библиотекой от DC1307.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

RomAndry пишет:

Изучаю DS3231 и вон уже DS3232 оказывается есть, так что не уследишь =)

так есть еще и DS3234

тут можно почитать:

http://www.compel.ru/lib/ne/2012/2/6-if-it-is-electronics-it-needs-a-clock-chasyi-realnogo-vremeni-ot-kompanii-maxim/

RomAndry
RomAndry аватар
Offline
Зарегистрирован: 20.02.2014

Andrey12 пишет:

RomAndry пишет:

Изучаю DS3231 и вон уже DS3232 оказывается есть, так что не уследишь =)

так есть еще и DS3234

тут можно почитать:

http://www.compel.ru/lib/ne/2012/2/6-if-it-is-electronics-it-needs-a-clock-chasyi-realnogo-vremeni-ot-kompanii-maxim/

потому наверное проще инициализировать время:
- GSM от оператора
- Ethernet от интернета

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

RomAndry пишет:

потому наверное проще инициализировать время:

- GSM от оператора
- Ethernet от интернета

Может и так. Но в DS3231 есть еще и будильники которые можно вешать на прерывания. А для MEGA DS3231 незначительная нагрузка в плане памяти SRAM. Это UNO не потянул :-(

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Andrey12 пишет:

Может и так. Но в DS3231 есть еще и будильники которые можно вешать на прерывания. А для MEGA DS3231 незначительная нагрузка в плане памяти SRAM. Это UNO не потянул :-(

В смысле - не потянул?

Вот только, что доделал проект для аквариума на УНО, все прекрасно работает с этими библиотеками:

#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>

RomAndry
RomAndry аватар
Offline
Зарегистрирован: 20.02.2014

Gippopotam пишет:

Andrey12 пишет:

Может и так. Но в DS3231 есть еще и будильники которые можно вешать на прерывания. А для MEGA DS3231 незначительная нагрузка в плане памяти SRAM. Это UNO не потянул :-(

В смысле - не потянул?

Вот только, что доделал проект для аквариума на УНО, все прекрасно работает с этими библиотеками:

#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>


У меня еще GSM, DHT, SD

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

Gippopotam пишет:

Andrey12 пишет:

Может и так. Но в DS3231 есть еще и будильники которые можно вешать на прерывания. А для MEGA DS3231 незначительная нагрузка в плане памяти SRAM. Это UNO не потянул :-(

В смысле - не потянул?

Вот только, что доделал проект для аквариума на УНО, все прекрасно работает с этими библиотеками:

#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>

Какую библиотеку используете для DS3231?

Я использую https://github.com/jarzebski/Arduino-DS3231

У меня проблема в том что библиотеки SD карты и Ethernet кушают много, с остальным все в порядке.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Andrey12 пишет:

Какую библиотеку используете для DS3231?

Я использую https://github.com/jarzebski/Arduino-DS3231

похоже, что у меня другая

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

RomAndry пишет:

Проблема возникает в том, что при превышении скетча более 24к, SD карта инициализируется, но писать в нее отказывается. Пробую отключать либы или вызовы, уменьшая размер скетча и все работает ок.

К стати попробуй убрать из кода мониторинг в Serial

У меня после того как убрал всю отладку резко освободилась SRAM.

теперь занято 59% вменсто 84%

Да и библиотеку для DS3231 урезал оставил функции установки даты и времени и возврата строкой даты и времени. Если нужна напиши почту, скину.

pastry777
Offline
Зарегистрирован: 16.01.2014

из личной практики скажу,что у меня сд инициализировалась,но не писало в нее в двух случаях ..1-какая-то из библиотек использует пин CS кардридера(вероятнее всего библиотека дисплея).решается переназначением пина для дисплея..2-переполняется буфер ,он общий что для Serial,что для записи в sd...попробуйте эксперимента ради отказаться от Serial....ну,как минимум убрать вывод в сериал dataString,только чтоб выводил "да" или "нет" ну типа удачно записали или ошибка,без излишеств......узнать свободную RAM при подключенной библиотеке SD.h, в работе очень просто: Serial.print(FreeRam());

 

или вот выдернутая функция freeRam из библиотеки,чтоб не подключать всю библиотеку,добавьте себе в скетч:

#define UNUSEDOK __attribute__((unused))

/** Return the number of bytes currently free in RAM. */
static UNUSEDOK int FreeRam(void) {
  extern int  __bss_end;
  extern int* __brkval;
  int free_memory;
  if (reinterpret_cast<int>(__brkval) == 0) {
    // if no heap use from end of bss section
    free_memory = reinterpret_cast<int>(&free_memory)
                  - reinterpret_cast<int>(&__bss_end);
  } else {
    // use from top of stack to heap
    free_memory = reinterpret_cast<int>(&free_memory)
                  - reinterpret_cast<int>(__brkval);
  }
  return free_memory;
}

 

pastry777
Offline
Зарегистрирован: 16.01.2014

http://arduino.ru/Tutorial/Memory

золотая статья=)и не далеко лежала=)
RomAndry
RomAndry аватар
Offline
Зарегистрирован: 20.02.2014

Получил посылку с MEGA... блин сколько всего добавил и даже дебаг не удаляю =)