УкраїнськаEnglishmRussian
Вхід/Новий
У темі багато повідомлень

Несколько предложений/замечаний...


Автор Повідомлення
Повідомлення створено: 11. 05. 2022 [12:53]
mr_dsv
Сергій Дорошка
Contributor
Автор теми
Зареєстрован(а) с: 31.10.2012
Повідомлення: 31
Добрый день Роман!

"накопалось/наболелось" (относится к релизу r2825)

При компиляции с помощью clang 14 выдается ряд предупреждений на которые можно обратить внимание:

1.
--- resalloc.cpp Sat Apr 02 10:50:07 2022
+++ resalloc.cpp.m Fri Apr 29 09:39:36 2022
@@ -47,7 +52,7 @@
int rez = 0;
#if !__GLIBC_PREREQ(2,4)
//EDEADLK imitation
- if(wThr && wThr == pthread_self()) rez == EDEADLK;
+ if(wThr && wThr == pthread_self()) rez = EDEADLK; //clang_warn
else
#endif
if(!tm) rez = pthread_rwlock_wrlock(&rwc);
@@ -80,7 +85,7 @@
int rez = 0;
#if !__GLIBC_PREREQ(2,4)
//EDEADLK imitation
- if(wThr && wThr == pthread_self()) rez == EDEADLK;
+ if(wThr && wThr == pthread_self()) rez = EDEADLK; //clang_warn
else
#endif
if(!tm) rez = pthread_rwlock_rdlock(&rwc);

2.
--- tprmtmpl.cpp Tue May 03 07:59:38 2022
+++ tprmtmpl.cpp.m Tue May 10 14:12:45 2022
@@ -549,7 +549,7 @@
it->second.addr = ""; it->second.con.free();
it->second.hops = 0;
mess_warning(obj->nodePath().c_str(), _("Detected of the link recursion."));
- return EVAL_REAL;
+ return false; //clang_warn - !!! или все таки true
}
it->second.hops++;

3.
--- dbf.cpp Sat Apr 02 10:50:07 2022
+++ dbf.cpp.m Tue May 10 10:58:42 2022
@@ -296,7 +300,7 @@
for(int i = 0; i < db_head_ptr->numb_rec; i++)
{
str_tmp = (char*)calloc(db_head_ptr->len_rec+attr->len_fild-db_field_ptr[posField].len_fild, 1);
- memmove(str_tmp, items[i], rec_len+(attr->len_fild<db_field_ptr[posField].len_fild)?attr->len_fild:db_field_ptr[posField].len_fild);
+ memmove(str_tmp, items[i], rec_len+((attr->len_fild<db_field_ptr[posField].len_fild)?attr->len_fild:db_field_ptr[posField].len_fild)); //clang_warn- !!! мне так кажется...
memmove(str_tmp+rec_len+attr->len_fild, (char*)items[i]+rec_len+db_field_ptr[posField].len_fild, db_head_ptr->len_rec-rec_len-db_field_ptr[posField].len_fild);
free(items[i]);
items[i] = str_tmp;

4.
--- daq_gate.cpp Tue May 03 07:59:38 2022
+++ daq_gate.cpp.m Tue May 10 14:22:11 2022
@@ -674,7 +674,7 @@
lstRdMess = TMess::SRec(SYS->sysTm()-3600*cntr.restDtTm(), 0, "", 0, cntr.restDtTm()?prmNd->attr("tm"):"");
else {
// First initial request for not active alarms
- if(isHistReq=(lstRdMess.categ.empty() && !lstRdMess.mess.empty())) lstRdMess.mess = "";
+ if((isHistReq=(lstRdMess.categ.empty() && !lstRdMess.mess.empty()))) lstRdMess.mess = ""; //clang_warn

if(lstRdMess_.time > lstRdMess.time) lstRdMess = lstRdMess_;
else if(lstRdMess_.time) lstRdMess = TMess::SRec(lstRdMess_.time+1);

5.
--- modbus_prt.cpp Tue May 03 07:59:38 2022
+++ modbus_prt.cpp.m Tue May 10 14:24:09 2022
@@ -1558,7 +1558,7 @@
compileFuncSnthHgl(TSYS::strParse(progLang(),1,"."),*opt);
} catch(...) { }
}
- else if(data && data->func() && data->TPrmTempl::Impl::cntrCmdProc(opt,"/cfg")) ;
+ else if(data && data->func() && data->TPrmTempl::Impl::cntrCmdProc(opt,"/cfg")) {} //clang_warn- !!! "пустой" if
}
else TCntrNode::cntrCmdProc(opt);
}

