IOT SDK

Patryk
Posty: 701
Rejestracja: pn sty 07, 2019 7:51 pm

ndz lut 09, 2020 7:09 am

Kolejna prośba - gdyż nie znalazłem nigdzie podpowiedzi.

Chciałbym mieć możliwość na stronie konfiguracyjnej wyboru między:

Kod: Zaznacz cały

supla_relay_cfg[0].flags = RELAY_FLAG_RESET;
a

Kod: Zaznacz cały

supla_relay_cfg[0].flags = RELAY_FLAG_RESTORE_FORCE
O ile na stronie konfiguracyjnej w HTML, dam radę to dodać ( tak myśle ;) ), nie znalazłem żadnego przykładu z kodem.
Coś na wzór  inCan-a -  możliwość wybory między MONOSTABLE, a BISTABLE.
Czy mógłby KTOŚ zamieścić kawałek kodu,
jak by to miało być.
Awatar użytkownika
lesny8
Posty: 981
Rejestracja: pn gru 11, 2017 9:43 pm

ndz lut 09, 2020 11:54 am

Patryk pisze:
ndz lut 09, 2020 7:09 am
Kolejna prośba - gdyż nie znalazłem nigdzie podpowiedzi.

Chciałbym mieć możliwość na stronie konfiguracyjnej wyboru między:

Kod: Zaznacz cały

supla_relay_cfg[0].flags = RELAY_FLAG_RESET;
a

Kod: Zaznacz cały

supla_relay_cfg[0].flags = RELAY_FLAG_RESTORE_FORCE
O ile na stronie konfiguracyjnej w HTML, dam radę to dodać ( tak myśle ;) ), nie znalazłem żadnego przykładu z kodem.
Coś na wzór inCan-a - możliwość wybory między MONOSTABLE, a BISTABLE.
Czy mógłby KTOŚ zamieścić kawałek kodu,
jak by to miało być.
Ja mam to zrobione tak:

w pliku supla_esp_cfgmode.c mam zdefiniowane dodatkowe parametry i ich obsługę

Kod: Zaznacz cały

#define VAR_CMD          23
#define VAR_R1S          16//dodaj
#define VAR_R2S          17//dodaj
w tym samym pliku w funkcji supla_esp_parse_request

Kod: Zaznacz cały

....

				char cmd[3] = { 'c', 'm', 'd' }; //odszukaj
				char r1s[3] = { 'r', '1', 's' };//dodaj
				char r2s[3] = { 'r', '2', 's' };//dodaj

....

					} else if ( memcmp(trg, &pdata[a], 3) == 0 ) {//odszukaj

						pVars->current_var = VAR_TRG;
						pVars->buff_size = 12;
						pVars->pbuff = pVars->intval;

					} else if ( memcmp(r1s, &pdata[a], 3) == 0 ) { //dodaj od

						pVars->current_var = VAR_R1S;
						pVars->buff_size = 12;
						pVars->pbuff = pVars->intval;

					} else if ( memcmp(r2s, &pdata[a], 3) == 0 ) {

						pVars->current_var = VAR_R2S;
						pVars->buff_size = 12;
						pVars->pbuff = pVars->intval;

					//}// dodaj do
				    	} else if ( memcmp(cmd, &pdata[a], 3) == 0 ) {

				    	if (user_cmd == NULL) {
				    		user_cmd = malloc(CMD_MAXSIZE);
				    	}

						pVars->current_var = VAR_CMD;
						pVars->buff_size = CMD_MAXSIZE;
						pVars->pbuff = user_cmd;

#ifndef CFG_TIME_VARIABLES

....

					} else if ( pVars->current_var == VAR_TRG ) {//odszukaj

						cfg->Trigger = pVars->intval[0] - '0';

					} else if ( pVars->current_var == VAR_R1S ) { //dodaj od

						cfg->Relay1State = pVars->intval[0] - '0';

					} else if ( pVars->current_var == VAR_R2S ) {

						cfg->Relay2State = pVars->intval[0] - '0';

					// dodaj do
#ifndef CFG_TIME_VARIABLES
......
Możesz swoje zmiany opatrzeć jakimś makrem tak jak jest to zrobione dla CFG_TIME_VARIABLES, wtedy wygląda to bardziej elegancko. Jak to rozkminiałem to jeszcze nie byłem świadomy, że tak ładnie można :roll: :)

