310 for element in elementsTab: |
320 for element in elementsTab: |
311 infos = element.getElementAttributes() |
321 infos = element.getElementAttributes() |
312 for info in infos: |
322 for info in infos: |
313 if info["name"] == "id": |
323 if info["name"] == "id": |
314 element_id = str(info["value"]) |
324 element_id = str(info["value"]) |
|
325 _lock = " in_state_"+element_id+" = GUI_BUSY;\n" |
|
326 _unlock = " in_state_"+element_id+" = CHANGED;\n" |
315 if info["name"] == "name": |
327 if info["name"] == "name": |
316 element_name = str(info["value"]) |
328 element_name = str(info["value"]) |
317 type = element.GetElementInfos()["type"] |
329 type = element.GetElementInfos()["type"] |
318 FbdBlock = self.GetBlockType(type) |
330 FbdBlock = self.GetBlockType(type) |
319 if type == "Button": |
331 if type == "Button": |
320 fct += "void Program::On"+element_name+"Click(wxCommandEvent& event)\n{\n" |
332 fct += "void Program::On"+element_name+"Click(wxCommandEvent& event)\n{\n" |
321 fct += " if (flag_"+element_id+")\n {\n" |
333 fct += _lock |
322 fct += " flag_"+element_id+" = false;\n" |
|
323 element_num_patte = 1 |
334 element_num_patte = 1 |
324 for output in FbdBlock["outputs"]: |
335 for output in FbdBlock["outputs"]: |
325 element_type = TYPECONVERSION[output[1]] |
336 element_type = TYPECONVERSION[output[1]] |
326 fct += " _copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = true;\n" |
337 fct += " _copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = true;\n" |
327 element_num_patte +=1 |
338 element_num_patte +=1 |
328 fct += " flag_"+element_id+" = true;\n" |
339 fct += _unlock |
329 fct += " }\n" |
|
330 fct += " event.Skip();\n" |
340 fct += " event.Skip();\n" |
331 fct += "}\n\n" |
341 fct += "}\n\n" |
332 |
342 |
333 elif type == "RotatingCtrl": |
343 elif type == "RotatingCtrl": |
334 fct += "void Program::On"+element_name+"Changed(wxScrollEvent& event)\n{\n" |
344 fct += "void Program::On"+element_name+"Changed(wxScrollEvent& event)\n{\n" |
335 fct += " SVGUIRotatingCtrl* rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n" |
345 fct += " SVGUIRotatingCtrl* rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n" |
336 fct += " rotating->SendScrollEvent(event);\n" |
346 fct += " rotating->SendScrollEvent(event);\n" |
337 fct += " double angle = rotating->GetAngle();\n" |
347 fct += " double angle = rotating->GetAngle();\n" |
338 fct += " if (flag_"+element_id+")\n {\n" |
348 fct += _lock |
339 fct += " flag_"+element_id+" = false;\n" |
|
340 element_num_patte = 1 |
349 element_num_patte = 1 |
341 for output in FbdBlock["outputs"]: |
350 for output in FbdBlock["outputs"]: |
342 element_type = TYPECONVERSION[output[1]] |
351 element_type = TYPECONVERSION[output[1]] |
343 |
352 |
344 if element_num_patte == 1: |
353 if element_num_patte == 1: |
345 value = "angle" |
354 value = "angle" |
346 elif element_num_patte == 2: |
355 elif element_num_patte == 2: |
347 value = "true" |
356 value = "true" |
348 fct += " _copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = "+value+";\n" |
357 fct += " _copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = "+value+";\n" |
349 element_num_patte +=1 |
358 element_num_patte +=1 |
350 fct += " flag_"+element_id+" = true;\n" |
359 fct += _unlock |
351 fct += " }\n" |
|
352 fct += "}\n\n" |
360 fct += "}\n\n" |
353 elif type == "NoteBook": |
361 elif type == "NoteBook": |
354 fct += "void Program::On"+element_name+"TabChanged(wxNotebookEvent& event)\n{\n" |
362 fct += "void Program::On"+element_name+"TabChanged(wxNotebookEvent& event)\n{\n" |
355 fct += " SVGUINoteBook* notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n" |
363 fct += " SVGUINoteBook* notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n" |
356 fct += " notebook->SendNotebookEvent(event);\n" |
364 fct += " notebook->SendNotebookEvent(event);\n" |
357 fct += " unsigned int selected = notebook->GetCurrentPage();\n" |
365 fct += " unsigned int selected = notebook->GetCurrentPage();\n" |
358 fct += " if (flag_"+element_id+")\n {\n" |
366 fct += _lock |
359 fct += " flag_"+element_id+" = false;\n" |
|
360 element_num_patte = 1 |
367 element_num_patte = 1 |
361 for output in FbdBlock["outputs"]: |
368 for output in FbdBlock["outputs"]: |
362 element_type = TYPECONVERSION[output[1]] |
369 element_type = TYPECONVERSION[output[1]] |
363 |
370 |
364 if element_num_patte == 1: |
371 if element_num_patte == 1: |
365 value = "selected" |
372 value = "selected" |
366 elif element_num_patte == 2: |
373 elif element_num_patte == 2: |
367 value = "true" |
374 value = "true" |
368 fct += " _copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = "+value+";\n" |
375 fct += " _copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = "+value+";\n" |
369 element_num_patte +=1 |
376 element_num_patte +=1 |
370 fct += " flag_"+element_id+" = true;\n" |
377 fct += _unlock |
371 fct += " }\n" |
|
372 fct += "}\n\n" |
378 fct += "}\n\n" |
373 elif type == "Transform": |
379 elif type == "Transform": |
374 fct += "void Program::On"+element_name+"Paint(wxPaintEvent& event)\n{\n" |
380 fct += "void Program::On"+element_name+"Paint(wxPaintEvent& event)\n{\n" |
375 fct += " SVGUITransform* transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n" |
381 fct += " SVGUITransform* transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n" |
376 fct += " if (flag_"+element_id+")\n {\n" |
382 fct += _lock |
377 fct += " flag_"+element_id+" = false;\n" |
|
378 element_num_patte = 1 |
383 element_num_patte = 1 |
379 for output in FbdBlock["outputs"]: |
384 for output in FbdBlock["outputs"]: |
380 if element_num_patte == 1: |
385 if element_num_patte == 1: |
381 fct += " if (transform->GetX() != _copy__ID"+self.BusNumber+"_"+element_id+"_1)\n" |
386 fct += " if (transform->GetX() != _copy__ID"+self.BusNumber+"_"+element_id+"_1)\n" |
382 fct += " {\n" |
387 fct += " {\n" |
383 fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_1 = transform->GetX();\n" |
388 fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_1 = transform->GetX();\n" |
384 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n" |
389 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n" |
385 fct += " }\n" |
390 fct += " }\n" |
386 elif element_num_patte == 2: |
391 elif element_num_patte == 2: |
387 fct += " if (transform->GetY() != _copy__ID"+self.BusNumber+"_"+element_id+"_2)\n" |
392 fct += " if (transform->GetY() != _copy__ID"+self.BusNumber+"_"+element_id+"_2)\n" |
388 fct += " {\n" |
393 fct += " {\n" |
389 fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_2 = transform->GetY();\n" |
394 fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_2 = transform->GetY();\n" |
390 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n" |
395 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n" |
391 fct += " }\n" |
396 fct += " }\n" |
392 elif element_num_patte == 3: |
397 elif element_num_patte == 3: |
393 fct += " if (transform->GetXScale() != _copy__ID"+self.BusNumber+"_"+element_id+"_3)\n" |
398 fct += " if (transform->GetXScale() != _copy__ID"+self.BusNumber+"_"+element_id+"_3)\n" |
394 fct += " {\n" |
399 fct += " {\n" |
395 fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_3 = transform->GetXScale();\n" |
400 fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_3 = transform->GetXScale();\n" |
396 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n" |
401 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n" |
397 fct += " }\n" |
402 fct += " }\n" |
398 elif element_num_patte == 4: |
403 elif element_num_patte == 4: |
399 fct += " if (transform->GetYScale() != _copy__ID"+self.BusNumber+"_"+element_id+"_4)\n" |
404 fct += " if (transform->GetYScale() != _copy__ID"+self.BusNumber+"_"+element_id+"_4)\n" |
400 fct += " {\n" |
405 fct += " {\n" |
401 fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_4 = transform->GetYScale();\n" |
406 fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_4 = transform->GetYScale();\n" |
402 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n" |
407 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n" |
403 fct += " }\n" |
408 fct += " }\n" |
404 elif element_num_patte == 5: |
409 elif element_num_patte == 5: |
405 fct += " if (transform->GetAngle() != _copy__ID"+self.BusNumber+"_"+element_id+"_5)\n" |
410 fct += " if (transform->GetAngle() != _copy__ID"+self.BusNumber+"_"+element_id+"_5)\n" |
406 fct += " {\n" |
411 fct += " {\n" |
407 fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_5 = transform->GetAngle();\n" |
412 fct += " _copy__ID"+self.BusNumber+"_"+element_id+"_5 = transform->GetAngle();\n" |
408 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n" |
413 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_6 = true;\n" |
409 fct += " }\n" |
414 fct += " }\n" |
410 element_num_patte +=1 |
415 element_num_patte +=1 |
411 fct += " flag_"+element_id+" = true;\n" |
416 fct += _unlock |
412 fct += " }\n" |
|
413 fct += " event.Skip();\n" |
417 fct += " event.Skip();\n" |
414 fct += "}\n\n" |
418 fct += "}\n\n" |
415 elif type == "Container": |
419 elif type == "Container": |
416 fct += "void Program::On"+element_name+"Paint(wxPaintEvent& event)\n{\n" |
420 fct += "void Program::On"+element_name+"Paint(wxPaintEvent& event)\n{\n" |
417 fct += " SVGUIContainer* container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n" |
421 fct += " SVGUIContainer* container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n" |
418 fct += " if (container->IsVisible() != _copy__IX"+self.BusNumber+"_"+element_id+"_1 && flag_"+element_id+")\n" |
422 fct += " bool isvisible = container->IsVisible();\n" |
|
423 fct += _lock |
|
424 fct += " if (isvisible != _copy__IX"+self.BusNumber+"_"+element_id+"_1)\n" |
419 fct += " {\n" |
425 fct += " {\n" |
420 fct += " flag_"+element_id+" = false;\n" |
|
421 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_1 = container->IsVisible();\n" |
426 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_1 = container->IsVisible();\n" |
422 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n" |
427 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n" |
423 fct += " flag_"+element_id+" = true;\n" |
|
424 fct += " }\n" |
428 fct += " }\n" |
|
429 fct += _unlock |
425 fct += " event.Skip();\n" |
430 fct += " event.Skip();\n" |
426 fct += "}\n\n" |
431 fct += "}\n\n" |
427 |
432 |
428 fct += "void Program::OnChar(wxKeyEvent& event)\n{\n" |
433 fct += "void Program::OnChar(wxKeyEvent& event)\n{\n" |
429 fct += " SVGUIContainer* container = GetSVGUIRootElement();\n" |
434 fct += " SVGUIContainer* container = GetSVGUIRootElement();\n" |
465 if info["name"] == "id": |
472 if info["name"] == "id": |
466 element_id = str(info["value"]) |
473 element_id = str(info["value"]) |
467 type = element.GetElementInfos()["type"] |
474 type = element.GetElementInfos()["type"] |
468 FbdBlock = self.GetBlockType(type) |
475 FbdBlock = self.GetBlockType(type) |
469 if type == "ScrollBar": |
476 if type == "ScrollBar": |
470 fct += " if (focusedId == wxT(\""+element_id+"\") && flag_"+element_id+")\n" |
477 fct += " if (focusedId == wxT(\""+element_id+"\"))\n" |
471 fct += " {\n" |
478 fct += " {\n" |
472 fct += " flag_"+element_id+" = false;\n" |
|
473 fct += " unsigned int scrollPos = scrollbar->GetThumbPosition();\n" |
479 fct += " unsigned int scrollPos = scrollbar->GetThumbPosition();\n" |
474 fct += " _copy__IW"+self.BusNumber+"_"+element_id+"_1 = scrollPos;\n" |
480 fct += " _copy__IW"+self.BusNumber+"_"+element_id+"_1 = scrollPos;\n" |
475 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n" |
481 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = true;\n" |
476 fct += " flag_"+element_id+" = true;\n" |
|
477 fct += " }\n" |
482 fct += " }\n" |
478 fct += " }\n" |
483 fct += " }\n" |
479 fct += " event.Skip();\n" |
484 fct += " event.Skip();\n" |
480 fct += "}\n" |
485 fct += "}\n" |
481 |
486 |
482 |
487 |
483 |
488 |
484 |
489 |
|
490 fct += "/* OnPlcOutEvent updatde GUI with provided IEC __Q* PLC output variables */\n" |
485 fct += "void Program::OnPlcOutEvent(wxEvent& event)\n{\n" |
491 fct += "void Program::OnPlcOutEvent(wxEvent& event)\n{\n" |
486 fct += " int old_state;\n" |
492 for element in elementsTab: |
487 for element in elementsTab: |
493 infos = element.getElementAttributes() |
488 infos = element.getElementAttributes() |
494 for info in infos: |
489 for info in infos: |
495 if info["name"] == "id": |
490 if info["name"] == "id": |
496 element_id = str(info["value"]) |
491 element_id = str(info["value"]) |
497 _lock = " if (__sync_val_compare_and_swap (&out_state_"+element_id+", CHANGED, GUI_BUSY) == CHANGED)" |
|
498 _lock += " {\n" |
|
499 _unlock = " __sync_val_compare_and_swap (&out_state_"+element_id+", GUI_BUSY, UNCHANGED);\n" |
|
500 _unlock +=" }\n" |
492 type = element.GetElementInfos()["type"] |
501 type = element.GetElementInfos()["type"] |
493 FbdBlock = self.GetBlockType(type) |
502 FbdBlock = self.GetBlockType(type) |
494 if type == "Button": |
503 if type == "Button": |
495 fct += " old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n" |
504 fct += _lock |
496 fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n" |
505 fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_2)\n" |
497 fct += " {\n" |
506 fct += " {\n" |
498 fct += " flag_"+element_id+" = false;\n" |
|
499 fct += " SVGUIButton* button = (SVGUIButton*)GetElementById(wxT(\""+element_id+"\"));\n" |
507 fct += " SVGUIButton* button = (SVGUIButton*)GetElementById(wxT(\""+element_id+"\"));\n" |
500 fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_1)\n" |
508 fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_1)\n" |
501 fct += " button->Show();\n" |
509 fct += " button->Show();\n" |
502 fct += " else\n" |
510 fct += " else\n" |
503 fct += " button->Hide();\n" |
511 fct += " button->Hide();\n" |
504 fct += " flag_"+element_id+" = true;\n" |
|
505 fct += " }\n" |
512 fct += " }\n" |
506 fct += " __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n" |
513 fct += _unlock |
507 elif type == "Container": |
514 elif type == "Container": |
508 fct += " old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n" |
515 fct += _lock |
509 fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n" |
516 fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_2)\n" |
510 fct += " {\n" |
517 fct += " {\n" |
511 fct += " flag_"+element_id+" = false;\n" |
|
512 fct += " SVGUIContainer* container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n" |
518 fct += " SVGUIContainer* container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n" |
513 fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_1)\n" |
519 fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_1)\n" |
514 fct += " container->Show();\n" |
520 fct += " container->Show();\n" |
515 fct += " else\n" |
521 fct += " else\n" |
516 fct += " container->Hide();\n" |
522 fct += " container->Hide();\n" |
517 fct += " flag_"+element_id+" = true;\n" |
|
518 fct += " }\n" |
523 fct += " }\n" |
519 fct += " __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n" |
524 fct += _unlock |
520 elif type == "TextCtrl": |
525 elif type == "TextCtrl": |
521 fct += " old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n" |
526 fct += _lock |
522 fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n" |
527 fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_2)\n" |
523 fct += " {\n" |
528 fct += " {\n" |
524 fct += " flag_"+element_id+" = false;\n" |
|
525 fct += " SVGUITextCtrl* text = (SVGUITextCtrl*)GetElementById(wxT(\""+element_id+"\"));\n" |
529 fct += " SVGUITextCtrl* text = (SVGUITextCtrl*)GetElementById(wxT(\""+element_id+"\"));\n" |
526 fct += " wxString str = wxString::FromAscii(_copy__QB"+self.BusNumber+"_"+element_id+"_1);\n" |
530 fct += " wxString str = wxString::FromAscii(_copy__QB"+self.BusNumber+"_"+element_id+"_1);\n" |
527 fct += " text->SetText(str);\n" |
531 fct += " text->SetText(str);\n" |
528 fct += " flag_"+element_id+" = true;\n" |
|
529 fct += " }\n" |
532 fct += " }\n" |
530 fct += " __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n" |
533 fct += _unlock |
531 elif type == "ScrollBar": |
534 elif type == "ScrollBar": |
532 fct += " old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n" |
535 fct += _lock |
533 fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n" |
536 fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_2)\n" |
534 fct += " {\n" |
537 fct += " {\n" |
535 fct += " flag_"+element_id+" = false;\n" |
|
536 fct += " SVGUIScrollBar* scrollbar = (SVGUIScrollBar*)GetElementById(wxT(\""+element_id+"\"));\n" |
538 fct += " SVGUIScrollBar* scrollbar = (SVGUIScrollBar*)GetElementById(wxT(\""+element_id+"\"));\n" |
537 fct += " scrollbar->SetThumbPosition(_copy__QW"+self.BusNumber+"_"+element_id+"_1);\n" |
539 fct += " scrollbar->SetThumbPosition(_copy__QW"+self.BusNumber+"_"+element_id+"_1);\n" |
538 fct += " flag_"+element_id+" = true;\n" |
|
539 fct += " }\n" |
540 fct += " }\n" |
540 fct += " __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n" |
541 fct += _unlock |
541 elif type == "RotatingCtrl": |
542 elif type == "RotatingCtrl": |
542 fct += " old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n" |
543 fct += _lock |
543 fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n" |
544 fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_2)\n" |
544 fct += " {\n" |
545 fct += " {\n" |
545 fct += " flag_"+element_id+" = false;\n" |
|
546 fct += " SVGUIRotatingCtrl* rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n" |
546 fct += " SVGUIRotatingCtrl* rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n" |
547 fct += " rotating->SetAngle(_copy__QD"+self.BusNumber+"_"+element_id+"_1);\n" |
547 fct += " rotating->SetAngle(_copy__QD"+self.BusNumber+"_"+element_id+"_1);\n" |
548 fct += " flag_"+element_id+" = true;\n" |
|
549 fct += " }\n" |
548 fct += " }\n" |
550 fct += " __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n" |
549 fct += _unlock |
551 elif type == "NoteBook": |
550 elif type == "NoteBook": |
552 fct += " old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n" |
551 fct += _lock |
553 fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n" |
552 fct += " if (copy__QX"+self.BusNumber+"_"+element_id+"_2)\n" |
554 fct += " {\n" |
553 fct += " {\n" |
555 fct += " flag_"+element_id+" = false;\n" |
|
556 fct += " SVGUINoteBook* notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n" |
554 fct += " SVGUINoteBook* notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n" |
557 fct += " notebook->SetCurrentPage(_copy__QB"+self.BusNumber+"_"+element_id+"_1);\n" |
555 fct += " notebook->SetCurrentPage(_copy__QB"+self.BusNumber+"_"+element_id+"_1);\n" |
558 fct += " flag_"+element_id+" = true;\n" |
|
559 fct += " }\n" |
556 fct += " }\n" |
560 fct += " __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n" |
557 fct += _unlock |
561 elif type == "Transform": |
558 elif type == "Transform": |
562 fct += " old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n" |
559 fct += _lock |
563 fct += " if (_copy__QX"+self.BusNumber+"_"+element_id+"_6 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n" |
560 fct += " if (copy__QX"+self.BusNumber+"_"+element_id+"_6)\n" |
564 fct += " {\n" |
561 fct += " {\n" |
565 fct += " flag_"+element_id+" = false;\n" |
|
566 fct += " SVGUITransform* transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n" |
562 fct += " SVGUITransform* transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n" |
567 fct += " transform->Move(_copy__QD"+self.BusNumber+"_"+element_id+"_1,_copy__QD"+self.BusNumber+"_"+element_id+"_2);\n" |
563 fct += " transform->Move(_copy__QD"+self.BusNumber+"_"+element_id+"_1,_copy__QD"+self.BusNumber+"_"+element_id+"_2);\n" |
568 fct += " transform->Scale(_copy__QD"+self.BusNumber+"_"+element_id+"_3,_copy__QD"+self.BusNumber+"_"+element_id+"_4);\n" |
564 fct += " transform->Scale(_copy__QD"+self.BusNumber+"_"+element_id+"_3,_copy__QD"+self.BusNumber+"_"+element_id+"_4);\n" |
569 fct += " transform->Rotate(_copy__QD"+self.BusNumber+"_"+element_id+"_5);\n" |
565 fct += " transform->Rotate(_copy__QD"+self.BusNumber+"_"+element_id+"_5);\n" |
570 fct += " flag_"+element_id+" = true;\n" |
|
571 fct += " }\n" |
566 fct += " }\n" |
572 fct += " __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n" |
567 fct += _unlock |
573 fct += " Update_Elements();\n" |
568 fct += " Update_Elements();\n" |
574 fct += " Refresh();\n" |
569 fct += " Refresh();\n" |
575 fct += " event.Skip();\n" |
570 fct += " event.Skip();\n" |
576 fct += "}\n\n" |
571 fct += "}\n\n" |
577 return fct |
572 return fct |
578 |
573 |
579 def GenerateProgramPrivateFunctions(self): |
574 def GenerateProgramPrivateFunctions(self): |
580 elementsTab = self.GetElementsTab() |
575 elementsTab = self.GetElementsTab() |
581 fct = "void Program::OUT_"+self.BusNumber+"()\n{\n" |
576 fct = "void Program::Retrive()\n{\n" |
582 for element in elementsTab: |
577 for element in elementsTab: |
583 infos = element.getElementAttributes() |
578 infos = element.getElementAttributes() |
584 for info in infos: |
579 for info in infos: |
585 if info["name"] == "id": |
580 if info["name"] == "id": |
586 element_id = str(info["value"]) |
581 element_id = str(info["value"]) |
587 type = element.GetElementInfos()["type"] |
582 type = element.GetElementInfos()["type"] |
588 FbdBlock = self.GetBlockType(type) |
583 FbdBlock = self.GetBlockType(type) |
589 fct += " if ( flag_"+element_id+" && __sync_val_compare_and_swap (&step_"+element_id+", PLC_BUSY, FREE_AND_CHANGES) == PLC_BUSY){\n" |
584 fct += " if ( __sync_val_compare_and_swap (&out_state_"+element_id+", UNCHANGED, PLC_BUSY) == UNCHANGED ||\n" |
590 #fct += " if ( flag_"+element_id+" ){\n" |
585 fct += " __sync_val_compare_and_swap (&out_state_"+element_id+", CHANGED, PLC_BUSY) == CHANGED){\n" |
591 fct += " flag_"+element_id+" = false;\n" |
586 fct += " bool diff = False;\n" |
592 element_num_patte = 1 |
587 element_num_patte = 1 |
593 for input in FbdBlock["inputs"]: |
588 for input in FbdBlock["inputs"]: |
594 element_type = TYPECONVERSION[input[1]] |
589 element_type = TYPECONVERSION[input[1]] |
595 var = "__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte) |
590 var = "__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte) |
|
591 fct +=" diff |= _copy"+var+ " != "+var+";\n" |
596 fct +=" _copy"+var+ " = "+var+";\n" |
592 fct +=" _copy"+var+ " = "+var+";\n" |
597 element_num_patte +=1 |
593 element_num_patte +=1 |
598 fct += " flag_"+element_id+" = true;\n" |
594 fct += " if(diff) out_state_"+element_id+" = CHANGED;\n" |
599 fct += " }\n" |
595 fct += " }\n" |
|
596 fct +=" /*Replace this with determinist signal if called from RT*/;\n" |
600 fct +=" wxCommandEvent event( EVT_PLC );\n" |
597 fct +=" wxCommandEvent event( EVT_PLC );\n" |
601 fct +=" ProcessEvent(event);\n" |
598 fct +=" ProcessEvent(event);\n" |
602 fct +="};\n\n" |
599 fct +="};\n\n" |
603 |
600 |
604 fct += "void Program::IN_"+self.BusNumber+"()\n{\n" |
601 fct += "void Program::Publish()\n{\n" |
605 |
602 |
606 for element in elementsTab: |
603 for element in elementsTab: |
607 infos = element.getElementAttributes() |
604 infos = element.getElementAttributes() |
608 for info in infos: |
605 for info in infos: |
609 if info["name"] == "id": |
606 if info["name"] == "id": |
610 element_id = str(info["value"]) |
607 element_id = str(info["value"]) |
611 type = element.GetElementInfos()["type"] |
608 type = element.GetElementInfos()["type"] |
612 FbdBlock = self.GetBlockType(type) |
609 FbdBlock = self.GetBlockType(type) |
613 fct += " if ( flag_"+element_id+" && __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_NO_CHANGES, PLC_BUSY) == FREE_AND_NO_CHANGES){\n" |
610 fct += " do{\n" |
614 fct += " flag_"+element_id+" = false;\n" |
611 fct += " if ( __sync_val_compare_and_swap (&in_state_"+element_id+", CHANGED, PLC_BUSY) == CHANGED){\n" |
615 element_num_patte = 1 |
612 element_num_patte = 1 |
616 for output in FbdBlock["outputs"]: |
613 for output in FbdBlock["outputs"]: |
617 element_type = TYPECONVERSION[output[1]] |
614 element_type = TYPECONVERSION[output[1]] |
618 var = "__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte) |
615 var = "__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte) |
619 fct +=" "+var+ " = _copy"+var+";\n" |
616 fct +=" "+var+ " = _copy"+var+";\n" |
620 element_num_patte +=1 |
617 element_num_patte +=1 |
621 fct += " flag_"+element_id+" = true;\n" |
618 fct += " /* reset change status pin */\n" |
622 fct += " }\n" |
619 if type == "Button": |
623 fct += " SetNoChanges();\n" |
620 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n" |
|
621 elif type == "Container": |
|
622 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n" |
|
623 elif type == "TextCtrl": |
|
624 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n" |
|
625 elif type == "ScrollBar": |
|
626 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n" |
|
627 elif type == "RotatingCtrl": |
|
628 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n" |
|
629 elif type == "NoteBook": |
|
630 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_2 = false;\n" |
|
631 elif type == "Transform": |
|
632 fct += " _copy__IX"+self.BusNumber+"_"+element_id+"_6 = false;\n" |
|
633 fct += " }else{\n" |
|
634 fct += " break;\n" |
|
635 fct += " }\n" |
|
636 #If GUI did change data while publishing, do it again (in real-time this should be avoided with priority stuff) |
|
637 fct += " }while(__sync_val_compare_and_swap (&in_state_"+element_id+", PLC_BUSY, UNCHANGED) != PLC_BUSY)\n" |
624 fct +="};\n\n" |
638 fct +="};\n\n" |
625 |
639 |
626 fct += "void Program::Initialize()\n{\n" |
640 fct += "void Program::Initialize()\n{\n" |
627 button = False |
641 button = False |
628 container = False |
642 container = False |