6.
--- libOPC_UA.cpp Sat Apr 02 10:50:07 2022
+++ libOPC_UA.cpp.m Tue May 10 11:21:17 2022
@@ -4540,7 +4540,7 @@
}
if(!nd.isNull()) mIt.nd = nd;
if(aid != OpcUa_NPosID) mIt.aid = aid;
- if(tmToRet != -1) mIt.tmToRet = tmToRet;
+ if(tmToRet != TimestampsToReturn(-1)) mIt.tmToRet = tmToRet; //clang_warn
if(qSz != OpcUa_NPosID) mIt.qSz = std::max(uint32_t(1), std::min(uint32_t(1000),qSz)); //?!?! Make the upper limit configurable
if(dO >= 0) mIt.dO = dO;
if(cH != OpcUa_NPosID) mIt.cH = cH;

7.
--- socket.h Sat Apr 02 10:50:07 2022
+++ socket.h.m Tue May 10 11:38:23 2022
@@ -196,7 +196,7 @@

void setTimings( const string &vl, bool isDef = false );
void setAttempts( unsigned short vl );
- void setMSS( unsigned vl ) { mMSS = vl ? vmax(100,vmin(1000000,vl)) : 0; modif(); }
+ void setMSS( unsigned vl ) { mMSS = vl ? vmax(100,vmin(65535,vl)) : 0; modif(); } //clang_warn
void setTmCon( int vl ) { mTmCon = vmax(1,vmin(60000,vl)); }

void start( int time = 0 );