W pliku supla_esp_cfg.h mam jeszcze zdefiniowane dodatkowo

Kod: Zaznacz cały

...
#define BTN_TYPE_MONOSTABLE       0
#define BTN_TYPE_BISTABLE         1

#define RELAY_LOW		0 //dodaj
#define RELAY_MEMORY	1 //dodaj

typedef struct {

.....

    char Button2Type;		//odszukaj

    char Relay1State;		//dodaj
    char Relay2State;		//dodaj

.....

}SuplaEspCfg;

Następnie w pliku *.h definiującym płytkę mam deklarację własnego templatu strony konfiguracyjnej

Kod: Zaznacz cały

char * ICACHE_FLASH_ATTR supla_esp_board_cfg_html_template(char dev_name[], char mac[], char data_saved);
a w *.c definicję tego templatu.

Kod: Zaznacz cały

char * ICACHE_FLASH_ATTR
supla_esp_board_cfg_html_template(char dev_name[], char mac[], char data_saved)
{
	char *buffer = 0;

		char html_template_header[] = "<!DOCTYPE html><meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no\"><style>body{font-size:14px;font-family:HelveticaNeue,\"Helvetica Neue\",HelveticaNeueRoman,HelveticaNeue-Roman,\"Helvetica Neue Roman\",TeXGyreHerosRegular,Helvetica,Tahoma,Geneva,Arial,sans-serif;font-weight:400;font-stretch:normal;background:#00d151;color:#fff;line-height:20px;padding:0}.s{width:460px;margin:0 auto;margin-top:calc(50vh - 340px);border:solid 3px #fff;padding:0 10px 10px;border-radius:3px}#l{display:block;max-width:150px;height:155px;margin:-80px auto 20px;background:#00d151;padding-right:5px}#l path{fill:#000}.w{margin:3px 0 16px;padding:5px 0;border-radius:3px;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.3)}h1,h3{margin:10px 8px;font-family:HelveticaNeueLight,HelveticaNeue-Light,\"Helvetica Neue Light\",HelveticaNeue,\"Helvetica Neue\",TeXGyreHerosRegular,Helvetica,Tahoma,Geneva,Arial,sans-serif;font-weight:300;font-stretch:normal;color:#000;font-size:23px}h1{margin-bottom:14px;color:#fff}span{display:block;margin:10px 7px 14px}i{display:block;font-style:normal;position:relative;border-bottom:solid 1px #00d151;height:42px}i:last-child{border:none}label{position:absolute;display:inline-block;top:0;left:8px;color:#00d151;line-height:41px;pointer-events:none}input,select{width:calc(100% - 145px);border:none;font-size:16px;line-height:40px;border-radius:0;letter-spacing:-.5px;background:#fff;color:#000;padding-left:144px;-webkit-appearance:none;-moz-appearance:none;appearance:none;outline:0!important;height:40px}select{padding:0;float:right;margin:1px 3px 1px 2px}button{width:100%;border:0;background:#000;padding:5px 10px;font-size:16px;line-height:40px;color:#fff;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.3);cursor:pointer}.c{background:#ffe836;position:fixed;width:100%;line-height:80px;color:#000;top:0;left:0;box-shadow:0 1px 3px rgba(0,0,0,.3);text-align:center;font-size:26px;z-index:100}@media all and (max-height:920px){.s{margin-top:80px}}@media all and (max-width:900px){.s{width:calc(100% - 20px);margin-top:40px;border:none;padding:0 8px;border-radius:0}#l{max-width:80px;height:auto;margin:10px auto 20px}h1,h3{font-size:19px}i{border:none;height:auto}label{display:block;margin:4px 0 12px;color:#00d151;font-size:13px;position:relative;line-height:18px}input,select{width:calc(100% - 10px);font-size:16px;line-height:28px;padding:0 5px;border-bottom:solid 1px #00d151}select{width:100%;float:none;margin:0}}</style><script type=\"text/javascript\">setTimeout(function(){var element =  document.getElementById('msg');if ( element != null ) element.style.visibility = \"hidden\";},3200);</script>";

		#ifdef __FOTA
		char html_template[] = "%s%s<div class=\"s\"><svg version=\"1.1\" id=\"l\" x=\"0\" y=\"0\" viewBox=\"0 0 200 200\" xml:space=\"preserve\"><path d=\"M59.3,2.5c18.1,0.6,31.8,8,40.2,23.5c3.1,5.7,4.3,11.9,4.1,18.3c-0.1,3.6-0.7,7.1-1.9,10.6c-0.2,0.7-0.1,1.1,0.6,1.5c12.8,7.7,25.5,15.4,38.3,23c2.9,1.7,5.8,3.4,8.7,5.3c1,0.6,1.6,0.6,2.5-0.1c4.5-3.6,9.8-5.3,15.7-5.4c12.5-0.1,22.9,7.9,25.2,19c1.9,9.2-2.9,19.2-11.8,23.9c-8.4,4.5-16.9,4.5-25.5,0.2c-0.7-0.3-1-0.2-1.5,0.3c-4.8,4.9-9.7,9.8-14.5,14.6c-5.3,5.3-10.6,10.7-15.9,16c-1.8,1.8-3.6,3.7-5.4,5.4c-0.7,0.6-0.6,1,0,1.6c3.6,3.4,5.8,7.5,6.2,12.2c0.7,7.7-2.2,14-8.8,18.5c-12.3,8.6-30.3,3.5-35-10.4c-2.8-8.4,0.6-17.7,8.6-22.8c0.9-0.6,1.1-1,0.8-2c-2-6.2-4.4-12.4-6.6-18.6c-6.3-17.6-12.7-35.1-19-52.7c-0.2-0.7-0.5-1-1.4-0.9c-12.5,0.7-23.6-2.6-33-10.4c-8-6.6-12.9-15-14.2-25c-1.5-11.5,1.7-21.9,9.6-30.7C32.5,8.9,42.2,4.2,53.7,2.7c0.7-0.1,1.5-0.2,2.2-0.2C57,2.4,58.2,2.5,59.3,2.5z M76.5,81c0,0.1,0.1,0.3,0.1,0.6c1.6,6.3,3.2,12.6,4.7,18.9c4.5,17.7,8.9,35.5,13.3,53.2c0.2,0.9,0.6,1.1,1.6,0.9c5.4-1.2,10.7-0.8,15.7,1.6c0.8,0.4,1.2,0.3,1.7-0.4c11.2-12.9,22.5-25.7,33.4-38.7c0.5-0.6,0.4-1,0-1.6c-5.6-7.9-6.1-16.1-1.3-24.5c0.5-0.8,0.3-1.1-0.5-1.6c-9.1-4.7-18.1-9.3-27.2-14c-6.8-3.5-13.5-7-20.3-10.5c-0.7-0.4-1.1-0.3-1.6,0.4c-1.3,1.8-2.7,3.5-4.3,5.1c-4.2,4.2-9.1,7.4-14.7,9.7C76.9,80.3,76.4,80.3,76.5,81z M89,42.6c0.1-2.5-0.4-5.4-1.5-8.1C83,23.1,74.2,16.9,61.7,15.8c-10-0.9-18.6,2.4-25.3,9.7c-8.4,9-9.3,22.4-2.2,32.4c6.8,9.6,19.1,14.2,31.4,11.9C79.2,67.1,89,55.9,89,42.6z M102.1,188.6c0.6,0.1,1.5-0.1,2.4-0.2c9.5-1.4,15.3-10.9,11.6-19.2c-2.6-5.9-9.4-9.6-16.8-8.6c-8.3,1.2-14.1,8.9-12.4,16.6C88.2,183.9,94.4,188.6,102.1,188.6z M167.7,88.5c-1,0-2.1,0.1-3.1,0.3c-9,1.7-14.2,10.6-10.8,18.6c2.9,6.8,11.4,10.3,19,7.8c7.1-2.3,11.1-9.1,9.6-15.9C180.9,93,174.8,88.5,167.7,88.5z\"/></svg>"
				"<h1>%s</h1><span>LAST STATE: %s<br>"
				"Firmware: %s<br>"
				"Compiled: %s<br>"
				"GUID: %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X<br>"
				"MAC: %02X:%02X:%02X:%02X:%02X:%02X</span>"
				"<form method=\"post\">"
				"<div class=\"w\">"
				"<h3>Wi-Fi Settings</h3>"
				"<i><input name=\"sid\" value=\"%s\"><label>Network name</label></i>"
				"<i><input name=\"wpw\"><label>Password</label></i>"
				"</div>"
				"<div class=\"w\">"
				"<h3>Supla Settings</h3>"
				"<i><input name=\"svr\" value=\"%s\"><label>Server</label></i>"
				"<i><input name=\"eml\" value=\"%s\"><label>E-mail</label></i>"
				"</div>"
				"<div class=\"w\">"
				"<h3>Additional Settings</h3>"
				"<i><select name=\"bt1\"><option value=\"0\" %s>monostable</option><option value=\"1\" %s>bistable</option></select><label>Button1 type:</label></i>"
				"<i><select name=\"bt2\"><option value=\"0\" %s>monostable</option><option value=\"1\" %s>bistable</option></select><label>Button2 type:</label></i>"
				"<i><select name=\"r1s\"><option value=\"0\" %s>low</option><option value=\"1\" %s>memory</option></select><label>Relay1 state:</label></i>"
				"<i><select name=\"r2s\"><option value=\"0\" %s>low</option><option value=\"1\" %s>memory</option></select><label>Relay2 state:</label></i>"
				"<i><select name=\"upd\"><option value=\"0\" %s>NO<option value=\"1\" %s>YES</select><label>Firmware update</label></i>"
				"</div>"
				"<button type=\"submit\">SAVE</button></form>"
				"</div><br><br>";
		#else
		char html_template[] = "%s%s<div class=\"s\"><svg version=\"1.1\" id=\"l\" x=\"0\" y=\"0\" viewBox=\"0 0 200 200\" xml:space=\"preserve\"><path d=\"M59.3,2.5c18.1,0.6,31.8,8,40.2,23.5c3.1,5.7,4.3,11.9,4.1,18.3c-0.1,3.6-0.7,7.1-1.9,10.6c-0.2,0.7-0.1,1.1,0.6,1.5c12.8,7.7,25.5,15.4,38.3,23c2.9,1.7,5.8,3.4,8.7,5.3c1,0.6,1.6,0.6,2.5-0.1c4.5-3.6,9.8-5.3,15.7-5.4c12.5-0.1,22.9,7.9,25.2,19c1.9,9.2-2.9,19.2-11.8,23.9c-8.4,4.5-16.9,4.5-25.5,0.2c-0.7-0.3-1-0.2-1.5,0.3c-4.8,4.9-9.7,9.8-14.5,14.6c-5.3,5.3-10.6,10.7-15.9,16c-1.8,1.8-3.6,3.7-5.4,5.4c-0.7,0.6-0.6,1,0,1.6c3.6,3.4,5.8,7.5,6.2,12.2c0.7,7.7-2.2,14-8.8,18.5c-12.3,8.6-30.3,3.5-35-10.4c-2.8-8.4,0.6-17.7,8.6-22.8c0.9-0.6,1.1-1,0.8-2c-2-6.2-4.4-12.4-6.6-18.6c-6.3-17.6-12.7-35.1-19-52.7c-0.2-0.7-0.5-1-1.4-0.9c-12.5,0.7-23.6-2.6-33-10.4c-8-6.6-12.9-15-14.2-25c-1.5-11.5,1.7-21.9,9.6-30.7C32.5,8.9,42.2,4.2,53.7,2.7c0.7-0.1,1.5-0.2,2.2-0.2C57,2.4,58.2,2.5,59.3,2.5z M76.5,81c0,0.1,0.1,0.3,0.1,0.6c1.6,6.3,3.2,12.6,4.7,18.9c4.5,17.7,8.9,35.5,13.3,53.2c0.2,0.9,0.6,1.1,1.6,0.9c5.4-1.2,10.7-0.8,15.7,1.6c0.8,0.4,1.2,0.3,1.7-0.4c11.2-12.9,22.5-25.7,33.4-38.7c0.5-0.6,0.4-1,0-1.6c-5.6-7.9-6.1-16.1-1.3-24.5c0.5-0.8,0.3-1.1-0.5-1.6c-9.1-4.7-18.1-9.3-27.2-14c-6.8-3.5-13.5-7-20.3-10.5c-0.7-0.4-1.1-0.3-1.6,0.4c-1.3,1.8-2.7,3.5-4.3,5.1c-4.2,4.2-9.1,7.4-14.7,9.7C76.9,80.3,76.4,80.3,76.5,81z M89,42.6c0.1-2.5-0.4-5.4-1.5-8.1C83,23.1,74.2,16.9,61.7,15.8c-10-0.9-18.6,2.4-25.3,9.7c-8.4,9-9.3,22.4-2.2,32.4c6.8,9.6,19.1,14.2,31.4,11.9C79.2,67.1,89,55.9,89,42.6z M102.1,188.6c0.6,0.1,1.5-0.1,2.4-0.2c9.5-1.4,15.3-10.9,11.6-19.2c-2.6-5.9-9.4-9.6-16.8-8.6c-8.3,1.2-14.1,8.9-12.4,16.6C88.2,183.9,94.4,188.6,102.1,188.6z M167.7,88.5c-1,0-2.1,0.1-3.1,0.3c-9,1.7-14.2,10.6-10.8,18.6c2.9,6.8,11.4,10.3,19,7.8c7.1-2.3,11.1-9.1,9.6-15.9C180.9,93,174.8,88.5,167.7,88.5z\"/></svg>"
				"<h1>%s</h1>"
				"<span>LAST STATE: %s<br>"
				"Firmware: %s<br>"
				"Compiled: %s<br>"
				"GUID: %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X<br>"
				"MAC: %02X:%02X:%02X:%02X:%02X:%02X</span>"
				"<form method=\"post\">"
				"<div class=\"w\">"
				"<h3>Wi-Fi Settings</h3>"
				"<i><input name=\"sid\" value=\"%s\"><label>Network name</label></i>"
				"<i><input name=\"wpw\"><label>Password</label></i>"
				"</div>"
				"<div class=\"w\">"
				"<h3>Supla Settings</h3>"
				"<i><input name=\"svr\" value=\"%s\"><label>Server</label></i>"
				"<i><input name=\"eml\" value=\"%s\"><label>E-mail</label></i>"
				"</div>"
				"<div class=\"w\">"
				"<h3>Additional Settings</h3>"
				"<i><select name=\"bt1\"><option value=\"0\" %s>monostable</option><option value=\"1\" %s>bistable</option></select><label>Button1 type:</label></i>"
				"<i><select name=\"bt2\"><option value=\"0\" %s>monostable</option><option value=\"1\" %s>bistable</option></select><label>Button2 type:</label></i>"
				"<i><select name=\"r1s\"><option value=\"0\" %s>low</option><option value=\"1\" %s>memory</option></select><label>Relay1 state:</label></i>"
				"<i><select name=\"r2s\"><option value=\"0\" %s>low</option><option value=\"1\" %s>memory</option></select><label>Relay2 state:</label></i>"
				"</div>"
				"<button type=\"submit\">SAVE</button>"
				"</form>"
				"</div><br><br>";
		#endif

		int bufflen = strlen(supla_esp_devconn_laststate())
					  +strlen(dev_name)
					  +strlen(SUPLA_ESP_SOFTVER)
					  +strlen(__DATE__" build:"__TIME__)
					  +strlen(supla_esp_cfg.WIFI_SSID)
					  +strlen(supla_esp_cfg.Server)
					  +strlen(supla_esp_cfg.Email)
					  +strlen(html_template_header)
					  +strlen(html_template)
					  +200;

		buffer = (char*)malloc(bufflen);

		ets_snprintf(buffer,
				bufflen,
				html_template,
				html_template_header,
				data_saved == 1 ? "<div id=\"msg\" class=\"c\">Data saved</div>" : "",
				dev_name,
				supla_esp_devconn_laststate(),
				SUPLA_ESP_SOFTVER,
				__DATE__" build:"__TIME__,
				(unsigned char)supla_esp_cfg.GUID[0],
				(unsigned char)supla_esp_cfg.GUID[1],
				(unsigned char)supla_esp_cfg.GUID[2],
				(unsigned char)supla_esp_cfg.GUID[3],
				(unsigned char)supla_esp_cfg.GUID[4],
				(unsigned char)supla_esp_cfg.GUID[5],
				(unsigned char)supla_esp_cfg.GUID[6],
				(unsigned char)supla_esp_cfg.GUID[7],
				(unsigned char)supla_esp_cfg.GUID[8],
				(unsigned char)supla_esp_cfg.GUID[9],
				(unsigned char)supla_esp_cfg.GUID[10],
				(unsigned char)supla_esp_cfg.GUID[11],
				(unsigned char)supla_esp_cfg.GUID[12],
				(unsigned char)supla_esp_cfg.GUID[13],
				(unsigned char)supla_esp_cfg.GUID[14],
				(unsigned char)supla_esp_cfg.GUID[15],
				(unsigned char)mac[0],
				(unsigned char)mac[1],
				(unsigned char)mac[2],
				(unsigned char)mac[3],
				(unsigned char)mac[4],
				(unsigned char)mac[5],
				supla_esp_cfg.WIFI_SSID,
				supla_esp_cfg.Server,
				supla_esp_cfg.Email,
				supla_esp_cfg.Button1Type == BTN_TYPE_MONOSTABLE ? "selected" : "",
				supla_esp_cfg.Button1Type == BTN_TYPE_BISTABLE ? "selected" : "",
				supla_esp_cfg.Button2Type == BTN_TYPE_MONOSTABLE ? "selected" : "",
				supla_esp_cfg.Button2Type == BTN_TYPE_BISTABLE ? "selected" : "",
				supla_esp_cfg.Relay1State == RELAY_LOW ? "selected" : "",
				supla_esp_cfg.Relay1State == RELAY_MEMORY ? "selected" : "",
				supla_esp_cfg.Relay2State == RELAY_LOW ? "selected" : "",
				supla_esp_cfg.Relay2State == RELAY_MEMORY ? "selected" : ""


				#ifdef __FOTA
				,
				supla_esp_cfg.FirmwareUpdate == 0 ? "selected" : "",
				supla_esp_cfg.FirmwareUpdate == 1 ? "selected" : ""
				#endif
				);

	return buffer;
}
Na samym końcu w pliku *.c definiującym płytkę w funkcji supla_esp_board_gpio_init odpowiednio do wyboru przypisuję flagi w zależności od wybranego parametru podczas konfiguracji modułu.