8.
--- qtcfg.cpp Tue May 03 07:59:38 2022
+++ qtcfg.cpp.m Tue May 10 14:53:53 2022
@@ -2544,7 +2544,13 @@
string reqPath = node.attr("path");
size_t reqElPos = reqPath.rfind("/");
if(reqElPos != string::npos) {
- string reqPathEl = reqPath.substr(reqElPos+1), reqPath = reqPath.substr(0,reqElPos), selNds_lim;
+//clang_warn
+ string reqPathEl = reqPath.substr(reqElPos+1), selNds_lim;
+ reqPath = reqPath.substr(0,reqElPos);
vector<string> selNds;
QList<QTreeWidgetItem *> sel_ls = CtrTree->selectedItems();
for(unsigned iEl = 0; iEl < sel_ls.size(); iEl++)

9. Для Vision\vis_shapes.cpp и WebVision\vca_sess.cpp "приложил"

10. Еще такое... Может для SCADAHost: public QThread (в QTCfg и Vision) использовать QMutex (вместо ResMtx) и QWaitCondition (вместо CondVar) для синхронизации? Добавится только "&" в -> cond.wait(&mtx, ...);


Вкладений файл

vis_shapes.cpp.patch (Тип файлу: application/octet-stream, Розмір: 1.99 кілобайтів) — 597 завантажень
vca_sess.cpp.patch (Тип файлу: application/octet-stream, Розмір: 2.06 кілобайтів) — 620 завантажень
Повідомлення створено: 11. 05. 2022 [14:39]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
"mr_dsv" wrote:

- if(wThr && wThr == pthread_self()) rez == EDEADLK;
+ if(wThr && wThr == pthread_self()) rez = EDEADLK; //clang_warn

Да, хотя этот код фактически не работает нигде.

"mr_dsv" wrote:

- return EVAL_REAL;
+ return false; //clang_warn - !!! или все таки true

Да, хотя тут более важно чтобы прерывало связывание.

"mr_dsv" wrote:

- memmove(str_tmp, items[i], rec_len+(attr->len_fild<db_field_ptr[posField].len_fild)?attr->len_fild:db_field_ptr[posField].len_fild);
+ memmove(str_tmp, items[i], rec_len+((attr->len_fild<db_field_ptr[posField].len_fild)?attr->len_fild:db_field_ptr[posField].len_fild)); //clang_warn- !!! мне так кажется...

Да, код древний и GCC последовательно правильно понимает.

"mr_dsv" wrote:

- if(isHistReq=(lstRdMess.categ.empty() && !lstRdMess.mess.empty())) lstRdMess.mess = "";
+ if((isHistReq=(lstRdMess.categ.empty() && !lstRdMess.mess.empty()))) lstRdMess.mess = ""; //clang_warn

Нет, хотя некоторые версии GCC на такое тоже ругаются, но что одинаково.

"mr_dsv" wrote:

- else if(data && data->func() && data->TPrmTempl::Impl::cntrCmdProc(opt,"/cfg")) ;
+ else if(data && data->func() && data->TPrmTempl::Impl::cntrCmdProc(opt,"/cfg")) {} //clang_warn- !!! "пустой" if

Нет, это вообще дурь от CLang и таких оборотов у меня много.

"mr_dsv" wrote:

- if(tmToRet != -1) mIt.tmToRet = tmToRet;
+ if(tmToRet != TimestampsToReturn(-1)) mIt.tmToRet = tmToRet; //clang_warn

Нет, правильно:
+ if((int)tmToRet != -1) mIt.tmToRet = tmToRet;

"mr_dsv" wrote:

- void setMSS( unsigned vl ) { mMSS = vl ? vmax(100,vmin(1000000,vl)) : 0; modif(); }
+ void setMSS( unsigned vl ) { mMSS = vl ? vmax(100,vmin(65535,vl)) : 0; modif(); } //clang_warn

Да, для входного транспорта так и есть.

"mr_dsv" wrote:

- string reqPathEl = reqPath.substr(reqElPos+1), reqPath = reqPath.substr(0,reqElPos), selNds_lim;
+//clang_warn
+ string reqPathEl = reqPath.substr(reqElPos+1), selNds_lim;
+ reqPath = reqPath.substr(0,reqElPos);

Да, reqPath определена уже.

"mr_dsv" wrote:

9. Для Vision\vis_shapes.cpp и WebVision\vca_sess.cpp "приложил"

Да, в основном очистка fftOut через free(), а не delete, и прямое приведение curVal к int64_t.

"mr_dsv" wrote:

10. Еще такое... Может для SCADAHost: public QThread (в QTCfg и Vision) использовать QMutex (вместо ResMtx) и QWaitCondition (вместо CondVar) для синхронизации? Добавится только "&" в -> cond.wait(&mtx, ...);

Нет, поскольку CondVar::wait() использует CLOCK_MONOTONIC, а QWaitCondition нет.

Learn, learn and learn better than work, work and work.
Повідомлення створено: 16. 05. 2022 [11:34]
mr_dsv
Сергій Дорошка
Contributor
Автор теми
Зареєстрован(а) с: 31.10.2012
Повідомлення: 31
Доброго дня.

Один вопрос по п.10. Если установить ClockRT в "1", то уже вроде и не CLOCK_MONOTONIC в CondVar::wait(). Или ClockRT подразумевает работу без QT?
Повідомлення створено: 16. 05. 2022 [11:40]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
"mr_dsv" wrote:

Один вопрос по п.10. Если установить ClockRT в "1", то уже вроде и не CLOCK_MONOTONIC в CondVar::wait(). Или ClockRT подразумевает работу без QT?

ClockRT в основном не ставится, поэтому CLOCK_MONOTONIC и исключено мертвое блокирование при скачках времени, а опцией для экзотических встраиваемых систем, где GUI часто нет вообще.

Learn, learn and learn better than work, work and work.
Повідомлення створено: 07. 03. 2023 [10:02]
mr_dsv
Сергій Дорошка
Contributor
Автор теми
Зареєстрован(а) с: 31.10.2012
Повідомлення: 31
Доброго дня.

Есть некоторое недопонимание :bang:

1. В vcaBase для "объекта" anShow1 (и anShow) имеем код для Notification create
...
else if(pErrCode == 3) alarm = "50|"+pNAME+"|"+spName+" "+tr("above alarm border")+".|"+alTp;
else if(pErrCode == 4) alarm = "50|"+pNAME+"|"+spName+" "+tr("bellow alarm border")+".|"+alTp;
else if(pErrCode == 5) alarm = "10|"+pNAME+"|"+spName+" "+tr("above warning border")+".|"+alTp;
else if(pErrCode == 6) alarm = "10|"+pNAME+"|"+spName+" "+tr("bellow warning border")+".|"+alTp;
...

2. В vca для проекта AGLKS имеем, ну к примеру ...
INSERT INTO prj_AGLKS_io VALUES('/prj_AGLKS/pg_so/pg_1/pg_mn/pg_10','spName','Pressure after first stage',33,'','Pressure after first stage','Pi_нд','Тиск після першої ступені','','Тиск після першої ступені','Давление после первой ступени','','Давление после первой ступени');

3. По факту (при выборе LANG=uk_UA.UTF-8) при возникновении Notification имеем текст для произношения:
Pressure after first stage нижче норми.

Это так специально задумывалось, или нужно где-то подкрутить...

PS: openscada-1+r2870


Повідомлення створено: 22. 03. 2023 [15:21]
mr_dsv
Сергій Дорошка
Contributor
Автор теми
Зареєстрован(а) с: 31.10.2012
Повідомлення: 31
Доброго дня.

1. Знову стосовно мовного питання (LANG=uk_UA.UTF-8). На разі Notification2 (мова) працює як треба, але до тих пір доки у тексті не трапиться слово з апострофом. Тоді до апострофа додається зворотній слеш і TTS engine (RHVoice) веде себе так ніби їй ззаду щось задвинули :).
До речі мовознавці що підтримують "український" RHVoice кажуть/пишуть що можливе застосування аж 4-х апострофів (' ’ ‘ ʼ) які RHVoice правильно опрацьовує, звізно якщо немає зворотнього слешу. Прикладаю файли для кращого розуміння. Можливо якось можна це вирішити.

2. Есть предложение дополнить JavaLike скрипт для Notification1 (Buzzer)
if(doNtf) {
if(en) {
if(SYS.fileSize(prcID+".pid") <= 0) {
if(res.length) {
if((play=SYS.system("which play")).length) {
SYS.fileWrite(prcID+".res", res);
SYS.system(play.parseLine(0)+" -q "+prcID+".res &\necho $! > "+prcID+".pid", true);
}
}
else {
if((beep=SYS.system("which beep")).length)
SYS.system(beep.parse(0,"\n")+" -f 1000 -l 100000 &\necho $! > "+prcID+".pid", true);
else if((play=SYS.system("which play")).length)
SYS.system(play.parse(0,"\n")+" -q -n synth 1000000 sin 1000 gain -20 &\necho $! > "+prcID+".pid", true);
}
}
} else SYS.system("if test -s "+prcID+".pid; then kill $(cat "+prcID+".pid); sleep 1; rm "+prcID+".pid "+prcID+".res; fi");

}......

Не везде есть Phonon (или желание его использовать).

3. Еще один вопрос. Планируется ли переход на SSL 3.1.0. Сборка с новыми библиотеками идет с кучей предупреждений об использовании устаревших функций. Да и на сайте openssl "пугают": The previous LTS version (the 1.1.1 series) is also available and is supported until 11th September 2023.
Вкладений файл

Апострофи.txt (Тип файлу: text/plain, Розмір: 12 байтів) — 353 завантажень
проблема_з_апострофом.txt (Тип файлу: text/plain, Розмір: 382 байтів) — 401 завантажень
проблема_з_апострофом.ogg (Тип файлу: audio/ogg, Розмір: 221.04 кілобайтів) — 383 завантажень
Повідомлення створено: 22. 03. 2023 [18:47]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
"mr_dsv" wrote:

1. Знову стосовно мовного питання (LANG=uk_UA.UTF-8). На разі Notification2 (мова) працює як треба, але до тих пір доки у тексті не трапиться слово з апострофом. Тоді до апострофа додається зворотній слеш і TTS engine (RHVoice) веде себе так ніби їй ззаду щось задвинули :).