Kod: Zaznacz cały


	int relay_count = 0;
.....

	//Relay
	supla_relay_cfg[relay_count].gpio_id = B_RELAY1_PORT;
	if(supla_esp_cfg.Relay1State == RELAY_MEMORY)	
		supla_relay_cfg[relay_count].flags = RELAY_FLAG_RESTORE_FORCE;
	else
		supla_relay_cfg[relay_count].flags = RELAY_FLAG_RESET;
	supla_relay_cfg[relay_count].channel = relay_count;			// tu akurat relay channel = nr kanału w Cloud
	relay_count++;

    
	//Relay
	supla_relay_cfg[relay_count].gpio_id = B_RELAY2_PORT;
	if(supla_esp_cfg.Relay2State == RELAY_MEMORY)	
		supla_relay_cfg[relay_count].flags = RELAY_FLAG_RESTORE_FORCE;
	else
		supla_relay_cfg[relay_count].flags = RELAY_FLAG_RESET;
	supla_relay_cfg[relay_count].channel = relay_count;
    relay_count++;
Pomóżcie proszę choć odrobinę
https://pomagam.pl/af3hwf6c
Patryk
Posty: 701
Rejestracja: pn sty 07, 2019 7:51 pm

ndz lut 09, 2020 12:37 pm

Dzięki za info.
Będę próbował.
Patryk
Posty: 701
Rejestracja: pn sty 07, 2019 7:51 pm

wt lut 11, 2020 12:45 pm

@lesny8 mam jeszcze pytanie.
Czy udało Ci się może ( czy może próbowałeś ), uruchomić 2 lub więcej ds-ów na jednym gpio ??? ( oczywiście za pomocą IOT SDK ).
Awatar użytkownika
lesny8
Posty: 981
Rejestracja: pn gru 11, 2017 9:43 pm

wt lut 11, 2020 8:47 pm

Nie, nie próbowałem. Z tego komentarza wynika, że był jakiś plan na obsługę wielu ds-ów, ale zapewne potrzebny czas na realizację zjadły ważniejsze tematy :roll:
Pomóżcie proszę choć odrobinę
https://pomagam.pl/af3hwf6c
Patryk
Posty: 701
Rejestracja: pn sty 07, 2019 7:51 pm

wt lut 11, 2020 9:20 pm

Dzięki za info.
Czyli jedyna nadzieja w @pzygmunt :roll:
ODPOWIEDZ