Так, слеш зайвий, прибрав разом із уніфікацією кодування за слешем.

RHVoice це що, голос для festival, чи щось окреме?

"mr_dsv" wrote:

Не везде есть Phonon (или желание его использовать).

Воно і є у прикладах до конкретного візуалізатора, якщо не хочеться Phonon

"mr_dsv" wrote:

3. Еще один вопрос. Планируется ли переход на SSL 3.1.0. Сборка с новыми библиотеками идет с кучей предупреждений об использовании устаревших функций. Да и на сайте openssl "пугают": The previous LTS version (the 1.1.1 series) is also available and is supported until 11th September 2023.

У LTS дистрибутивах воно підтримуватиметься довго, а щойно потрапить до наступного LTS то і адаптується, або разом із адаптацією до ініціативних підключень, що лежить у оперативних планах.

Learn, learn and learn better than work, work and work.
Повідомлення створено: 22. 03. 2023 [19:34]
mr_dsv
Сергій Дорошка
Contributor
Автор теми
Зареєстрован(а) с: 31.10.2012
Повідомлення: 31
RHVoice це tts engine з дуже пристойною підтримкою української мови. Є для windows, android, можлива збірка під Linux. Для Arch Linux є бінарні пакети але не остання версія.
Повідомлення створено: 16. 05. 2023 [12:16]
mr_dsv
Сергій Дорошка
Contributor
Автор теми
Зареєстрован(а) с: 31.10.2012
Повідомлення: 31
Доброго дня.

1. Касательно DAQ.System.
- при добавлении параметра (ну к примеру "сетевой интерфейс" - id() "netstat") все отрабатывает хорошо, но при "удалении" сетевого интерфейса,
параметр остается... Может можно и удаление добавить?
- при добавлении параметра любого типа сначала вызывается CPU::init() потом CPU::deInit() (как "первый стоящий" при регистрации) и только
потом "свой" init(). Может можно как-то сразу "свой" init() вызывать?

2. Касательно Transport.SSL
- CRYPTO_set_id_callback(); CRYPTO_set_locking_callback(); CRYPTO_set_dynlock_create_callback(); CRYPTO_set_dynlock_lock_callback();
CRYPTO_set_dynlock_destroy_callback(); вроде как "устаревшие" и не используются еще с версии 1.1.0.
Может их использование "обложить":
#if OPENSSL_VERSION_NUMBER < OPENSSL_VERSION_1_1_0
#endif
или вообще убрать...




7787