Compare commits

...

5 Commits

Author SHA1 Message Date
atvstdla
b707eee6ea .. 2025-10-02 14:38:46 +09:00
atvstdla
9887cc7540 .. 2025-10-02 14:37:39 +09:00
atvstdla
c3889b9f0a UI Design modify
Multi SID Select
2025-10-02 14:28:30 +09:00
atvstdla
dc66158497 Add QRValidation project to repository
- Added QRValidation vision control system
- Includes CapCleaningControl UI components
- WebSocket-based barcode validation system
- Support for Crevis PLC integration
- Test projects for PLC emulator, motion, IO panel, and Modbus

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-02 11:38:38 +09:00
atvstdla
3eac3927f8 QR validation and WMS info processing improvements
- Enhanced QR vision trigger logging with detailed command/data output
- Added JSON data extraction for barcode processing
- Improved WMS info query with data completeness check
- Updated SID information form with trust flags for user inputs
- Added auto-resize columns and UI improvements to SID selection dialog
- Fixed barcode data processing to handle JSON wrapped responses
- Added pick retry reset and timing control on form close

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-02 11:36:48 +09:00
229 changed files with 29523 additions and 323 deletions

View File

@@ -59,11 +59,10 @@ namespace Project
PUB.flag.set(eVarBool.FG_RDY_PORT_PC, false, "SW_START");
PUB.flag.set(eVarBool.FG_RDY_PORT_PR, false, "SW_START");
//얼라인 상태를 모두 초기화 한다
//loader1.arVar_Port.ToList().ForEach(t => t.AlignOK = 0);
VAR.BOOL[eVarBool.FG_WAIT_INFOSELECTCLOSE] = false;
//언로더 체크작업은 항상 다시 시작한다
if (PUB.Result.UnloaderSeq > 1) PUB.Result.UnloaderSeq = 1;
//언로더 체크작업은 항상 다시 시작한다
if (PUB.Result.UnloaderSeq > 1) PUB.Result.UnloaderSeq = 1;
//팝업메세지가 사라지도록 한다
PUB.popup.needClose = true;

View File

@@ -464,9 +464,6 @@ namespace Project
NEED_JOBCANCEL,
LCONVER_REEL_DECTECT_ALL =150,
RCONVER_REEL_DECTECT_ALL,
LCONVER_REEL_DECTECT_IN,
@@ -480,8 +477,6 @@ namespace Project
NOBYPASSSID,
CONFIG_KEYENCE,
PRINTER_LPRINTER_NOUP,
PRINTER_RPRINTER_NOUP,
NOECSDATA,
@@ -494,6 +489,7 @@ namespace Project
INBOUNDWEBAPIERROR,
SIDINFORDUP,
NOECSDATAACTIVE,
NOTSELECTMULTISID,
}
public enum eNextStep : byte

View File

@@ -92,6 +92,8 @@
this.chkInfoApplyCust = new System.Windows.Forms.CheckBox();
this.chkInfoApplyPart = new System.Windows.Forms.CheckBox();
this.grpApplyWMSinfo = new System.Windows.Forms.GroupBox();
this.checkBox2 = new System.Windows.Forms.CheckBox();
this.checkBox1 = new System.Windows.Forms.CheckBox();
this.checkBox36 = new System.Windows.Forms.CheckBox();
this.chkWMSApplyBatch = new System.Windows.Forms.CheckBox();
this.label22 = new System.Windows.Forms.Label();
@@ -110,8 +112,6 @@
this.btCancle = new arCtl.arLabel();
this.dataSet11 = new Project.DataSet1();
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.checkBox1 = new System.Windows.Forms.CheckBox();
this.checkBox2 = new System.Windows.Forms.CheckBox();
this.panel2.SuspendLayout();
this.panel5.SuspendLayout();
this.tabControl1.SuspendLayout();
@@ -992,6 +992,30 @@
this.grpApplyWMSinfo.TabStop = false;
this.grpApplyWMSinfo.Text = "WMS Information Application";
//
// checkBox2
//
this.checkBox2.AutoSize = true;
this.checkBox2.ForeColor = System.Drawing.Color.Black;
this.checkBox2.Location = new System.Drawing.Point(431, 24);
this.checkBox2.Name = "checkBox2";
this.checkBox2.Size = new System.Drawing.Size(92, 23);
this.checkBox2.TabIndex = 39;
this.checkBox2.Tag = "13";
this.checkBox2.Text = "MFG Date";
this.checkBox2.UseVisualStyleBackColor = true;
//
// checkBox1
//
this.checkBox1.AutoSize = true;
this.checkBox1.ForeColor = System.Drawing.Color.Blue;
this.checkBox1.Location = new System.Drawing.Point(379, 50);
this.checkBox1.Name = "checkBox1";
this.checkBox1.Size = new System.Drawing.Size(92, 23);
this.checkBox1.TabIndex = 38;
this.checkBox1.Tag = "12";
this.checkBox1.Text = "MFG Date";
this.checkBox1.UseVisualStyleBackColor = true;
//
// checkBox36
//
this.checkBox36.AutoSize = true;
@@ -1249,30 +1273,6 @@
this.dataSet11.DataSetName = "DataSet1";
this.dataSet11.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
//
// checkBox1
//
this.checkBox1.AutoSize = true;
this.checkBox1.ForeColor = System.Drawing.Color.Blue;
this.checkBox1.Location = new System.Drawing.Point(379, 50);
this.checkBox1.Name = "checkBox1";
this.checkBox1.Size = new System.Drawing.Size(92, 23);
this.checkBox1.TabIndex = 38;
this.checkBox1.Tag = "12";
this.checkBox1.Text = "MFG Date";
this.checkBox1.UseVisualStyleBackColor = true;
//
// checkBox2
//
this.checkBox2.AutoSize = true;
this.checkBox2.ForeColor = System.Drawing.Color.Black;
this.checkBox2.Location = new System.Drawing.Point(431, 24);
this.checkBox2.Name = "checkBox2";
this.checkBox2.Size = new System.Drawing.Size(92, 23);
this.checkBox2.TabIndex = 39;
this.checkBox2.Tag = "13";
this.checkBox2.Text = "MFG Date";
this.checkBox2.UseVisualStyleBackColor = true;
//
// fSelectJob
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 17F);

View File

@@ -50,6 +50,8 @@
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.lbExecuteSQL = new System.Windows.Forms.ToolStripStatusLabel();
this.bn = new System.Windows.Forms.BindingNavigator(this.components);
this.bs = new System.Windows.Forms.BindingSource(this.components);
this.dsWMS = new Project.dsWMS();
this.bindingNavigatorCountItem = new System.Windows.Forms.ToolStripLabel();
this.bindingNavigatorMoveFirstItem = new System.Windows.Forms.ToolStripButton();
this.bindingNavigatorMovePreviousItem = new System.Windows.Forms.ToolStripButton();
@@ -60,13 +62,6 @@
this.bindingNavigatorMoveLastItem = new System.Windows.Forms.ToolStripButton();
this.bindingNavigatorSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.dv1 = new System.Windows.Forms.DataGridView();
this.panDv = new System.Windows.Forms.Panel();
this.btOK = new System.Windows.Forms.Button();
this.panel3 = new System.Windows.Forms.Panel();
this.bs = new System.Windows.Forms.BindingSource(this.components);
this.dsWMS = new Project.dsWMS();
this.ta = new Project.dsWMSTableAdapters.VW_GET_MAX_QTY_VENDOR_LOTTableAdapter();
this.tam = new Project.dsWMSTableAdapters.TableAdapterManager();
this.idxDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.sIDDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewButtonColumn();
this.pARTNODataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
@@ -76,14 +71,19 @@
this.vENDORLOTDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.mFGDATEDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.qTYDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.panDv = new System.Windows.Forms.Panel();
this.btOK = new System.Windows.Forms.Button();
this.panel3 = new System.Windows.Forms.Panel();
this.ta = new Project.dsWMSTableAdapters.VW_GET_MAX_QTY_VENDOR_LOTTableAdapter();
this.tam = new Project.dsWMSTableAdapters.TableAdapterManager();
this.statusStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.bn)).BeginInit();
this.bn.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.bs)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dsWMS)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dv1)).BeginInit();
this.panDv.SuspendLayout();
this.panel3.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.bs)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dsWMS)).BeginInit();
this.SuspendLayout();
//
// tbSID
@@ -314,10 +314,20 @@
this.bn.TabIndex = 12;
this.bn.Text = "bindingNavigator1";
//
// bs
//
this.bs.DataMember = "VW_GET_MAX_QTY_VENDOR_LOT";
this.bs.DataSource = this.dsWMS;
//
// dsWMS
//
this.dsWMS.DataSetName = "dsWMS";
this.dsWMS.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
//
// bindingNavigatorCountItem
//
this.bindingNavigatorCountItem.Name = "bindingNavigatorCountItem";
this.bindingNavigatorCountItem.Size = new System.Drawing.Size(27, 22);
this.bindingNavigatorCountItem.Size = new System.Drawing.Size(26, 22);
this.bindingNavigatorCountItem.Text = "/{0}";
this.bindingNavigatorCountItem.ToolTipText = "Total item count";
//
@@ -387,6 +397,7 @@
this.dv1.AllowUserToAddRows = false;
this.dv1.AllowUserToDeleteRows = false;
this.dv1.AutoGenerateColumns = false;
this.dv1.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
this.dv1.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.dv1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dv1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
@@ -402,8 +413,9 @@
this.dv1.DataSource = this.bs;
dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Window;
dataGridViewCellStyle1.Font = new System.Drawing.Font("맑은 고딕", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
dataGridViewCellStyle1.Font = new System.Drawing.Font("맑은 고딕", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.ControlText;
dataGridViewCellStyle1.Padding = new System.Windows.Forms.Padding(0, 3, 0, 3);
dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
@@ -417,75 +429,6 @@
this.dv1.TabIndex = 35;
this.dv1.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.vW_GET_MAX_QTY_VENDOR_LOTDataGridView_CellClick);
//
// panDv
//
this.panDv.Controls.Add(this.dv1);
this.panDv.Controls.Add(this.bn);
this.panDv.Dock = System.Windows.Forms.DockStyle.Fill;
this.panDv.Location = new System.Drawing.Point(0, 157);
this.panDv.Name = "panDv";
this.panDv.Size = new System.Drawing.Size(1031, 405);
this.panDv.TabIndex = 36;
//
// btOK
//
this.btOK.BackColor = System.Drawing.Color.DarkSeaGreen;
this.btOK.Dock = System.Windows.Forms.DockStyle.Right;
this.btOK.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
this.btOK.Location = new System.Drawing.Point(791, 10);
this.btOK.Name = "btOK";
this.btOK.Size = new System.Drawing.Size(230, 137);
this.btOK.TabIndex = 4;
this.btOK.Text = "SAVE";
this.btOK.UseVisualStyleBackColor = false;
this.btOK.Click += new System.EventHandler(this.btOK_Click);
//
// panel3
//
this.panel3.Controls.Add(this.btOK);
this.panel3.Controls.Add(this.button5);
this.panel3.Controls.Add(this.button4);
this.panel3.Controls.Add(this.linkLabel7);
this.panel3.Controls.Add(this.tbVName);
this.panel3.Controls.Add(this.linkLabel5);
this.panel3.Controls.Add(this.linkLabel6);
this.panel3.Controls.Add(this.tbSID);
this.panel3.Controls.Add(this.linkLabel8);
this.panel3.Controls.Add(this.TbCustCode);
this.panel3.Controls.Add(this.tbBatch);
this.panel3.Controls.Add(this.linkLabel3);
this.panel3.Controls.Add(this.tbLot);
this.panel3.Controls.Add(this.lnkBatch);
this.panel3.Controls.Add(this.tbPart);
this.panel3.Controls.Add(this.tbMFG);
this.panel3.Controls.Add(this.linkLabel2);
this.panel3.Dock = System.Windows.Forms.DockStyle.Top;
this.panel3.Location = new System.Drawing.Point(0, 0);
this.panel3.Name = "panel3";
this.panel3.Padding = new System.Windows.Forms.Padding(0, 10, 10, 10);
this.panel3.Size = new System.Drawing.Size(1031, 157);
this.panel3.TabIndex = 37;
//
// bs
//
this.bs.DataMember = "VW_GET_MAX_QTY_VENDOR_LOT";
this.bs.DataSource = this.dsWMS;
//
// dsWMS
//
this.dsWMS.DataSetName = "dsWMS";
this.dsWMS.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
//
// ta
//
this.ta.ClearBeforeFill = true;
//
// tam
//
this.tam.BackupDataSetBeforeUpdate = false;
this.tam.Connection = null;
this.tam.UpdateOrder = Project.dsWMSTableAdapters.TableAdapterManager.UpdateOrderOption.InsertUpdateDelete;
//
// idxDataGridViewTextBoxColumn
//
this.idxDataGridViewTextBoxColumn.DataPropertyName = "idx";
@@ -551,6 +494,65 @@
this.qTYDataGridViewTextBoxColumn.Name = "qTYDataGridViewTextBoxColumn";
this.qTYDataGridViewTextBoxColumn.ReadOnly = true;
//
// panDv
//
this.panDv.Controls.Add(this.dv1);
this.panDv.Controls.Add(this.bn);
this.panDv.Dock = System.Windows.Forms.DockStyle.Fill;
this.panDv.Location = new System.Drawing.Point(0, 157);
this.panDv.Name = "panDv";
this.panDv.Size = new System.Drawing.Size(1031, 405);
this.panDv.TabIndex = 36;
//
// btOK
//
this.btOK.BackColor = System.Drawing.Color.DarkSeaGreen;
this.btOK.Dock = System.Windows.Forms.DockStyle.Right;
this.btOK.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
this.btOK.Location = new System.Drawing.Point(791, 10);
this.btOK.Name = "btOK";
this.btOK.Size = new System.Drawing.Size(230, 137);
this.btOK.TabIndex = 4;
this.btOK.Text = "SAVE";
this.btOK.UseVisualStyleBackColor = false;
this.btOK.Click += new System.EventHandler(this.btOK_Click);
//
// panel3
//
this.panel3.Controls.Add(this.btOK);
this.panel3.Controls.Add(this.button5);
this.panel3.Controls.Add(this.button4);
this.panel3.Controls.Add(this.linkLabel7);
this.panel3.Controls.Add(this.tbVName);
this.panel3.Controls.Add(this.linkLabel5);
this.panel3.Controls.Add(this.linkLabel6);
this.panel3.Controls.Add(this.tbSID);
this.panel3.Controls.Add(this.linkLabel8);
this.panel3.Controls.Add(this.TbCustCode);
this.panel3.Controls.Add(this.tbBatch);
this.panel3.Controls.Add(this.linkLabel3);
this.panel3.Controls.Add(this.tbLot);
this.panel3.Controls.Add(this.lnkBatch);
this.panel3.Controls.Add(this.tbPart);
this.panel3.Controls.Add(this.tbMFG);
this.panel3.Controls.Add(this.linkLabel2);
this.panel3.Dock = System.Windows.Forms.DockStyle.Top;
this.panel3.Location = new System.Drawing.Point(0, 0);
this.panel3.Name = "panel3";
this.panel3.Padding = new System.Windows.Forms.Padding(0, 10, 10, 10);
this.panel3.Size = new System.Drawing.Size(1031, 157);
this.panel3.TabIndex = 37;
//
// ta
//
this.ta.ClearBeforeFill = true;
//
// tam
//
this.tam.BackupDataSetBeforeUpdate = false;
this.tam.Connection = null;
this.tam.UpdateOrder = Project.dsWMSTableAdapters.TableAdapterManager.UpdateOrderOption.InsertUpdateDelete;
//
// fSelectSIDInformation
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
@@ -565,18 +567,19 @@
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Multi SID Information";
this.Load += new System.EventHandler(this.fLoaderInfo_Load);
this.Shown += new System.EventHandler(this.fSelectSIDInformation_Shown);
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.bn)).EndInit();
this.bn.ResumeLayout(false);
this.bn.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.bs)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dsWMS)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dv1)).EndInit();
this.panDv.ResumeLayout(false);
this.panDv.PerformLayout();
this.panel3.ResumeLayout(false);
this.panel3.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.bs)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dsWMS)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();

View File

@@ -34,6 +34,10 @@ namespace Project.Dialog
private void FLoaderInfo_FormClosed(object sender, FormClosedEventArgs e)
{
AR.VAR.I32[AR.eVarInt32.PickOnRetry] = 0;
VAR.TIME[eVarTime.KEYENCEWAIT] = DateTime.Now;
VAR.BOOL[eVarBool.FG_WAIT_INFOSELECTCLOSE] = true;
VAR.BOOL[eVarBool.FG_WAIT_INFOSELECT] = false;
PUB.Result.ItemDataC.VisionData.PropertyChanged -= VisionData_PropertyChanged;
@@ -115,7 +119,6 @@ namespace Project.Dialog
TbCustCode.Text = item.VisionData.CUSTCODE;
tbBatch.Text = item.VisionData.BATCH;
selectInput(this.tbSID);
if (tbVName.Text.isEmpty())
@@ -369,12 +372,36 @@ namespace Project.Dialog
itemC.VisionData.SID0 = itemC.VisionData.SID;
//값이있는것들만 기록해준다.
if (tbSID.Text.isEmpty() == false) itemC.VisionData.SID = tbSID.Text.Trim();
if (tbBatch.Text.isEmpty() == false) itemC.VisionData.BATCH = tbBatch.Text.Trim();
if (tbLot.Text.isEmpty() == false) itemC.VisionData.VLOT = tbLot.Text.Trim();
if (tbMFG.Text.isEmpty() == false) itemC.VisionData.MFGDATE = tbMFG.Text.Trim();
if (tbVName.Text.isEmpty() == false) itemC.VisionData.VNAME = tbVName.Text.Trim();
if (tbPart.Text.isEmpty() == false) itemC.VisionData.PARTNO = tbPart.Text.Trim();
if (tbSID.Text.isEmpty() == false)
{
itemC.VisionData.SID = tbSID.Text.Trim();
itemC.VisionData.SID_Trust = true;
}
if (tbBatch.Text.isEmpty() == false)
{
itemC.VisionData.BATCH = tbBatch.Text.Trim();
}
if (tbLot.Text.isEmpty() == false)
{
itemC.VisionData.VLOT = tbLot.Text.Trim();
itemC.VisionData.VLOT_Trust = true;
}
if (tbMFG.Text.isEmpty() == false)
{
itemC.VisionData.MFGDATE = tbMFG.Text.Trim();
itemC.VisionData.MFGDATE_Trust = true;
}
if (tbVName.Text.isEmpty() == false)
{
itemC.VisionData.VNAME = tbVName.Text.Trim();
itemC.VisionData.VNAME_Trust = true;
}
if (tbPart.Text.isEmpty() == false)
{
itemC.VisionData.PARTNO = tbPart.Text.Trim();
itemC.VisionData.PARTNO_Trust = true;
}
this.TopMost = topmost;
this.Close();
@@ -883,5 +910,10 @@ namespace Project.Dialog
ValueUpdate(tbMFG, dr.MFG_DATE, "MFG_DATE");
ValueUpdate(tbBatch, dr.BATCH_NO, "BATCH_NO");
}
private void fSelectSIDInformation_Shown(object sender, EventArgs e)
{
this.dv1.AutoResizeColumns();
}
}
}

View File

@@ -257,6 +257,7 @@ namespace Project
}
//키엔스데이터 기다리는중
VAR.BOOL[eVarBool.FG_WAIT_INFOSELECTCLOSE] = false;
PUB.sm.seq.Update(cmdIndex);
return false;
}
@@ -305,20 +306,31 @@ namespace Project
//아무것도 하지 않는다
//사용자가 정보를 설정하는 중
}
else
{
bool SHowUserFormINF = true;
else {
//사용자 확인창을 표시한다
if (SHowUserFormINF) //다중SID정보 선택건
//사용자사 해당 창을 닫았다.
if (VAR.BOOL[eVarBool.FG_WAIT_INFOSELECTCLOSE] == true & PUB.Result.ItemDataC.VisionData.SID.isEmpty())
{
this.Invoke(new Action(() =>
{
PUB.log.Add("Calling user selection window (INF)");
var f = new Dialog.fSelectSIDInformation();
f.Show();
}));
//사용자가 창을 닫았고 SID값이 없다면 오류 처리한다.
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.NOTSELECTMULTISID, eNextStep.PAUSE);
VAR.BOOL[eVarBool.FG_WAIT_INFOSELECTCLOSE] = false;
}
else
{
bool SHowUserFormINF = true;
//사용자 확인창을 표시한다
if (SHowUserFormINF) //다중SID정보 선택건
{
this.Invoke(new Action(() =>
{
PUB.log.Add("Calling user selection window (INF)");
var f = new Dialog.fSelectSIDInformation();
f.Show();
}));
}
}
}
return false;
}

View File

@@ -50,7 +50,7 @@ namespace Project
{
//카메라 트리거 전송
var sendok = WS_Send(target, WS, item.guid, "TRIG", item.VisionData.PrintQRData);
PUB.log.Add($"Barcode trigger transmission ({target}) = {sendok}");
PUB.log.Add($"Send QR Vision trigger ({target}) = {sendok} CMD=TRIG,DATA={item.VisionData.PrintQRData}");
if(sendok==false) //230512 전송실패시 오류로 한다
{
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.VISION_TRIGERROR, eNextStep.PAUSE);

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text.RegularExpressions;
using Newtonsoft.Json.Linq;
namespace Project
{
@@ -23,8 +24,24 @@ namespace Project
foreach (var datas in qrdatas)
{
// JSON 구조에서 "data" 필드 추출
string barcodeData = datas;
try
{
var jobj = JObject.Parse(datas);
if (jobj["data"] != null)
{
barcodeData = jobj["data"].ToString();
}
}
catch
{
// JSON 파싱 실패 시 원본 데이터 사용
barcodeData = datas;
}
//원본자료를 체크한다
if (datas.Equals(idata.VisionData.PrintQRData))
if (barcodeData.Equals(idata.VisionData.PrintQRData))
{
//인쇄한 자료와 동일한 자료이다
FindData = true;
@@ -39,10 +56,10 @@ namespace Project
foreach (var pt in pats)
{
var regx = new Regex(pt.Pattern, RegexOptions.IgnoreCase, new TimeSpan(0, 0, 10));
if (regx.IsMatch(datas)) //패턴이 일치하다면 이것만 사용한다
if (regx.IsMatch(barcodeData)) //패턴이 일치하다면 이것만 사용한다
{
//find data
var matchs = regx.Matches(datas);
var matchs = regx.Matches(barcodeData);
foreach (System.Text.RegularExpressions.Match mat in matchs)
{
foreach (var matchdata in pt.Groups)
@@ -81,30 +98,6 @@ namespace Project
}
}
}
//var bcdData = new StdLabelPrint.CAmkorSTDBarcode(datas);
//PUB.Result.ItemData[vIdx].VisionData.QTY2 = bcdData.QTY.ToString();
//PUB.Result.ItemData[vIdx].VisionData.RID2 = bcdData.RID;
//PUB.Result.ItemData[vIdx].VisionData.SID2 = bcdData.SID;
//PUB.Result.ItemData[vIdx].VisionData.VLOT2 = bcdData.VLOT;
//PUB.Result.ItemData[vIdx].VisionData.VNAME2 = bcdData.VENDERNAME;
//PUB.Result.ItemData[vIdx].VisionData.MFGDATE2 = bcdData.MFGDate;//.ToString("yyyyMMdd");
//PUB.Result.ItemData[vIdx].VisionData.PARTNO2 = bcdData.PARTNO;
//PUB.Result.ItemData[vIdx].VisionData.Ready = true;
////Pub.Result.ItemData[vIdx].VisionData.ETime = DateTime.Now;
////Pub.Result.ItemData[vIdx].VisionData.Angle = 5;
//PUB.Result.ItemData[vIdx].VisionData.Complete = true;
//PUB.log.Add("BARCODE", $"{vIdx}바코드 읽기 성공 ID:{bcdData.RID},QTY:{bcdData.QTY}");
////데이터를 읽었으며, 검증기능이 켜져있다면 검증을한다
//if (FindData) break;
}
}

View File

@@ -43,7 +43,7 @@ namespace Project
//[WMS] SID정보테이블에서 정보 추출(프린트정보는 없음)
//[WMS] 에서 중복검색되면 팝업을 해야하므로 이것을 먼저 처리한다.
if (VAR.BOOL[eVarBool.Opt_ApplyWMSInfo] && (CompleteCheck || itemC.VisionData.BarcodeTouched == true))
if (VAR.BOOL[eVarBool.Opt_ApplyWMSInfo] && (CompleteCheck || itemC.VisionData.BarcodeTouched == true))
{
var rlt_FindWMD = BCDProcess_FindWMSInfo(itemC);
if (rlt_FindWMD.NewBarcodeUpdated) NewBarcodeUpdated = true;
@@ -316,8 +316,25 @@ namespace Project
if (vdata.MFGDATE_Trust && vdata.MFGDATE.isEmpty() == false) wheres.Add($"MFG_DATE = '{vdata.MFGDATE}'");
else Apply = false;
}
//데이터가 완성되었다면 처리하지 않는다.
bool DataOK = true;
foreach (var data in fields)
{
var column = data.ToLower();
if (DataOK && column.Equals("sid") && (vdata.SID.isEmpty() || vdata.SID_Trust == false)) DataOK = false;
else if (DataOK && column.Equals("part_no") && (vdata.PARTNO.isEmpty() || vdata.PARTNO_Trust)) DataOK = false;
else if (DataOK && column.Equals("mfg_data") && (vdata.MFGDATE.isEmpty() || vdata.MFGDATE_Trust)) DataOK = false;
else if (DataOK && column.Equals("vendor_nm") && (vdata.VNAME.isEmpty() || vdata.VNAME_Trust)) DataOK = false;
else if (DataOK && column.Equals("batch_no") && (vdata.BATCH.isEmpty())) DataOK = false;
else if (DataOK && column.Equals("qty") && (vdata.QTY.isEmpty() || vdata.QTY_Trust)) DataOK = false;
else if (DataOK && column.Equals("cust_code") && (vdata.CUSTCODE.isEmpty())) DataOK = false;
else if (DataOK && column.Equals("vendor_lot") && (vdata.VLOT.isEmpty() || vdata.VLOT_Trust)) DataOK = false;
if (DataOK == false) break;
}
//if query data . no error
if (Apply && fields.Count > 0 && wheres.Count > 0)
if (DataOK == false && Apply && fields.Count > 0 && wheres.Count > 0)
{
var TableName = "VW_GET_MAX_QTY_VENDOR_LOT";
var whereState = " where " + string.Join(" and ", wheres);
@@ -330,7 +347,7 @@ namespace Project
var cntvalue = (DBHelper.ExecuteScalar(SQLC)?.ToString() ?? "0").toInt();
if (cntvalue > 1)
{
VAR.STR[eVarString.MULTISID_QUERY] = $"select {selectFields} from {TableName} WITH(NOLOCK) {whereState}";
VAR.STR[eVarString.MULTISID_QUERY] = $"select * from {TableName} WITH(NOLOCK) {whereState}";
VAR.STR[eVarString.MULTISID_FIELDS] = selectFields;
rlt = EResultKeyence.MultiSID;
}

View File

@@ -1867,35 +1867,35 @@
// axis0ToolStripMenuItem
//
this.axis0ToolStripMenuItem.Name = "axis0ToolStripMenuItem";
this.axis0ToolStripMenuItem.Size = new System.Drawing.Size(116, 22);
this.axis0ToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.axis0ToolStripMenuItem.Text = "Axis 0";
this.axis0ToolStripMenuItem.Click += new System.EventHandler(this.axis0ToolStripMenuItem_Click);
//
// axis1ToolStripMenuItem
//
this.axis1ToolStripMenuItem.Name = "axis1ToolStripMenuItem";
this.axis1ToolStripMenuItem.Size = new System.Drawing.Size(116, 22);
this.axis1ToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.axis1ToolStripMenuItem.Text = "Axis 1";
this.axis1ToolStripMenuItem.Click += new System.EventHandler(this.axis1ToolStripMenuItem_Click);
//
// axis2ToolStripMenuItem
//
this.axis2ToolStripMenuItem.Name = "axis2ToolStripMenuItem";
this.axis2ToolStripMenuItem.Size = new System.Drawing.Size(116, 22);
this.axis2ToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.axis2ToolStripMenuItem.Text = "Axis 2";
this.axis2ToolStripMenuItem.Click += new System.EventHandler(this.axis2ToolStripMenuItem_Click);
//
// axis3ToolStripMenuItem
//
this.axis3ToolStripMenuItem.Name = "axis3ToolStripMenuItem";
this.axis3ToolStripMenuItem.Size = new System.Drawing.Size(116, 22);
this.axis3ToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.axis3ToolStripMenuItem.Text = "Axis 3";
this.axis3ToolStripMenuItem.Click += new System.EventHandler(this.axis3ToolStripMenuItem_Click);
//
// axis4ToolStripMenuItem
//
this.axis4ToolStripMenuItem.Name = "axis4ToolStripMenuItem";
this.axis4ToolStripMenuItem.Size = new System.Drawing.Size(116, 22);
this.axis4ToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.axis4ToolStripMenuItem.Text = "Axis 4";
this.axis4ToolStripMenuItem.Click += new System.EventHandler(this.axis4ToolStripMenuItem_Click);
//
@@ -3910,7 +3910,7 @@
this.hmi1.R_PICK_BW = false;
this.hmi1.R_PICK_FW = false;
this.hmi1.Scean = UIControl.HMI.eScean.Nomal;
this.hmi1.Size = new System.Drawing.Size(786, 403);
this.hmi1.Size = new System.Drawing.Size(546, 403);
this.hmi1.TabIndex = 0;
this.hmi1.ZoneItemClick += new System.EventHandler<UIControl.HMI.ZoneItemClickEventargs>(this.hmi1_ZoneItemClick);
//
@@ -3969,7 +3969,7 @@
column2.State = System.Windows.Forms.DataGridViewElementStates.None;
column2.Style = null;
column2.Text = "";
column2.Width = 50;
column2.Width = 80;
column3.DataGridViewInternal = null;
column3.DisplayIndex = 0;
column3.IndexInternal = 0;
@@ -3978,7 +3978,7 @@
column3.State = System.Windows.Forms.DataGridViewElementStates.None;
column3.Style = null;
column3.Text = "";
column3.Width = 100;
column3.Width = 150;
column4.DataGridViewInternal = null;
column4.DisplayIndex = 0;
column4.IndexInternal = 0;
@@ -3987,7 +3987,7 @@
column4.State = System.Windows.Forms.DataGridViewElementStates.None;
column4.Style = null;
column4.Text = "";
column4.Width = 50;
column4.Width = 80;
column5.DataGridViewInternal = null;
column5.DisplayIndex = 0;
column5.IndexInternal = 0;
@@ -3996,7 +3996,7 @@
column5.State = System.Windows.Forms.DataGridViewElementStates.None;
column5.Style = null;
column5.Text = "";
column5.Width = 100;
column5.Width = 150;
column6.DataGridViewInternal = null;
column6.DisplayIndex = 0;
column6.IndexInternal = 0;
@@ -4005,7 +4005,7 @@
column6.State = System.Windows.Forms.DataGridViewElementStates.None;
column6.Style = null;
column6.Text = "";
column6.Width = 50;
column6.Width = 80;
column7.DataGridViewInternal = null;
column7.DisplayIndex = 0;
column7.IndexInternal = 0;
@@ -4014,7 +4014,7 @@
column7.State = System.Windows.Forms.DataGridViewElementStates.None;
column7.Style = null;
column7.Text = "";
column7.Width = 100;
column7.Width = 150;
this.listView21.Columns = new arCtl.ListView2.Column[] {
column2,
column3,
@@ -4030,7 +4030,7 @@
this.listView21.Dock = System.Windows.Forms.DockStyle.Right;
this.listView21.Font = new System.Drawing.Font("Consolas", 8F, System.Drawing.FontStyle.Bold);
this.listView21.ForeColor = System.Drawing.Color.White;
this.listView21.Location = new System.Drawing.Point(786, 0);
this.listView21.Location = new System.Drawing.Point(546, 0);
this.listView21.MinimumSize = new System.Drawing.Size(30, 30);
this.listView21.Name = "listView21";
this.listView21.RowHeight = 25;
@@ -5160,7 +5160,7 @@
itemStyle2.Font = new System.Drawing.Font("Consolas", 8F, System.Drawing.FontStyle.Bold);
itemStyle2.ForeColor = System.Drawing.Color.Black;
this.listView21.RowStyle = itemStyle2;
this.listView21.Size = new System.Drawing.Size(451, 403);
this.listView21.Size = new System.Drawing.Size(691, 403);
this.listView21.TabIndex = 7;
this.listView21.Text = "listView21";
//

View File

@@ -2222,7 +2222,7 @@ namespace Project
//If multiple information exists, it should be handled with selection screen
VAR.STR[eVarString.MULTISID_QUERY] = $"select {selectFields} from {TableName} WITH(NOLOCK) {whereState}";
VAR.STR[eVarString.MULTISID_QUERY] = $"select * from {TableName} WITH(NOLOCK) {whereState}";
VAR.STR[eVarString.MULTISID_FIELDS] = selectFields;
PUB.Result.ItemDataC.VisionData.CUSTCODE = VAR.STR[eVarString.JOB_CUSTOMER_CODE];

View File

@@ -473,16 +473,16 @@ If pressed while motion is moving, motion will also stop.
<data name="btManualPrint.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIUSURBVGhD7ZPBShtRFIanL1DfIZDu1L5B7U4tQty1uxYK
FUGxIDKokBIptinFSrGaCmamEcaMlmhEX0B9gUrbTbtoU9Jtu80ip7n4h5nMnAuFzCQHnA++3Zz7f1nE
SEhIuEZM/m7ey9QbvzJ1ojicqDdqmXpzDHPRczXAj0dn4yfmoocfjF7MRQ83FoeYix5uLA4xFxHzny+M
ha+k5MbisL1nzH85Q0UXtB/rxw9Qdo3vMW4sDv2bqOgC32PcWBz6N1HRBb7HuLE49G+i4v+ZNXPjU2au
NmPmSJJXTSujyNQjMb7ttJn7gUw93KEkkamHO5IkMvVwR5JEph7uSJLI1MMdSRKZeoIH9x8+ocGhYUqn
0z1VbT54NNXRokSmnuBBP+LbDg7f7mhRIlNP8IB7uJcGe5CpJ3jAPdpLgz3I1PN41iS/qVSqrwZ7kBnG
dk5uWeXqRUuy3WORou1ctSLbQ8UHDwR7jmyP9+7Hv8yHQq3+QbZH0T285D8WqFP9hGwPa+/4A/uxRMtH
NrI9Wv+Bp+zHMp1DtkfRqYxY5aPWP12+drl6B9kepdLpzfzb7eaOUyHJqsaC6w4gu5OCvfd9e/eARFva
/4bcMBs7zsG7okPC3UdumLVCcelNwSLRblmLyA3zcn3j7ov1TZLs6trmCHLDENGN5eevDrPZbPPZ6muS
pGpaXMlXVCNyExISEhKuPYbxDwvXtwz5x5voAAAAAElFTkSuQmCC
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIUSURBVGhD7ZPNShthFIanN1DvIZDu/LmD2l1VhLirOwuF
SqFiQWRQISVSrC3FWrA2FsxMI4wZlWhEb0C9gYp20y5aS7qt2yxymg/fMJOZ80EhM8kB54FnN+d7nyxi
JCQk3CLG/tRHMtXa70yVKA5Hq7WrTLU+hLnouRngx6Oz9gtz0cMPRi/moocbi0PMRQ83FoeYi4iZizNj
9hspubE4bO4ZM5cnqGiD5mPd+AHKtvE9xo3FoX8TFW3ge4wbi0P/JirawPcYNxaH/k1U/D9TZm540sxd
PTdzJMmbpsWHyNQjMb7pMzP3E5l6uENJIlMPdyRJZOrhjiSJTD3ckSSRqYc7kiQy9QQPHk08pd6+fkqn
0x1VbY4/nmxpUSJTT/CgG/FNe/sHWlqUyNQTPOAe7qTBHmTqCR5wj3bSYA8y9TyZMslvKpXqqsEeZIax
naN7Vqly1pBs91CkaDtVrcj2UPHBA8GeIttjw927Zj4UauUvsj0K7v45/7FAncpXZHtY24df2I8lWjqw
ke3R+A+8YD+W6TSyPQpOedAqHTT+6fK1S5X7yPYoFo/vLn/YqG86ZZKsasy7bg+yW8nb2z8+b+2SaIs7
35EbZm3T2f1YcEi4O8gNs5IvzL/PWyTaT9YccsMsr649eL26TpJdWlkfRG4YIrqz8Ortfjabrb9cekeS
VE1zi2/KqhG5CQkJCQm3HsP4B860twaYbLRsAAAAAElFTkSuQmCC
</value>
</data>
<data name="btJobCancle.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@@ -571,7 +571,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACWQgAAd0MAAAlD
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABQQgAAhEMAAL5C
AADIQgs=
</value>
</data>
@@ -579,7 +579,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACiQwAAd0MAAAlD
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABhQwAAhEMAAL5C
AADIQgs=
</value>
</data>
@@ -587,7 +587,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAEAPRAAAd0MAAAlD
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAADHQwAAhEMAAL5C
AADIQgs=
</value>
</data>
@@ -595,7 +595,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAAAAAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAAAAAAKBC
AAAAAAs=
</value>
</data>
@@ -603,7 +603,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQgAAAAAAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACgQgAAAAAAABZD
AAAAAAs=
</value>
</data>
@@ -611,7 +611,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAWQwAAAAAAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABmQwAAAAAAAKBC
AAAAAAs=
</value>
</data>
@@ -619,7 +619,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQwAAAAAAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACbQwAAAAAAABZD
AAAAAAs=
</value>
</data>
@@ -627,7 +627,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACWQwAAAAAAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAADmQwAAAAAAAKBC
AAAAAAs=
</value>
</data>
@@ -635,7 +635,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACvQwAAAAAAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAHRAAAAAAAABZD
AAAAAAs=
</value>
</data>
@@ -643,7 +643,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAAAAAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAAAAAAKBC
AADIQQs=
</value>
</data>
@@ -651,7 +651,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQgAAAAAAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACgQgAAAAAAABZD
AADIQQs=
</value>
</data>
@@ -659,7 +659,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAWQwAAAAAAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABmQwAAAAAAAKBC
AADIQQs=
</value>
</data>
@@ -667,7 +667,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQwAAAAAAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACbQwAAAAAAABZD
AADIQQs=
</value>
</data>
@@ -675,7 +675,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACWQwAAAAAAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAADmQwAAAAAAAKBC
AADIQQs=
</value>
</data>
@@ -683,7 +683,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACvQwAAAAAAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAHRAAAAAAAABZD
AADIQQs=
</value>
</data>
@@ -691,7 +691,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAAAAAgOFD
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAAAAAwCxE
AADIQQs=
</value>
</data>
@@ -699,7 +699,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAyEEAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAyEEAAKBC
AADIQQs=
</value>
</data>
@@ -707,7 +707,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQgAAyEEAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACgQgAAyEEAABZD
AADIQQs=
</value>
</data>
@@ -715,7 +715,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAWQwAAyEEAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABmQwAAyEEAAKBC
AADIQQs=
</value>
</data>
@@ -723,7 +723,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQwAAyEEAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACbQwAAyEEAABZD
AADIQQs=
</value>
</data>
@@ -731,7 +731,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACWQwAAyEEAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAADmQwAAyEEAAKBC
AADIQQs=
</value>
</data>
@@ -739,7 +739,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACvQwAAyEEAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAHRAAAyEEAABZD
AADIQQs=
</value>
</data>
@@ -747,7 +747,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAyEEAgOFD
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAyEEAwCxE
AADIQQs=
</value>
</data>
@@ -755,7 +755,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAASEIAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAASEIAAKBC
AADIQQs=
</value>
</data>
@@ -763,7 +763,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQgAASEIAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACgQgAASEIAABZD
AADIQQs=
</value>
</data>
@@ -771,7 +771,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAWQwAASEIAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABmQwAASEIAAKBC
AADIQQs=
</value>
</data>
@@ -779,7 +779,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQwAASEIAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACbQwAASEIAABZD
AADIQQs=
</value>
</data>
@@ -787,7 +787,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACWQwAASEIAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAADmQwAASEIAAKBC
AADIQQs=
</value>
</data>
@@ -795,7 +795,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACvQwAASEIAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAHRAAASEIAABZD
AADIQQs=
</value>
</data>
@@ -803,7 +803,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAASEIAgOFD
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAASEIAwCxE
AADIQQs=
</value>
</data>
@@ -811,7 +811,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAlkIAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAlkIAAKBC
AADIQQs=
</value>
</data>
@@ -819,7 +819,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQgAAlkIAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACgQgAAlkIAABZD
AADIQQs=
</value>
</data>
@@ -827,7 +827,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAWQwAAlkIAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABmQwAAlkIAAKBC
AADIQQs=
</value>
</data>
@@ -835,7 +835,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQwAAlkIAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACbQwAAlkIAABZD
AADIQQs=
</value>
</data>
@@ -843,7 +843,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACWQwAAlkIAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAADmQwAAlkIAAKBC
AADIQQs=
</value>
</data>
@@ -851,7 +851,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACvQwAAlkIAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAHRAAAlkIAABZD
AADIQQs=
</value>
</data>
@@ -859,7 +859,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAlkIAgOFD
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAlkIAwCxE
AADIQQs=
</value>
</data>
@@ -867,7 +867,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAyEIAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAyEIAAKBC
AADIQQs=
</value>
</data>
@@ -875,7 +875,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQgAAyEIAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACgQgAAyEIAABZD
AADIQQs=
</value>
</data>
@@ -883,7 +883,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAWQwAAyEIAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABmQwAAyEIAAKBC
AADIQQs=
</value>
</data>
@@ -891,7 +891,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQwAAyEIAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACbQwAAyEIAABZD
AADIQQs=
</value>
</data>
@@ -899,7 +899,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACWQwAAyEIAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAADmQwAAyEIAAKBC
AADIQQs=
</value>
</data>
@@ -907,7 +907,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACvQwAAyEIAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAHRAAAyEIAABZD
AADIQQs=
</value>
</data>
@@ -915,7 +915,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAyEIAgOFD
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAyEIAwCxE
AADIQQs=
</value>
</data>
@@ -923,7 +923,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAA+kIAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAA+kIAAKBC
AADIQQs=
</value>
</data>
@@ -931,7 +931,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQgAA+kIAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACgQgAA+kIAABZD
AADIQQs=
</value>
</data>
@@ -939,7 +939,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAWQwAA+kIAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABmQwAA+kIAAKBC
AADIQQs=
</value>
</data>
@@ -947,7 +947,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQwAA+kIAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACbQwAA+kIAABZD
AADIQQs=
</value>
</data>
@@ -955,7 +955,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACWQwAA+kIAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAADmQwAA+kIAAKBC
AADIQQs=
</value>
</data>
@@ -963,7 +963,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACvQwAA+kIAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAHRAAA+kIAABZD
AADIQQs=
</value>
</data>
@@ -971,7 +971,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAA+kIAgOFD
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAA+kIAwCxE
AADIQQs=
</value>
</data>
@@ -979,7 +979,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAFkMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAFkMAAKBC
AADIQQs=
</value>
</data>
@@ -987,7 +987,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQgAAFkMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACgQgAAFkMAABZD
AADIQQs=
</value>
</data>
@@ -995,7 +995,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAWQwAAFkMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABmQwAAFkMAAKBC
AADIQQs=
</value>
</data>
@@ -1003,7 +1003,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQwAAFkMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACbQwAAFkMAABZD
AADIQQs=
</value>
</data>
@@ -1011,7 +1011,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACWQwAAFkMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAADmQwAAFkMAAKBC
AADIQQs=
</value>
</data>
@@ -1019,7 +1019,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACvQwAAFkMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAHRAAAFkMAABZD
AADIQQs=
</value>
</data>
@@ -1027,7 +1027,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAFkMAgOFD
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAFkMAwCxE
AADIQQs=
</value>
</data>
@@ -1035,7 +1035,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAL0MAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAL0MAAKBC
AADIQQs=
</value>
</data>
@@ -1043,7 +1043,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQgAAL0MAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACgQgAAL0MAABZD
AADIQQs=
</value>
</data>
@@ -1051,7 +1051,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAWQwAAL0MAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABmQwAAL0MAAKBC
AADIQQs=
</value>
</data>
@@ -1059,7 +1059,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQwAAL0MAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACbQwAAL0MAABZD
AADIQQs=
</value>
</data>
@@ -1067,7 +1067,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACWQwAAL0MAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAADmQwAAL0MAAKBC
AADIQQs=
</value>
</data>
@@ -1075,7 +1075,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACvQwAAL0MAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAHRAAAL0MAABZD
AADIQQs=
</value>
</data>
@@ -1083,7 +1083,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAL0MAgOFD
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAL0MAwCxE
AADIQQs=
</value>
</data>
@@ -1091,7 +1091,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAASEMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAASEMAAKBC
AADIQQs=
</value>
</data>
@@ -1099,7 +1099,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQgAASEMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACgQgAASEMAABZD
AADIQQs=
</value>
</data>
@@ -1107,7 +1107,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAWQwAASEMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABmQwAASEMAAKBC
AADIQQs=
</value>
</data>
@@ -1115,7 +1115,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQwAASEMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACbQwAASEMAABZD
AADIQQs=
</value>
</data>
@@ -1123,7 +1123,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACWQwAASEMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAADmQwAASEMAAKBC
AADIQQs=
</value>
</data>
@@ -1131,7 +1131,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACvQwAASEMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAHRAAASEMAABZD
AADIQQs=
</value>
</data>
@@ -1139,7 +1139,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAASEMAgOFD
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAASEMAwCxE
AADIQQs=
</value>
</data>
@@ -1147,7 +1147,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAYUMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAYUMAAKBC
AADIQQs=
</value>
</data>
@@ -1155,7 +1155,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQgAAYUMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACgQgAAYUMAABZD
AADIQQs=
</value>
</data>
@@ -1163,7 +1163,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAWQwAAYUMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABmQwAAYUMAAKBC
AADIQQs=
</value>
</data>
@@ -1171,7 +1171,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQwAAYUMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACbQwAAYUMAABZD
AADIQQs=
</value>
</data>
@@ -1179,7 +1179,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACWQwAAYUMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAADmQwAAYUMAAKBC
AADIQQs=
</value>
</data>
@@ -1187,7 +1187,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACvQwAAYUMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAHRAAAYUMAABZD
AADIQQs=
</value>
</data>
@@ -1195,7 +1195,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAYUMAgOFD
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAYUMAwCxE
AADIQQs=
</value>
</data>
@@ -1203,7 +1203,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAekMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAekMAAKBC
AADIQQs=
</value>
</data>
@@ -1211,7 +1211,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQgAAekMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACgQgAAekMAABZD
AADIQQs=
</value>
</data>
@@ -1219,7 +1219,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAWQwAAekMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABmQwAAekMAAKBC
AADIQQs=
</value>
</data>
@@ -1227,7 +1227,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQwAAekMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACbQwAAekMAABZD
AADIQQs=
</value>
</data>
@@ -1235,7 +1235,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACWQwAAekMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAADmQwAAekMAAKBC
AADIQQs=
</value>
</data>
@@ -1243,7 +1243,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACvQwAAekMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAHRAAAekMAABZD
AADIQQs=
</value>
</data>
@@ -1251,7 +1251,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAekMAgOFD
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAekMAwCxE
AADIQQs=
</value>
</data>
@@ -1259,7 +1259,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAACAiUMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAACAiUMAAKBC
AADIQQs=
</value>
</data>
@@ -1267,7 +1267,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQgCAiUMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACgQgCAiUMAABZD
AADIQQs=
</value>
</data>
@@ -1275,7 +1275,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAWQwCAiUMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABmQwCAiUMAAKBC
AADIQQs=
</value>
</data>
@@ -1283,7 +1283,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQwCAiUMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACbQwCAiUMAABZD
AADIQQs=
</value>
</data>
@@ -1291,7 +1291,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACWQwCAiUMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAADmQwCAiUMAAKBC
AADIQQs=
</value>
</data>
@@ -1299,7 +1299,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACvQwCAiUMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAHRACAiUMAABZD
AADIQQs=
</value>
</data>
@@ -1307,7 +1307,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAACAiUMAgOFD
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAACAiUMAwCxE
AADIQQs=
</value>
</data>
@@ -1315,7 +1315,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAlkMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAlkMAAKBC
AADIQQs=
</value>
</data>
@@ -1323,7 +1323,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQgAAlkMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACgQgAAlkMAABZD
AADIQQs=
</value>
</data>
@@ -1331,7 +1331,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAWQwAAlkMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABmQwAAlkMAAKBC
AADIQQs=
</value>
</data>
@@ -1339,7 +1339,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQwAAlkMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACbQwAAlkMAABZD
AADIQQs=
</value>
</data>
@@ -1347,7 +1347,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACWQwAAlkMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAADmQwAAlkMAAKBC
AADIQQs=
</value>
</data>
@@ -1355,7 +1355,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACvQwAAlkMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAHRAAAlkMAABZD
AADIQQs=
</value>
</data>
@@ -1363,7 +1363,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAlkMAgOFD
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAlkMAwCxE
AADIQQs=
</value>
</data>
@@ -1371,7 +1371,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAACAokMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAACAokMAAKBC
AADIQQs=
</value>
</data>
@@ -1379,7 +1379,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQgCAokMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACgQgCAokMAABZD
AADIQQs=
</value>
</data>
@@ -1387,7 +1387,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAWQwCAokMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABmQwCAokMAAKBC
AADIQQs=
</value>
</data>
@@ -1395,7 +1395,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQwCAokMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACbQwCAokMAABZD
AADIQQs=
</value>
</data>
@@ -1403,7 +1403,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACWQwCAokMAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAADmQwCAokMAAKBC
AADIQQs=
</value>
</data>
@@ -1411,7 +1411,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACvQwCAokMAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAHRACAokMAABZD
AADIQQs=
</value>
</data>
@@ -1419,7 +1419,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAACAokMAgOFD
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAACAokMAwCxE
AADIQQs=
</value>
</data>
@@ -1427,7 +1427,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAr0MAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAr0MAAKBC
AADIQQs=
</value>
</data>
@@ -1435,7 +1435,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQgAAr0MAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACgQgAAr0MAABZD
AADIQQs=
</value>
</data>
@@ -1443,7 +1443,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAWQwAAr0MAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABmQwAAr0MAAKBC
AADIQQs=
</value>
</data>
@@ -1451,7 +1451,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQwAAr0MAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACbQwAAr0MAABZD
AADIQQs=
</value>
</data>
@@ -1459,7 +1459,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACWQwAAr0MAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAADmQwAAr0MAAKBC
AADIQQs=
</value>
</data>
@@ -1467,7 +1467,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACvQwAAr0MAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAHRAAAr0MAABZD
AADIQQs=
</value>
</data>
@@ -1475,7 +1475,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAr0MAgOFD
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAAAAr0MAwCxE
AADIQQs=
</value>
</data>
@@ -1483,7 +1483,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAACAu0MAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAACAu0MAAKBC
AADIQQs=
</value>
</data>
@@ -1491,7 +1491,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQgCAu0MAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACgQgCAu0MAABZD
AADIQQs=
</value>
</data>
@@ -1499,7 +1499,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAWQwCAu0MAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABmQwCAu0MAAKBC
AADIQQs=
</value>
</data>
@@ -1507,7 +1507,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAABIQwCAu0MAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACbQwCAu0MAABZD
AADIQQs=
</value>
</data>
@@ -1515,7 +1515,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACWQwCAu0MAAEhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAADmQwCAu0MAAKBC
AADIQQs=
</value>
</data>
@@ -1523,7 +1523,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAACvQwCAu0MAAMhC
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAHRACAu0MAABZD
AADIQQs=
</value>
</data>
@@ -1531,7 +1531,7 @@ If pressed while motion is moving, motion will also stop.
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAACAu0MAgOFD
d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAAAAAAACAu0MAwCxE
AADIQQs=
</value>
</data>

View File

@@ -295,6 +295,7 @@ namespace AR
/// SID정보가 복수가 검출되었을때 사용자가 선택하는 창
/// </summary>
FG_WAIT_INFOSELECT,
FG_WAIT_INFOSELECTCLOSE,
/// <summary>
/// 작업시작화면
/// </summary>

View File

@@ -658,7 +658,7 @@ namespace UIControl
var port_space = CvtMMtoPX_H(350 / 2.0f, 0);
var port_spacex = CvtMMtoPX_W(10, 0); ;
var PickerSizeW = CvtMMtoPX_W(200, 0);// (float)(Math.Max(CvtMMtoPX_W(150, 0), CvtMMtoPX_H(15, 0)));
var PickerSizeW = CvtMMtoPX_W(150, 0);// (float)(Math.Max(CvtMMtoPX_W(150, 0), CvtMMtoPX_H(15, 0)));
var PickerSizeH = PickerSizeW;// CvtMMtoPX_H(130, 0);//(float)(Math.Max(CvtMMtoPX_W(150, 0), CvtMMtoPX_H(15, 0)));
var PickerSpaceW = CvtMMtoPX_H(100, 0);
@@ -728,8 +728,8 @@ namespace UIControl
}
//입출력포트의 영역을 다시 계산한다
var portW = (int)(rect_main.Width * 0.175f);
var portH = (int)(rect_main.Height * 0.25f);
var portW = (int)(rect_main.Width * 0.125f);
var portH = (int)(rect_main.Height * 0.35f);
var portPad = (int)(rect_main.Width / 7f);
var MarginX = (int)((rect_main.Width - portW * 3 - portPad * 2) / 2.0);
var MarginY = (int)(rect_main.Height - portH - (portPad / 2f));
@@ -738,7 +738,7 @@ namespace UIControl
{
arVar_Port[i].Rect = new Rectangle(
(int)rect_main.Left + MarginX + (i * portW) + (i * portPad),
(int)rect_main.Top + MarginY,
(int)rect_main.Top + MarginY+50,
portW, portH);
zitem.Add(new CItem
{
@@ -1037,17 +1037,17 @@ namespace UIControl
void Scean_Normal(Graphics g)
{
//전체 영역 테두리
g.DrawRectangle(new Pen(Color.White, 2), rect_main.Left, rect_main.Top, rect_main.Width, rect_main.Height);
//g.DrawRectangle(new Pen(Color.White, 2), rect_main.Left, rect_main.Top, rect_main.Width, rect_main.Height);
//포트표시(셔틀위에 표시됨)
Draw_Port(g); //front
//프린터영역그리기 201228
var printareahei = 50;
var printareahei = 100;
var printareaw = 100;
var printbordersize = 5;
var rectpl = new RectangleF(arVar_Port[0].Rect.Right + printbordersize, arVar_Port[0].Rect.Top - 85, printareaw, printareahei);
var rectpl = new RectangleF(arVar_Port[0].Rect.Right + printbordersize, arVar_Port[0].Rect.Top - printareahei-20, printareaw, printareahei);
var fColorPrn = arFGPrinter0END ? Color.Lime : (arFGPrinter0RDY ? Color.Gold : Color.Gray);
g.DrawRect(rectpl, fColorPrn, printbordersize);
var prnstrbase = "";// "Print Qty:" + arCountPrint0.ToString("000") + "\n";
@@ -1056,7 +1056,7 @@ namespace UIControl
g.DrawString(prnstr, new Font("Tahoma", 10, FontStyle.Bold), new SolidBrush(fColorPrn), rectpl,
new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
rectpl = new RectangleF(arVar_Port[2].Rect.Left - 90 - printbordersize, arVar_Port[2].Rect.Top - 85, printareaw, printareahei);
rectpl = new RectangleF(arVar_Port[2].Rect.Left - 90 - printbordersize, arVar_Port[2].Rect.Top - printareahei-20, printareaw, printareahei);
fColorPrn = arFGPrinter1END ? Color.Lime : (arFGPrinter1RDY ? Color.Gold : Color.Gray);
g.DrawRect(rectpl, fColorPrn, printbordersize);
prnstrbase = "";// "Print Qty:" + arCountPrint1.ToString("000") + "\n";

Submodule Handler/swPLC deleted from e583341e53

63
Handler/swPLC/.gitattributes vendored Normal file
View File

@@ -0,0 +1,63 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain

8
Handler/swPLC/.gitignore vendored Normal file
View File

@@ -0,0 +1,8 @@
*.suo
*.user
*.pdb
bin
obj
desktop.ini
.vs
packages

34
Handler/swPLC/CSetting.cs Normal file
View File

@@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AR;
namespace Project
{
public class CSetting : AR.Setting
{
#region "swplc"
public string swplc_name { get; set; }
public int swplc_size { get; set; }
#endregion
public CSetting()
{
}
public override void AfterLoad()
{
if (swplc_size < 1) swplc_size = 100;
if (swplc_name.isEmpty()) swplc_name = "swplc";
}
public override void AfterSave()
{
}
}
}

402
Handler/swPLC/Form1.Designer.cs generated Normal file
View File

@@ -0,0 +1,402 @@
namespace Project
{
partial class Form1
{
/// <summary>
/// 필수 디자이너 변수입니다.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 사용 중인 모든 리소스를 정리합니다.
/// </summary>
/// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마세요.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.timer1 = new System.Windows.Forms.Timer(this.components);
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
this.toolStripStatusLabel2 = new System.Windows.Forms.ToolStripStatusLabel();
this.toolStripStatusLabel3 = new System.Windows.Forms.ToolStripStatusLabel();
this.logTextBox1 = new arCtl.LogTextBox();
this.gridView1 = new arCtl.GridView.GridView();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.button3 = new System.Windows.Forms.Button();
this.button4 = new System.Windows.Forms.Button();
this.button5 = new System.Windows.Forms.Button();
this.button6 = new System.Windows.Forms.Button();
this.button7 = new System.Windows.Forms.Button();
this.button8 = new System.Windows.Forms.Button();
this.button9 = new System.Windows.Forms.Button();
this.button10 = new System.Windows.Forms.Button();
this.button11 = new System.Windows.Forms.Button();
this.button12 = new System.Windows.Forms.Button();
this.button13 = new System.Windows.Forms.Button();
this.ioPanel1 = new arDev.AjinEXTEK.UI.IOPanel();
this.statusStrip1.SuspendLayout();
this.tableLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// timer1
//
this.timer1.Interval = 250;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
//
// statusStrip1
//
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripStatusLabel1,
this.toolStripStatusLabel2,
this.toolStripStatusLabel3});
this.statusStrip1.Location = new System.Drawing.Point(0, 564);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Size = new System.Drawing.Size(760, 22);
this.statusStrip1.TabIndex = 2;
this.statusStrip1.Text = "statusStrip1";
//
// toolStripStatusLabel1
//
this.toolStripStatusLabel1.Name = "toolStripStatusLabel1";
this.toolStripStatusLabel1.Size = new System.Drawing.Size(73, 17);
this.toolStripStatusLabel1.Text = "AutoControl";
this.toolStripStatusLabel1.Click += new System.EventHandler(this.toolStripStatusLabel1_Click);
//
// toolStripStatusLabel2
//
this.toolStripStatusLabel2.Name = "toolStripStatusLabel2";
this.toolStripStatusLabel2.Size = new System.Drawing.Size(118, 17);
this.toolStripStatusLabel2.Text = "toolStripStatusLabel2";
//
// toolStripStatusLabel3
//
this.toolStripStatusLabel3.Name = "toolStripStatusLabel3";
this.toolStripStatusLabel3.Size = new System.Drawing.Size(118, 17);
this.toolStripStatusLabel3.Text = "toolStripStatusLabel3";
//
// logTextBox1
//
this.logTextBox1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(24)))), ((int)(((byte)(24)))), ((int)(((byte)(24)))));
this.logTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.logTextBox1.ColorList = new arCtl.sLogMessageColor[0];
this.logTextBox1.DateFormat = "mm:ss.fff";
this.logTextBox1.DefaultColor = System.Drawing.Color.LightGray;
this.logTextBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.logTextBox1.EnableDisplayTimer = true;
this.logTextBox1.EnableGubunColor = true;
this.logTextBox1.Font = new System.Drawing.Font("Consolas", 9F);
this.logTextBox1.ListFormat = "[{0}] {1}";
this.logTextBox1.Location = new System.Drawing.Point(0, 116);
this.logTextBox1.MaxListCount = ((ushort)(200));
this.logTextBox1.MaxTextLength = ((uint)(4000u));
this.logTextBox1.MessageInterval = 50;
this.logTextBox1.Name = "logTextBox1";
this.logTextBox1.Size = new System.Drawing.Size(760, 193);
this.logTextBox1.TabIndex = 0;
this.logTextBox1.Text = "";
//
// gridView1
//
this.gridView1.arVeriticalDraw = false;
this.gridView1.BorderColor = System.Drawing.Color.Black;
this.gridView1.BorderSize = 0;
this.gridView1.ColorList = null;
this.gridView1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.gridView1.FontPin = new System.Drawing.Font("Consolas", 8F, System.Drawing.FontStyle.Bold);
this.gridView1.ForeColorPin = System.Drawing.Color.WhiteSmoke;
this.gridView1.Location = new System.Drawing.Point(0, 309);
this.gridView1.MatrixSize = new System.Drawing.Point(3, 5);
this.gridView1.MenuBorderSize = 1;
this.gridView1.MenuGap = 5;
this.gridView1.MinimumSize = new System.Drawing.Size(100, 50);
this.gridView1.Name = "gridView1";
this.gridView1.Names = null;
this.gridView1.ShadowColor = System.Drawing.Color.Transparent;
this.gridView1.showDebugInfo = false;
this.gridView1.ShowIndexString = true;
this.gridView1.ShowNameString = true;
this.gridView1.ShowValueString = true;
this.gridView1.Size = new System.Drawing.Size(760, 100);
this.gridView1.TabIndex = 3;
this.gridView1.Tags = null;
this.gridView1.Text = "gridView1";
this.gridView1.TextAttachToImage = true;
this.gridView1.Titles = null;
this.gridView1.Values = null;
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 3;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33332F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33334F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33334F));
this.tableLayoutPanel1.Controls.Add(this.button1, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.button2, 2, 1);
this.tableLayoutPanel1.Controls.Add(this.button3, 1, 1);
this.tableLayoutPanel1.Controls.Add(this.button4, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.button5, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.button6, 2, 0);
this.tableLayoutPanel1.Controls.Add(this.button7, 2, 2);
this.tableLayoutPanel1.Controls.Add(this.button8, 1, 2);
this.tableLayoutPanel1.Controls.Add(this.button9, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.button10, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.button11, 1, 3);
this.tableLayoutPanel1.Controls.Add(this.button12, 2, 3);
this.tableLayoutPanel1.Controls.Add(this.button13, 0, 4);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 409);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 5;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0005F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0005F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0005F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 19.99851F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(760, 155);
this.tableLayoutPanel1.TabIndex = 4;
//
// button1
//
this.button1.Dock = System.Windows.Forms.DockStyle.Fill;
this.button1.Location = new System.Drawing.Point(3, 34);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(247, 25);
this.button1.TabIndex = 0;
this.button1.Tag = "0";
this.button1.Text = "Refresh Port";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// button2
//
this.button2.Dock = System.Windows.Forms.DockStyle.Fill;
this.button2.Location = new System.Drawing.Point(509, 34);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(248, 25);
this.button2.TabIndex = 0;
this.button2.Tag = "2";
this.button2.Text = "Refresh Port";
this.button2.UseVisualStyleBackColor = true;
this.button2.Click += new System.EventHandler(this.button1_Click);
//
// button3
//
this.button3.Dock = System.Windows.Forms.DockStyle.Fill;
this.button3.Location = new System.Drawing.Point(256, 34);
this.button3.Name = "button3";
this.button3.Size = new System.Drawing.Size(247, 25);
this.button3.TabIndex = 0;
this.button3.Tag = "1";
this.button3.Text = "Refresh Port";
this.button3.UseVisualStyleBackColor = true;
this.button3.Click += new System.EventHandler(this.button1_Click);
//
// button4
//
this.button4.Dock = System.Windows.Forms.DockStyle.Fill;
this.button4.Location = new System.Drawing.Point(3, 3);
this.button4.Name = "button4";
this.button4.Size = new System.Drawing.Size(247, 25);
this.button4.TabIndex = 1;
this.button4.Tag = "0";
this.button4.Text = "Up";
this.button4.UseVisualStyleBackColor = true;
this.button4.Click += new System.EventHandler(this.button4_Click);
//
// button5
//
this.button5.Dock = System.Windows.Forms.DockStyle.Fill;
this.button5.Location = new System.Drawing.Point(256, 3);
this.button5.Name = "button5";
this.button5.Size = new System.Drawing.Size(247, 25);
this.button5.TabIndex = 1;
this.button5.Tag = "1";
this.button5.Text = "Up";
this.button5.UseVisualStyleBackColor = true;
this.button5.Click += new System.EventHandler(this.button4_Click);
//
// button6
//
this.button6.Dock = System.Windows.Forms.DockStyle.Fill;
this.button6.Location = new System.Drawing.Point(509, 3);
this.button6.Name = "button6";
this.button6.Size = new System.Drawing.Size(248, 25);
this.button6.TabIndex = 1;
this.button6.Tag = "2";
this.button6.Text = "Up";
this.button6.UseVisualStyleBackColor = true;
this.button6.Click += new System.EventHandler(this.button4_Click);
//
// button7
//
this.button7.Dock = System.Windows.Forms.DockStyle.Fill;
this.button7.Location = new System.Drawing.Point(509, 65);
this.button7.Name = "button7";
this.button7.Size = new System.Drawing.Size(248, 25);
this.button7.TabIndex = 1;
this.button7.Tag = "2";
this.button7.Text = "Down";
this.button7.UseVisualStyleBackColor = true;
this.button7.Click += new System.EventHandler(this.button9_Click);
//
// button8
//
this.button8.Dock = System.Windows.Forms.DockStyle.Fill;
this.button8.Location = new System.Drawing.Point(256, 65);
this.button8.Name = "button8";
this.button8.Size = new System.Drawing.Size(247, 25);
this.button8.TabIndex = 1;
this.button8.Tag = "1";
this.button8.Text = "Down";
this.button8.UseVisualStyleBackColor = true;
this.button8.Click += new System.EventHandler(this.button9_Click);
//
// button9
//
this.button9.Dock = System.Windows.Forms.DockStyle.Fill;
this.button9.Location = new System.Drawing.Point(3, 65);
this.button9.Name = "button9";
this.button9.Size = new System.Drawing.Size(247, 25);
this.button9.TabIndex = 1;
this.button9.Tag = "0";
this.button9.Text = "Down";
this.button9.UseVisualStyleBackColor = true;
this.button9.Click += new System.EventHandler(this.button9_Click);
//
// button10
//
this.button10.Dock = System.Windows.Forms.DockStyle.Fill;
this.button10.Location = new System.Drawing.Point(3, 96);
this.button10.Name = "button10";
this.button10.Size = new System.Drawing.Size(247, 24);
this.button10.TabIndex = 2;
this.button10.Tag = "0";
this.button10.Text = "Stop";
this.button10.UseVisualStyleBackColor = true;
this.button10.Click += new System.EventHandler(this.button12_Click);
//
// button11
//
this.button11.Dock = System.Windows.Forms.DockStyle.Fill;
this.button11.Location = new System.Drawing.Point(256, 96);
this.button11.Name = "button11";
this.button11.Size = new System.Drawing.Size(247, 24);
this.button11.TabIndex = 2;
this.button11.Tag = "1";
this.button11.Text = "Stop";
this.button11.UseVisualStyleBackColor = true;
this.button11.Click += new System.EventHandler(this.button12_Click);
//
// button12
//
this.button12.Dock = System.Windows.Forms.DockStyle.Fill;
this.button12.Location = new System.Drawing.Point(509, 96);
this.button12.Name = "button12";
this.button12.Size = new System.Drawing.Size(248, 24);
this.button12.TabIndex = 2;
this.button12.Tag = "2";
this.button12.Text = "Stop";
this.button12.UseVisualStyleBackColor = true;
this.button12.Click += new System.EventHandler(this.button12_Click);
//
// button13
//
this.tableLayoutPanel1.SetColumnSpan(this.button13, 3);
this.button13.Dock = System.Windows.Forms.DockStyle.Fill;
this.button13.Location = new System.Drawing.Point(3, 126);
this.button13.Name = "button13";
this.button13.Size = new System.Drawing.Size(754, 26);
this.button13.TabIndex = 3;
this.button13.Text = "Exit";
this.button13.UseVisualStyleBackColor = true;
this.button13.Click += new System.EventHandler(this.button13_Click);
//
// ioPanel1
//
this.ioPanel1.BorderColor = System.Drawing.Color.Empty;
this.ioPanel1.BorderSize = 0;
this.ioPanel1.ColorList = null;
this.ioPanel1.Dock = System.Windows.Forms.DockStyle.Top;
this.ioPanel1.FontPin = new System.Drawing.Font("Consolas", 8F, System.Drawing.FontStyle.Bold);
this.ioPanel1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(200)))), ((int)(((byte)(200)))), ((int)(((byte)(200)))));
this.ioPanel1.ForeColorPin = System.Drawing.Color.WhiteSmoke;
this.ioPanel1.Location = new System.Drawing.Point(0, 0);
this.ioPanel1.MatrixSize = new System.Drawing.Point(3, 6);
this.ioPanel1.MenuBorderSize = 1;
this.ioPanel1.MenuGap = 5;
this.ioPanel1.MinimumSize = new System.Drawing.Size(100, 50);
this.ioPanel1.Name = "ioPanel1";
this.ioPanel1.ShadowColor = System.Drawing.Color.Transparent;
this.ioPanel1.showDebugInfo = false;
this.ioPanel1.ShowPinName = true;
this.ioPanel1.Size = new System.Drawing.Size(760, 116);
this.ioPanel1.TabIndex = 0;
this.ioPanel1.TextAttachToImage = true;
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(760, 586);
this.Controls.Add(this.logTextBox1);
this.Controls.Add(this.gridView1);
this.Controls.Add(this.ioPanel1);
this.Controls.Add(this.tableLayoutPanel1);
this.Controls.Add(this.statusStrip1);
this.MaximizeBox = false;
this.Name = "Form1";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
this.tableLayoutPanel1.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private arCtl.LogTextBox logTextBox1;
private System.Windows.Forms.Timer timer1;
private arDev.AjinEXTEK.UI.IOPanel ioPanel1;
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel2;
private arCtl.GridView.GridView gridView1;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel3;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button3;
private System.Windows.Forms.Button button4;
private System.Windows.Forms.Button button5;
private System.Windows.Forms.Button button6;
private System.Windows.Forms.Button button7;
private System.Windows.Forms.Button button8;
private System.Windows.Forms.Button button9;
private System.Windows.Forms.Button button10;
private System.Windows.Forms.Button button11;
private System.Windows.Forms.Button button12;
private System.Windows.Forms.Button button13;
}
}

762
Handler/swPLC/Form1.cs Normal file
View File

@@ -0,0 +1,762 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Windows.Forms;
using AR;
namespace Project
{
public partial class Form1 : Form
{
AR.Log log;
arDev.DIO.IDIO dio;
StateMachine sm;
AR.MemoryMap.Server swplc;
bool exitforce = false;
byte[] buffer = new byte[16];
public Form1()
{
InitializeComponent();
this.Text = $"{Application.ProductName} ver {Application.ProductVersion}";
log = new AR.Log();
log.RaiseMsg += (p1, p2, p3) => { this.logTextBox1.AddMsg(p1, p2, p3); };
this.FormClosing += Form1_FormClosing;
this.logTextBox1.ColorList = new arCtl.sLogMessageColor[] {
new arCtl.sLogMessageColor("NORM",Color.Yellow),
new arCtl.sLogMessageColor("ERR",Color.Red),
new arCtl.sLogMessageColor("WARN",Color.Tomato),
new arCtl.sLogMessageColor("INFO",Color.LightSkyBlue)
};
List<string> piname = new List<String>();
List<string> titles = new List<String>();
List<bool> values = new List<bool>();
titles.AddRange(new string[] {
"Upper Limit","Reel Detect","Lower Limit",
"Motor Direction(1=DN,0=UP)","Motor Run","Emergency",
});
piname.AddRange(new string[] {
"X"+((int)eDIName.PORTL_LIM_UP).ToString("X2"),
"X"+((int)eDIName.PORTL_DET_UP).ToString("X2"),
"X"+((int)eDIName.PORTL_LIM_DN).ToString("X2"),
"Y"+((int)eDOName.PORTL_MOT_DIR).ToString("X2"),
"Y"+((int)eDOName.PORTL_MOT_RUN).ToString("X2"),"--"
});
titles.AddRange(new string[] {
"Upper Limit","Reel Detect","Lower Limit",
"Motor Direction(1=DN,0=UP)","Motor Run","--",
});
piname.AddRange(new string[] {
"X"+((int)eDIName.PORTC_LIM_UP).ToString("X2"),
"X"+((int)eDIName.PORTC_DET_UP).ToString("X2"),
"X"+((int)eDIName.PORTC_LIM_DN).ToString("X2"),
"Y"+((int)eDOName.PORTC_MOT_DIR).ToString("X2"),
"Y"+((int)eDOName.PORTC_MOT_RUN).ToString("X2"),"--"
});
titles.AddRange(new string[] {
"Upper Limit","Reel Detect","Lower Limit",
"Motor Direction(1=DN,0=UP)","Motor Run","--"
});
piname.AddRange(new string[] {
"X"+((int)eDIName.PORTR_LIM_UP).ToString("X2"),
"X"+((int)eDIName.PORTR_DET_UP).ToString("X2"),
"X"+((int)eDIName.PORTR_LIM_DN).ToString("X2"),
"Y"+((int)eDOName.PORTR_MOT_DIR).ToString("X2"),
"Y"+((int)eDOName.PORTR_MOT_RUN).ToString("X2"),"--"
});
for (int i = 0; i < titles.Count; i++)
values.Add(false);
ioPanel1.ColorList = new arDev.AjinEXTEK.UI.ColorListItem[] {
new arDev.AjinEXTEK.UI.ColorListItem{ BackColor1 = Color.DimGray, BackColor2 = Color.FromArgb(30,30,30), Remark="False" },
new arDev.AjinEXTEK.UI.ColorListItem{ BackColor1 = Color.Lime, BackColor2 = Color.Green, Remark="True" },
new arDev.AjinEXTEK.UI.ColorListItem{ BackColor1 = Color.Magenta, BackColor2 = Color.Green, Remark="True" },
new arDev.AjinEXTEK.UI.ColorListItem{ BackColor1 = Color.SkyBlue, BackColor2 = Color.LightSkyBlue, Remark="True" },
};
this.ioPanel1.setTitle(titles.ToArray());
this.ioPanel1.setNames(piname.ToArray());
this.ioPanel1.setValue(values.ToArray());
this.ioPanel1.Invalidate();
//내부버퍼확인
titles.Clear();
piname.Clear();
var valueb = new List<ushort>();
for (int i = 0; i < 16; i++)
{
var addr = (eswPLCAddr)i;
piname.Add(i.ToString("X2"));
titles.Add(addr.ToString());
valueb.Add(0);
}
gridView1.ColorList = new arCtl.GridView.ColorListItem[] {
new arCtl.GridView.ColorListItem{ BackColor1 = Color.DimGray, BackColor2 = Color.FromArgb(30,30,30), Remark="False" },
new arCtl.GridView.ColorListItem{ BackColor1 = Color.Lime, BackColor2 = Color.Green, Remark="True" },
new arCtl.GridView.ColorListItem{ BackColor1 = Color.Magenta, BackColor2 = Color.Green, Remark="True" },
new arCtl.GridView.ColorListItem{ BackColor1 = Color.SkyBlue, BackColor2 = Color.LightSkyBlue, Remark="True" },
};
this.gridView1.setTitle(titles.ToArray());
this.gridView1.setNames(piname.ToArray());
this.gridView1.setValue(valueb.ToArray());
this.gridView1.ShowValueString = true;
this.gridView1.ShowNameString = true;
this.gridView1.ShowIndexString = false;
this.gridView1.Invalidate();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (exitforce == false)
{
this.WindowState = FormWindowState.Minimized;
e.Cancel = true;
return;
}
timer1.Stop();
dio.Dispose();
sm.Stop();
log.AddI("Program terminated");
log.Flush();
}
private void Form1_Load(object sender, EventArgs e)
{
log.AddI("Program started");
dio = new arDev.AjinEXTEK.DIO(arDev.AjinEXTEK.ELibraryType.AXT);// arDev.AjinEXTEK.DIO();
if (dio.Init())
{
dio.IOValueChanged += Dio_IOValueChanged;
dio.RunMonitor();
log.Add($"DI:{dio.GetDICount}/DO:{dio.GetDOCount}");
}
else log.AddE($"DIO initialization failed");
swplc = new AR.MemoryMap.Server(PUB.Setting.swplc_name, PUB.Setting.swplc_size);
swplc.ValueChanged += Plc_ValueChanged;
swplc.Start();
ioPanel1.ItemClick += IoPanel1_ItemClick;
sm = new AR.StateMachine();
sm.StepChanged += Sm_StepChanged;
sm.Running += Sm_Running;
sm.SPS += Sm_SPS;
if (dio.IsInit == false) log.AddE($"DIO initialization failed");
log.Add($"State machine started");
sm.Start();
sm.SetNewStep((byte)eSMStep.RUN);
this.starttime = DateTime.Now;
timer1.Start();
}
private void Plc_ValueChanged(object sender, AR.MemoryMap.Core.monitorvalueargs e)
{
}
private void Dio_IOValueChanged(object sender, arDev.DIO.IOValueEventArgs e)
{
if (e.Direction == arDev.DIO.eIOPINDIR.INPUT)
{
var pin = (eDIName)e.ArrIDX;
//센서가 활성화될때는 이값을 설정해준다
//나머지조건은 autocontrol 에서 처리된다.
var value = GetDIValue(pin);
if (value)
{
if (pin == eDIName.PORTL_LIM_DN) WriteBuffer(eswPLCAddr.LPort, 1);
if (pin == eDIName.PORTL_DET_UP) WriteBuffer(eswPLCAddr.LPort, 2);
if (pin == eDIName.PORTL_LIM_UP) WriteBuffer(eswPLCAddr.LPort, 3);
if (pin == eDIName.PORTC_LIM_DN) WriteBuffer(eswPLCAddr.CPort, 1);
if (pin == eDIName.PORTC_DET_UP) WriteBuffer(eswPLCAddr.CPort, 2);
if (pin == eDIName.PORTC_LIM_UP) WriteBuffer(eswPLCAddr.CPort, 3);
if (pin == eDIName.PORTR_LIM_DN) WriteBuffer(eswPLCAddr.RPort, 1);
if (pin == eDIName.PORTR_DET_UP) WriteBuffer(eswPLCAddr.RPort, 2);
if (pin == eDIName.PORTR_LIM_UP) WriteBuffer(eswPLCAddr.RPort, 3);
}
}
else
{
var pin = (eDOName)e.ArrIDX;
if (pin == eDOName.PORTL_MOT_RUN)
{
if (e.NewValue == false) WriteBuffer(eswPLCAddr.LMotor, 3);
else
{
//방향을 확인해야한다
var value = GetDOValue(eDOName.PORTL_MOT_DIR) ? 2 : 1;
WriteBuffer(eswPLCAddr.LMotor, (byte)value);
}
}
else if (pin == eDOName.PORTC_MOT_RUN)
{
if (e.NewValue == false) WriteBuffer(eswPLCAddr.CMotor, 3);
else
{
//방향을 확인해야한다
var value = GetDOValue(eDOName.PORTC_MOT_DIR) ? 2 : 1;
WriteBuffer(eswPLCAddr.CMotor, (byte)value);
}
}
else if (pin == eDOName.PORTR_MOT_RUN)
{
if (e.NewValue == false) WriteBuffer(eswPLCAddr.RMotor, 3);
else
{
//방향을 확인해야한다
var value = GetDOValue(eDOName.PORTR_MOT_DIR) ? 2 : 1;
WriteBuffer(eswPLCAddr.RMotor, (byte)value);
}
}
}
}
private void IoPanel1_ItemClick(object sender, arDev.AjinEXTEK.UI.IOPanel.ItemClickEventArgs e)
{
if (dio != null && dio.IsInit == false) return;
var name = this.ioPanel1.Names[e.idx];
if (name.StartsWith("Y"))
{
var pinno = Convert.ToInt32(name.Substring(1), 16);
var pin = (eDOName)pinno;
var cur = dio.GetDOValue(pinno);
dio.SetOutput(pinno, !cur);
log.Add($"value change [X{pinno:X2}] {pin} to {!cur}");
}
}
bool GetDOValue(eDOName pin)
{
return dio.GetDOValue((int)pin);
}
bool GetDIValue(eDIName pin)
{
if (pin == eDIName.PORTL_LIM_DN || pin == eDIName.PORTC_LIM_DN || pin == eDIName.PORTR_LIM_DN)
{
return !dio.GetDIValue((int)pin);
}
else if (pin == eDIName.PORTL_LIM_UP || pin == eDIName.PORTC_LIM_UP || pin == eDIName.PORTR_LIM_UP)
{
return !dio.GetDIValue((int)pin);
}
else if (pin == eDIName.PORTL_DET_UP || pin == eDIName.PORTC_DET_UP || pin == eDIName.PORTR_DET_UP)
{
return !dio.GetDIValue((int)pin);
}
else if (pin == eDIName.BUT_EMGF)
{
return !dio.GetDIValue((int)pin);
}
else return dio.GetDIValue((int)pin);
}
private void Sm_SPS(object sender, EventArgs e)
{
//limit 센서에 의해 자동 멈춤
if (swplc.Init)
{
AutoStop();
WriteBuffer();
CommandProcess();
}
}
void CommandProcess()
{
//시스템 상태값 0:7 기록
swplc.Write(0, buffer, 0, 12);
//명령어 가져오기 7:3개의 데이터 확인
if (swplc.ReadBytes(12, 3, out byte[] plcbuffer))
{
//내부버퍼에 상태를 기록한다
Array.Copy(plcbuffer, 0, this.buffer, 12, plcbuffer.Length);
}
//command value
var lcmd = ReadBuffer(eswPLCAddr.LCmd);
var ccmd = ReadBuffer(eswPLCAddr.CCmd);
var rcmd = ReadBuffer(eswPLCAddr.RCmd);
//left command check
if (lcmd == 1) MotorControl(eMotList.Left, eMotControl.Down);
else if (lcmd == 2) MotorControl(eMotList.Left, eMotControl.Up);
else if (lcmd == 3) MotorControl(eMotList.Left, eMotControl.Stop);
else if (lcmd == 4) MotorRefresh(eMotList.Left);
if (lcmd < 4 && ReadBuffer(eswPLCAddr.LSts) != 0) WriteBuffer(eswPLCAddr.LSts, 0);
//center command check
if (ccmd == 1) MotorControl(eMotList.Center, eMotControl.Down);
else if (ccmd == 2) MotorControl(eMotList.Center, eMotControl.Up);
else if (ccmd == 3) MotorControl(eMotList.Center, eMotControl.Stop);
else if (ccmd == 4) MotorRefresh(eMotList.Center);
if (ccmd < 4 && ReadBuffer(eswPLCAddr.CSts) != 0) WriteBuffer(eswPLCAddr.CSts, 0);
//right command check
if (rcmd == 1) MotorControl(eMotList.Right, eMotControl.Down);
else if (rcmd == 2) MotorControl(eMotList.Right, eMotControl.Up);
else if (rcmd == 3) MotorControl(eMotList.Right, eMotControl.Stop);
else if (rcmd == 4) MotorRefresh(eMotList.Right);
if (rcmd < 4 && ReadBuffer(eswPLCAddr.RSts) != 0) WriteBuffer(eswPLCAddr.RSts, 0);
}
/// <summary>
/// 모터를 down -> up 합니다.
/// </summary>
/// <param name="mot"></param>
/// <param name="cmd"></param>
void MotorRefresh(eMotList mot)
{
eswPLCAddr address = (eswPLCAddr)((int)eswPLCAddr.LSts + (int)mot);
var Sts = ReadBuffer(address);
//상태값을 변경한다
if (Sts == 0) //처음시작하는경우이다
{
motortime[(int)mot] = DateTime.Now;
MotorControl(mot, eMotControl.Down);
WriteBuffer(address, 1);
log.Add($"Motor[{mot}] Refresh #1 : Down,Addr={address}");
}
else if (Sts == 1) //3초간 내린다. 센서가 감지되면 계속 내려야 한다
{
//low limit check
if (mot == eMotList.Left && GetDIValue(eDIName.PORTL_LIM_DN))
{
log.Add($"Motor[{mot}] Refresh #2 : Down Limit,Addr={address}");
MotorControl(mot, eMotControl.Stop);
WriteBuffer(address, 2);
}
else if (mot == eMotList.Center && GetDIValue(eDIName.PORTC_LIM_DN))
{
log.Add($"Motor[{mot}] Refresh #2 : Down Limit,Addr={address}");
MotorControl(mot, eMotControl.Stop);
WriteBuffer(address, 2);
}
else if (mot == eMotList.Right && GetDIValue(eDIName.PORTR_LIM_DN))
{
log.Add($"Motor[{mot}] Refresh #2 : Down Limit,Addr={address}");
MotorControl(mot, eMotControl.Stop);
WriteBuffer(address, 2);
}
else if (mot == eMotList.Left && GetDIValue(eDIName.PORTL_DET_UP))
{
return;
}
else if (mot == eMotList.Center && GetDIValue(eDIName.PORTC_DET_UP))
{
return;
}
else if (mot == eMotList.Right && GetDIValue(eDIName.PORTR_DET_UP))
{
return;
}
else
{
var ts = DateTime.Now - motortime[(int)mot];
if (ts.TotalSeconds > 3)
{
log.Add($"Motor[{mot}] Refresh #2 : Down Time Over,Addr={address}");
MotorControl(mot, eMotControl.Stop);
WriteBuffer(address, 2);
}
}
}
else if (Sts == 2) //다시 올린다
{
log.Add($"Motor[{mot}] Refresh #3 : Up Addr={address}");
MotorControl(mot, eMotControl.Up);
motortime[(int)mot] = DateTime.Now;
WriteBuffer(address, 3);
}
else if (Sts == 3) //올라가는건
{
WriteBuffer(address, 0);
eswPLCAddr addressCmd = (eswPLCAddr)((int)eswPLCAddr.LCmd + (int)mot);
if (addressCmd == eswPLCAddr.CCmd)
{
}
log.Add($"Refresh[{mot}] Complete Addr={address}/{addressCmd} Reset");
swplc.Write((int)addressCmd, 0);
}
}
int[] motorseq = new int[] { 0, 0, 0 };
DateTime[] motortime = new DateTime[] { DateTime.Now, DateTime.Now, DateTime.Now };
void MotorControl(eMotList mot, eMotControl cmd)
{
if (cmd == eMotControl.Stop)
{
eDOName pin = eDOName.PORTL_MOT_RUN;
if (mot == eMotList.Center) pin = eDOName.PORTC_MOT_RUN;
else if (mot == eMotList.Right) pin = eDOName.PORTR_MOT_RUN;
//출력이켜져있다면 끈다
if (GetDOValue(pin)) SetOutput(pin, false);
}
else if (cmd == eMotControl.Down || cmd == eMotControl.Up)
{
var dir = cmd == eMotControl.Down ? true : false;
eDOName pinDir = eDOName.PORTL_MOT_DIR;
if (mot == eMotList.Center) pinDir = eDOName.PORTC_MOT_DIR;
else if (mot == eMotList.Right) pinDir = eDOName.PORTR_MOT_DIR;
eDOName pinRun = eDOName.PORTL_MOT_RUN;
if (mot == eMotList.Center) pinRun = eDOName.PORTC_MOT_RUN;
else if (mot == eMotList.Right) pinRun = eDOName.PORTR_MOT_RUN;
if (GetDOValue(pinDir) != dir) SetOutput(pinDir, dir);
if (GetDOValue(pinRun) == false) SetOutput(pinRun, true);
}
}
bool SetOutput(eDOName pin, bool value)
{
return dio.SetOutput((int)pin, value);
}
/// <summary>
/// Check the value of internal temporary buffer
/// </summary>
/// <param name="addr"></param>
/// <returns></returns>
byte ReadBuffer(eswPLCAddr addr)
{
return buffer[(int)addr];
}
void WriteBuffer(eswPLCAddr addr, byte value)
{
if (addr >= eswPLCAddr.LCmd) throw new Exception("Command must be written directly to swplc");
buffer[(int)addr] = value;
}
void WriteBuffer()
{
var idx = 0;
//현재상태를 기록합니다
var bReady = dio != null && dio.IsInit;
buffer[idx++] = bReady ? (byte)1 : (byte)2;
//모터상태값3개는 동작시 발생한다
idx++;
idx++;
idx++;
}
/// <summary>
/// Automatically stops when limit sensor and detect are detected.
/// </summary>
void AutoStop()
{
if (dio == null || dio.IsInit == false || autocontrol == false) return;
//모터가 동작중에만 처리한다.
var motrunL = dio.GetDOValue((int)eDOName.PORTL_MOT_RUN);
var motrunC = dio.GetDOValue((int)eDOName.PORTC_MOT_RUN);
var motrunR = dio.GetDOValue((int)eDOName.PORTR_MOT_RUN);
if (motrunL)
{
if (GetDIValue(eDIName.BUT_EMGF))
{
dio.SetOutput((int)eDOName.PORTL_MOT_RUN, false);
}
else
{
var dirDn = dio.GetDOValue((int)eDOName.PORTL_MOT_DIR);
var limUp = GetDIValue(eDIName.PORTL_LIM_UP);
var detect = GetDIValue(eDIName.PORTL_DET_UP);
var limDn = GetDIValue(eDIName.PORTL_LIM_DN);
if (dirDn == false)
{
if (detect)
dio.SetOutput((int)eDOName.PORTL_MOT_RUN, false);
else if (limUp)
dio.SetOutput((int)eDOName.PORTL_MOT_RUN, false);
}
else
{
if (limDn)
dio.SetOutput((int)eDOName.PORTL_MOT_RUN, false);
}
}
}
if (motrunC)
{
if (GetDIValue(eDIName.BUT_EMGF))
{
dio.SetOutput((int)eDOName.PORTC_MOT_RUN, false);
}
else
{
var dirDn = dio.GetDOValue((int)eDOName.PORTC_MOT_DIR);
var limUp = GetDIValue(eDIName.PORTC_LIM_UP);
var detect = GetDIValue(eDIName.PORTC_DET_UP);
var limDn = GetDIValue(eDIName.PORTC_LIM_DN);
if (dirDn == false)
{
if (detect)
dio.SetOutput((int)eDOName.PORTC_MOT_RUN, false);
else if (limUp)
dio.SetOutput((int)eDOName.PORTC_MOT_RUN, false);
}
else
{
if (limDn)
dio.SetOutput((int)eDOName.PORTC_MOT_RUN, false);
}
}
}
if (motrunR)
{
if (GetDIValue(eDIName.BUT_EMGF))
{
dio.SetOutput((int)eDOName.PORTR_MOT_RUN, false);
}
else
{
var dirDn = dio.GetDOValue((int)eDOName.PORTR_MOT_DIR);
var limUp = GetDIValue(eDIName.PORTR_LIM_UP);
var detect = GetDIValue(eDIName.PORTR_DET_UP);
var limDn = GetDIValue(eDIName.PORTR_LIM_DN);
if (dirDn == false)
{
if (detect)
dio.SetOutput((int)eDOName.PORTR_MOT_RUN, false);
else if (limUp)
dio.SetOutput((int)eDOName.PORTR_MOT_RUN, false);
}
else
{
if (limDn)
dio.SetOutput((int)eDOName.PORTR_MOT_RUN, false);
}
}
}
}
private void Sm_Running(object sender, AR.StateMachine.RunningEventArgs e)
{
//throw new NotImplementedException();
var step = (eSMStep)e.Step;
switch (step)
{
case eSMStep.RUN:
break;
}
}
private void Sm_StepChanged(object sender, AR.StateMachine.StepChangeEventArgs e)
{
var step = (eSMStep)e.New;
log.Add($"Step Changed : {step}");
}
DateTime starttime;
bool startminimize = false;
private void timer1_Tick(object sender, EventArgs e)
{
//io상태표시 시작시 최소한한다 230823
if (startminimize == false && this.IsDisposed == false && this.Disposing == false)
{
var ts = DateTime.Now - starttime;
if (ts.TotalSeconds > 3)
{
this.WindowState = FormWindowState.Minimized;
startminimize = true;
}
}
var idx = 0;
if (dio != null && dio.IsInit)
{
ioPanel1.setValue(idx++, GetDIValue(eDIName.PORTL_LIM_UP));
ioPanel1.setValue(idx++, GetDIValue(eDIName.PORTL_DET_UP));
ioPanel1.setValue(idx++, GetDIValue(eDIName.PORTL_LIM_DN));
ioPanel1.setValue(idx++, GetDOValue(eDOName.PORTL_MOT_DIR));
ioPanel1.setValue(idx++, GetDOValue(eDOName.PORTL_MOT_RUN));
ioPanel1.setValue(idx++, GetDIValue(eDIName.BUT_EMGF));
ioPanel1.setValue(idx++, GetDIValue(eDIName.PORTC_LIM_UP));
ioPanel1.setValue(idx++, GetDIValue(eDIName.PORTC_DET_UP));
ioPanel1.setValue(idx++, GetDIValue(eDIName.PORTC_LIM_DN));
ioPanel1.setValue(idx++, GetDOValue(eDOName.PORTC_MOT_DIR));
ioPanel1.setValue(idx++, GetDOValue(eDOName.PORTC_MOT_RUN));
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, GetDIValue(eDIName.PORTR_LIM_UP));
ioPanel1.setValue(idx++, GetDIValue(eDIName.PORTR_DET_UP));
ioPanel1.setValue(idx++, GetDIValue(eDIName.PORTR_LIM_DN));
ioPanel1.setValue(idx++, GetDOValue(eDOName.PORTR_MOT_DIR));
ioPanel1.setValue(idx++, GetDOValue(eDOName.PORTR_MOT_RUN));
ioPanel1.setValue(idx++, false);
}
else
{
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
}
ioPanel1.Invalidate();
//내부버퍼표시
for (int i = 0; i < 16; i++)
{
var addr = (eswPLCAddr)i;
var val = ReadBuffer(addr);
var title = addr.ToString();
if (addr == eswPLCAddr.LCmd || addr == eswPLCAddr.CCmd || addr == eswPLCAddr.RCmd)
{
if (val == 0) title += "(--)";
else if (val == 1) title += "(up)";
else if (val == 2) title += "(up)";
else if (val == 3) title += "(stop)";
else if (val == 4) title += "(refresh)";
gridView1.setTitle(i, title);
}
else if (addr == eswPLCAddr.LSts || addr == eswPLCAddr.CSts || addr == eswPLCAddr.RSts)
{
if (val == 0) title += "(--)";
else title += "(~run~)";
gridView1.setTitle(i, title);
}
else if (addr == eswPLCAddr.LMotor || addr == eswPLCAddr.CMotor || addr == eswPLCAddr.RMotor)
{
if (val == 0) title += "(--)";
else if (val == 1) title += "(Down)";
else if (val == 2) title += "(up)";
else if (val == 3) title += "(stop)";
gridView1.setTitle(i, title);
}
else if (addr == eswPLCAddr.LPort || addr == eswPLCAddr.CPort || addr == eswPLCAddr.RPort)
{
if (val == 0) title += "(--)";
else if (val == 1) title += "(Limit -)";
else if (val == 2) title += "(Reel Detect)";
else if (val == 3) title += "(Limit +)";
gridView1.setTitle(i, title);
}
gridView1.setValue(i, val);
}
gridView1.Invalidate();
toolStripStatusLabel1.ForeColor = autocontrol ? Color.Green : Color.Black;
toolStripStatusLabel2.Text = swplc.Init ? "Connected" : "Disconnected";
toolStripStatusLabel2.ForeColor = swplc.Init ? Color.Black : Color.Red;
toolStripStatusLabel3.Text = $"Loop({sm.Loop_ms:N0}ms)";
}
bool autocontrol = true;
private void toolStripStatusLabel1_Click(object sender, EventArgs e)
{
this.autocontrol = !this.autocontrol;
}
private void button1_Click(object sender, EventArgs e)
{
var but = sender as Button;
var butno = int.Parse(but.Tag.ToString());
swplc.Write((int)eswPLCAddr.LCmd + butno, 4); //refresh port
}
private void button4_Click(object sender, EventArgs e)
{
var but = sender as Button;
var butno = int.Parse(but.Tag.ToString());
if (butno == 0)
MotorControl(eMotList.Left, eMotControl.Up);
else if (butno == 1)
MotorControl(eMotList.Center, eMotControl.Up);
else if (butno == 2)
MotorControl(eMotList.Right, eMotControl.Up);
}
private void button9_Click(object sender, EventArgs e)
{
var but = sender as Button;
var butno = int.Parse(but.Tag.ToString());
if (butno == 0)
MotorControl(eMotList.Left, eMotControl.Down);
else if (butno == 1)
MotorControl(eMotList.Center, eMotControl.Down);
else if (butno == 2)
MotorControl(eMotList.Right, eMotControl.Down);
}
private void button11_Click(object sender, EventArgs e)
{
}
private void button12_Click(object sender, EventArgs e)
{
var but = sender as Button;
var butno = int.Parse(but.Tag.ToString());
if (butno == 0)
MotorControl(eMotList.Left, eMotControl.Stop);
else if (butno == 1)
MotorControl(eMotList.Center, eMotControl.Stop);
else if (butno == 2)
MotorControl(eMotList.Right, eMotControl.Stop);
}
private void button13_Click(object sender, EventArgs e)
{
var dlg =UTIL.MsgQ("Do you want to exit the program?\nThis is a program that monitors I/O malfunction.It is recommended to run at all times");
if (dlg != DialogResult.Yes) return;
this.exitforce = true;
this.Close();
}
}
}

126
Handler/swPLC/Form1.resx Normal file
View File

@@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>104, 17</value>
</metadata>
</root>

26
Handler/swPLC/PUB.cs Normal file
View File

@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.PerformanceData;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Project
{
public static class PUB
{
private static CSetting setting;
public static CSetting Setting
{
get
{
if(setting == null)
{
setting = new CSetting();
setting.Load();
}
return setting;
}
}
}
}

88
Handler/swPLC/Program.cs Normal file
View File

@@ -0,0 +1,88 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
namespace Project
{
internal static class Program
{
/// <summary>
/// 해당 애플리케이션의 주 진입점입니다.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
if (CheckSingleInstance(false) == false) return;
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
/// <summary>
/// 중복실행 방지 체크
/// </summary>
/// <returns>단일 인스턴스인 경우 true, 중복실행인 경우 false</returns>
static bool CheckSingleInstance(bool prompt = true)
{
string processName = Process.GetCurrentProcess().ProcessName;
Process[] processes = Process.GetProcessesByName(processName);
if (processes.Length > 1)
{
if (prompt == false) return false;
// 중복실행 감지
string message = $"⚠️ {Application.ProductName} 프로그램이 이미 실행 중입니다!\n\n" +
"동시에 여러 개의 프로그램을 실행할 수 없습니다.\n\n" +
"해결방법을 선택하세요:";
var result = MessageBox.Show(message + "\n\n예(Y): 기존 프로그램을 종료하고 새로 시작\n아니오(N): 현재 실행을 취소",
"중복실행 감지",
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning);
if (result == DialogResult.Yes)
{
// 기존 프로세스들을 종료
try
{
int currentProcessId = Process.GetCurrentProcess().Id;
foreach (Process process in processes)
{
if (process.Id != currentProcessId)
{
process.Kill();
process.WaitForExit(3000); // 3초 대기
}
}
// 잠시 대기 후 계속 진행
Thread.Sleep(1000);
return true;
}
catch (Exception ex)
{
MessageBox.Show($"기존 프로그램 종료 중 오류가 발생했습니다:\n{ex.Message}\n\n" +
"작업관리자에서 수동으로 종료해주세요.",
"오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
}
else
{
// 현재 실행을 취소
return false;
}
}
return true; // 단일 인스턴스
}
}
}

View File

@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해
// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면
// 이러한 특성 값을 변경하세요.
[assembly: AssemblyTitle("Sofware PLC")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("ATK")]
[assembly: AssemblyProduct("swPLC")]
[assembly: AssemblyCopyright("Copyright © ATK 2023")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에
// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면
// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요.
[assembly: ComVisible(false)]
// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다.
[assembly: Guid("efe600a7-d7b3-4d0a-a6a5-e95032733d11")]
// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다.
//
// 주 버전
// 부 버전
// 빌드 번호
// 수정 버전
//
// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를
// 기본값으로 할 수 있습니다.
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("23.07.24.0000")]
[assembly: AssemblyFileVersion("23.07.24.0000")]

View File

@@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Project.Properties {
using System;
/// <summary>
/// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다.
/// </summary>
// 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder
// 클래스에서 자동으로 생성되었습니다.
// 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을
// 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Project.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을
/// 재정의합니다.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View File

@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Project.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.6.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

1
Handler/swPLC/README.md Normal file
View File

@@ -0,0 +1 @@
# swPLC

3
Handler/swPLC/app.config Normal file
View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/></startup></configuration>

28
Handler/swPLC/enumData.cs Normal file
View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Project
{
public enum eSMStep
{
IDLE,
RUN,
}
public enum eMotList
{
Left=0,
Center,
Right,
}
public enum eMotControl
{
Stop,
Down,
Up,
}
}

View File

@@ -0,0 +1 @@
claude --dangerously-skip-permissions

111
Handler/swPLC/swPLC.csproj Normal file
View File

@@ -0,0 +1,111 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>Project</RootNamespace>
<AssemblyName>SoftwarePLC</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\..\..\STDLabelAttach%28ATV%29\swPLC\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="arCommUtil">
<HintPath>..\DLL\arCommUtil.dll</HintPath>
</Reference>
<Reference Include="arControl.Net4, Version=18.7.27.1500, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\DLL\arControl.Net4.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="CSetting.cs" />
<Compile Include="enumData.cs" />
<Compile Include="Form1.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="PUB.cs" />
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="app.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Sub\arAjinextek\Library\arAjinextek_Union\arAjinextek_Union.csproj">
<Project>{62370293-92aa-4b73-b61f-5c343eeb4ded}</Project>
<Name>arAjinextek_Union</Name>
</ProjectReference>
<ProjectReference Include="..\Sub\CommData\CommData.csproj">
<Project>{14e8c9a5-013e-49ba-b435-efefc77dd623}</Project>
<Name>CommData</Name>
</ProjectReference>
<ProjectReference Include="..\Sub\CommSM\arCommSM.csproj">
<Project>{d54444f7-1d85-4d5d-b1d1-10d040141a91}</Project>
<Name>arCommSM</Name>
</ProjectReference>
<ProjectReference Include="..\Sub\MemoryMapCore\MemoryMapCore.csproj">
<Project>{140af52a-5986-4413-bf02-8ea55a61891b}</Project>
<Name>MemoryMapCore</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

78
Handler/swPLC/swPLC.sln Normal file
View File

@@ -0,0 +1,78 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Express 15 for Windows Desktop
VisualStudioVersion = 15.0.28307.1000
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "swPLC", "swPLC.csproj", "{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "arCommSM", "..\Sub\CommSM\arCommSM.csproj", "{D54444F7-1D85-4D5D-B1D1-10D040141A91}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommData", "..\Sub\CommData\CommData.csproj", "{14E8C9A5-013E-49BA-B435-EFEFC77DD623}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Import", "Import", "{946678A3-F25F-44B8-82E7-2E8437C6B33D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MemoryMapCore", "..\Sub\MemoryMapCore\MemoryMapCore.csproj", "{140AF52A-5986-4413-BF02-8EA55A61891B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "arAjinextek_Union", "..\Sub\arAjinextek\Library\arAjinextek_Union\arAjinextek_Union.csproj", "{62370293-92AA-4B73-B61F-5C343EEB4DED}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}.Debug|x86.ActiveCfg = Debug|Any CPU
{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}.Debug|x86.Build.0 = Debug|Any CPU
{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}.Release|Any CPU.Build.0 = Release|Any CPU
{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}.Release|x86.ActiveCfg = Release|Any CPU
{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}.Release|x86.Build.0 = Release|Any CPU
{D54444F7-1D85-4D5D-B1D1-10D040141A91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D54444F7-1D85-4D5D-B1D1-10D040141A91}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D54444F7-1D85-4D5D-B1D1-10D040141A91}.Debug|x86.ActiveCfg = Debug|Any CPU
{D54444F7-1D85-4D5D-B1D1-10D040141A91}.Debug|x86.Build.0 = Debug|Any CPU
{D54444F7-1D85-4D5D-B1D1-10D040141A91}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D54444F7-1D85-4D5D-B1D1-10D040141A91}.Release|Any CPU.Build.0 = Release|Any CPU
{D54444F7-1D85-4D5D-B1D1-10D040141A91}.Release|x86.ActiveCfg = Release|Any CPU
{D54444F7-1D85-4D5D-B1D1-10D040141A91}.Release|x86.Build.0 = Release|Any CPU
{14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Debug|Any CPU.Build.0 = Debug|Any CPU
{14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Debug|x86.ActiveCfg = Debug|Any CPU
{14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Debug|x86.Build.0 = Debug|Any CPU
{14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Release|Any CPU.ActiveCfg = Release|Any CPU
{14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Release|Any CPU.Build.0 = Release|Any CPU
{14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Release|x86.ActiveCfg = Release|Any CPU
{14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Release|x86.Build.0 = Release|Any CPU
{140AF52A-5986-4413-BF02-8EA55A61891B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{140AF52A-5986-4413-BF02-8EA55A61891B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{140AF52A-5986-4413-BF02-8EA55A61891B}.Debug|x86.ActiveCfg = Debug|Any CPU
{140AF52A-5986-4413-BF02-8EA55A61891B}.Debug|x86.Build.0 = Debug|Any CPU
{140AF52A-5986-4413-BF02-8EA55A61891B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{140AF52A-5986-4413-BF02-8EA55A61891B}.Release|Any CPU.Build.0 = Release|Any CPU
{140AF52A-5986-4413-BF02-8EA55A61891B}.Release|x86.ActiveCfg = Release|Any CPU
{140AF52A-5986-4413-BF02-8EA55A61891B}.Release|x86.Build.0 = Release|Any CPU
{62370293-92AA-4B73-B61F-5C343EEB4DED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{62370293-92AA-4B73-B61F-5C343EEB4DED}.Debug|Any CPU.Build.0 = Debug|Any CPU
{62370293-92AA-4B73-B61F-5C343EEB4DED}.Debug|x86.ActiveCfg = Debug|x86
{62370293-92AA-4B73-B61F-5C343EEB4DED}.Debug|x86.Build.0 = Debug|x86
{62370293-92AA-4B73-B61F-5C343EEB4DED}.Release|Any CPU.ActiveCfg = Release|Any CPU
{62370293-92AA-4B73-B61F-5C343EEB4DED}.Release|Any CPU.Build.0 = Release|Any CPU
{62370293-92AA-4B73-B61F-5C343EEB4DED}.Release|x86.ActiveCfg = Release|x86
{62370293-92AA-4B73-B61F-5C343EEB4DED}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{D54444F7-1D85-4D5D-B1D1-10D040141A91} = {946678A3-F25F-44B8-82E7-2E8437C6B33D}
{140AF52A-5986-4413-BF02-8EA55A61891B} = {946678A3-F25F-44B8-82E7-2E8437C6B33D}
{62370293-92AA-4B73-B61F-5C343EEB4DED} = {946678A3-F25F-44B8-82E7-2E8437C6B33D}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {A1453016-E3CB-4CF9-97A2-94AAAAD23E11}
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
namespace UIControl
{
public class CIcon
{
public string Text { get; set; }
public string Tag { get; set; }
public RectangleF Rect { get; set; }
public Boolean Focus { get; set; }
public Boolean Select { get; set; }
public CIcon() : this(string.Empty, RectangleF.Empty) { }
public CIcon(string tag,RectangleF rect)
{
Text = string.Empty;
Tag = tag;
Rect = rect;
}
public float X { get { return Rect.X; } }
public float Y { get { return Rect.Y; } }
public float W { get { return Rect.Width; } }
public float H { get { return Rect.Height; } }
}
}

View File

@@ -0,0 +1,208 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
namespace UIControl
{
[Serializable]
public class CItem
{
public Boolean Active { get; set; }
public Boolean PLCWriteNo { get; set; }
public Boolean PLCWriteSize { get; set; }
public Boolean Delete { get; set; }
/// <summary>
/// 어떠한 포트에서 픽업 되었는지
/// </summary>
public int iPort { get; set; }
/// <summary>
/// 출력 포트
/// </summary>
public int oPort { get; set; }
public Boolean ExistError { get; set; }
/// <summary>
/// 배출여부
/// </summary>
public int ErrorOut { get; set; }
/// <summary>
/// 크기는 어떠한지(7 or 13)
/// </summary>
public string Size { get; set; }
/// <summary>
/// 존번호 0~10
/// </summary>
public int ZoneIndex { get; set; }
/// <summary>
/// 피커에의해서 드랍된 시간
/// </summary>
public DateTime DropTime { get; set; }
/// <summary>
/// 차수별 일련번호
/// </summary>
public UInt16 Seq { get; set; }
public DateTime BarcodeStart { get; set; }
public DateTime BarcodeEnd { get; set; }
/// <summary>
/// 바코드 처리가 완료디었는가?
/// 종료일자가 설정되면 처리완료로 합니다.
/// 201028
/// </summary>
public Boolean BarcodeProcess
{
get
{
if (BarcodeEnd.Year == 1982) return false;
else if (BarcodeEnd <= BarcodeStart) return false;
else return true;
}
}
public DateTime PlcStartTime { get; set; }
public DateTime PlcEndTime { get; set; }
public DateTime ZoneIntime { get; set; }
/// <summary>
/// 컨베이어에 들어온 시간
/// 피커에서 드랍되면 dropTime 과 동일하며, 외부에서 들어오면 센서가 최초 감지한 시간이 된다
/// </summary>
public DateTime InTime { get; set; }
public DateTime OutTime { get; set; }
public Rectangle Rect { get; set; }
/// <summary>
/// jobhistory에 연결되는 데이터 키
/// </summary>
public string JGUID { get; set; }
/// <summary>
/// 바코드 데이터와 연결되는 키값
/// </summary>
public string BGUID { get; set; }
public string RID { get; set; }
public string SID { get; set; }
public string VLOT { get; set; }
public string BarcodeRaw { get; set; }
public string BarcodeMsg { get; set; }
public Boolean Processing { get; set; }
public Boolean Complete { get; set; }
public string GUID { get; private set; }
public int Qty { get; set; }
public int QtyAcc { get; set; }
public int QtyMax { get; set; }
public List<string> UnloaderMsg { get; set; }
/// <summary>
/// 바코드의 완료여부, timeout 혻은 설정 되었을때 적용
/// </summary>
public Boolean BarcodeDone { get; set; }
public Boolean hasBarcode
{
get
{
return !string.IsNullOrEmpty(RID);
}
}
/// <summary>
/// 지정한 문자가 포함되어잇다면 true 반환
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public Boolean CheckMessage(string msg)
{
if (UnloaderMsg == null || UnloaderMsg.Count < 1) return false;
foreach (var item in UnloaderMsg)
if (item.Contains(msg)) return true;
return false;
}
public void AddMessage(string msg)
{
if (this.UnloaderMsg.Contains(msg) == false)
UnloaderMsg.Add(msg);
}
public void ClearMessage()
{
this.UnloaderMsg.Clear();
}
public CItem()
{
ExistError = false;
Active = true;
Complete = false;
PLCWriteNo = false;
PLCWriteSize = false;
Qty = 0;
QtyAcc = 0; //200913 누계
QtyMax = 0; //200913 최대값
UnloaderMsg = new List<string>();
ErrorOut = 0;
this.GUID = Guid.NewGuid().ToString();
BGUID = string.Empty;
JGUID = string.Empty;
VLOT = string.Empty;
Seq = 0;
SID = string.Empty;
BarcodeRaw = string.Empty;
BarcodeMsg = string.Empty;
RID = string.Empty;
Rect = Rectangle.Empty;
Delete = false;
Processing = false;
DropTime = DateTime.Parse("1982-11-23");
BarcodeStart = DateTime.Parse("1982-11-23");
BarcodeEnd = DateTime.Parse("1982-11-23");
PlcStartTime = DateTime.Parse("1982-11-23");
PlcEndTime = DateTime.Parse("1982-11-23");
InTime = DateTime.Parse("1982-11-23");
OutTime = DateTime.Parse("1982-11-23");
ZoneIntime = DateTime.Parse("1982-11-23");
ZoneIndex = -1;
oPort = -1;
iPort = -1;
Size = string.Empty;
}
public CItem Clone()
{
var item = new CItem();
item.Qty = Qty;
item.Seq = Seq;//0;
item.SID = SID;// string.Empty;
item.VLOT = VLOT;
item.BarcodeRaw = BarcodeRaw;//string.Empty;
item.BarcodeMsg = BarcodeMsg;//string.Empty;
item.RID = RID;//string.Empty;
item.Rect = Rect;//Rectangle.Empty;
item.Delete = Delete;//DropTime;//;
item.ExistError = ExistError;
item.DropTime = DropTime;// DateTime.Parse("1982-11-23");
item.BarcodeStart = BarcodeStart;// DateTime.Parse("1982-11-23");
item.BarcodeEnd = BarcodeEnd;//DropTime;//.Parse("1982-11-23");
item.PlcStartTime = PlcStartTime;//DateTime.Parse("1982-11-23");
item.PlcEndTime = PlcEndTime;// DateTime.Parse("1982-11-23");
item.InTime = InTime;//DropTime;//.Parse("1982-11-23");
item.OutTime = OutTime;//DateTime.Parse("1982-11-23");
item.ZoneIntime = ZoneIntime;//DateTime.Parse("1982-11-23");
item.ZoneIndex = ZoneIndex;
item.oPort = oPort;
item.iPort = iPort;
item.Size = Size;
return item;
}
}
}

View File

@@ -0,0 +1,84 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace UIControl
{
[Serializable]
public class CMenuButton
{
public eButtonType Shape { get; set; }
public string Text { get; set; }
public string Tag { get; set; }
public Rectangle Rect { get; set; }
public Color BackColor { get; set; }
public Color ForeColor { get; set; }
public Color OverColor { get; set; }
public Color BorderColor { get; set; }
public byte BorderSize { get; set; }
public Font Font { get; set; }
public CMenuButton() : this(string.Empty, string.Empty) { }
public CMenuButton(string text, string tag)
{
Font = null;
BorderColor = Color.Black;
BorderSize = 5;
Shape = eButtonType.Rectangle;
this.Text = text;
this.Tag = tag;
BackColor = Color.White;
OverColor = Color.Gold;
ForeColor = Color.Black;
text = "Button";
}
public string menutag { get; set; }
}
[Serializable]
public class CMenu
{
public string Title { get; set; }
public string Text { get; set; }
public string Tag { get; set; }
public RectangleF Rect { get; set; }
public Boolean Focus { get; set; }
public Boolean Select { get; set; }
public eMsgIcon Icon { get; set; }
public CMenuButton[] buttons { get; set; }
public Font Font { get; set; }
public Color BackColor { get; set; }
public Color ForeColor { get; set; }
public Color BorderColor { get; set; }
/// <summary>
/// 반드시 사용자의 허가를 받아야 넘어갈 수 있는 메뉴
/// </summary>
public Boolean RequireInput { get; set; }
public CMenu() : this("Contents", "Title", "tag", eMsgIcon.Info, null) { }
public CMenu(string text_, string title_, string tag_, eMsgIcon icon_, params CMenuButton[] buttons_)
{
this.Tag = tag_;
this.Title = title_;
this.Text = text_;
this.Icon = icon_;
this.buttons = buttons_;
this.Font = new Font("맑은 고딕", 15, FontStyle.Bold);
BackColor = Color.White;
ForeColor = Color.Black;
BorderColor = Color.Orange;
RequireInput = false;
}
public float X { get { return Rect.X; } }
public float Y { get { return Rect.Y; } }
public float W { get { return Rect.Width; } }
public float H { get { return Rect.Height; } }
}
}

View File

@@ -0,0 +1,86 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
namespace UIControl
{
public class CPicker
{
/// <summary>
/// 릴의 크기가 들어있음 (7 or 13)
/// </summary>
public string ReelSize { get; set; }
/// <summary>
/// 릴이 있는 경우 해당 릴이 어느 포트에서 왔는지의 번호
/// </summary>
public short PortIndex { get; set; }
/// <summary>
/// 현재 작업이 프론트 포트의 작업인가? (portindex 값을 가지고 판단함)
/// </summary>
public Boolean isFrontJob
{
get
{
if (PortIndex <= 1) return true;
else return false;
}
}
public Boolean Overload { get; set; }
/// <summary>
/// VAC센서의 값을 가지고 있음, 현재 릴이 감지되었는가?
/// </summary>
public Boolean isReelDetect
{
get
{
return VacDetect.Where(t => t == true).Count() > 0;
}
}
/// <summary>
/// PICK후 60mm위치에서 미리 확인한 감지 상태값
/// 이값을 가지고 도중에 떨궜을 상황을 감지한다
/// </summary>
public Boolean PreCheckItemOn { get; set; }
public Boolean HasRealItemOn { get; set; }
public Boolean ItemOn { get; set; }
public Boolean[] VacDetect { get; set; }
public Boolean[] VacOutput { get; set; }
public CPicker()
{
this.Overload = false;
ReelSize = "7";
PortIndex = -1;
HasRealItemOn = false;
PreCheckItemOn = false;
}
public void Clear()
{
this.Overload = false;
ItemOn = false;
ReelSize = "--";
PortIndex = -1;
if(VacDetect != null && VacDetect.Length > 0)
{
for (int i = 0; i < VacDetect.Length; i++)
VacDetect[i] = false;
}
if (VacOutput != null && VacOutput.Length > 0)
{
for (int i = 0; i < VacOutput.Length; i++)
VacOutput[i] = false;
}
}
}
}

View File

@@ -0,0 +1,334 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
namespace UIControl
{
public class CPort
{
public Boolean Safty1Err { get; set; }
public Boolean Safty2Err { get; set; }
public Boolean SaftyErr { get { return Safty1Err || Safty2Err; } }
public Boolean MotorRun { get; set; }
public Boolean MotorDir { get; set; }
public int arrowIndex { get; set; }
public Boolean LimitUpper { get; set; }
public Boolean LimitLower { get; set; }
public Boolean OverLoad
{
get
{
return LimitLower && DetectUp;
}
}
public byte AlignOK { get; set; }
public Boolean Ready { get; set; }
public Boolean DetectUp { get; set; } //상단에 있는 자재 감지 센서
public Boolean DetectDn { get; set; } //하단에 있는 자재 감지 센서
// public List<CItem> Items { get; set; }
/// <summary>
/// 7인치 13인치의 크기 정보를 표시한다
/// </summary>
public string title { get; set; }
public int reelNo { get; set; }
/// <summary>
/// 차수별 릴 작업 수량이 표시됨
/// </summary>
public int reelCount { get; set; }
public int errorCount { get; set; }
public System.Drawing.Color bgColor { get; set; }
private Boolean _enable = false;
public Color fgColor { get; set; }
public Color fgColorCount { get; set; }
public Rectangle rect_title { get; set; }
public RectangleF Rect { get; set; }
public Rectangle rect_count { get; set; }
public int AnimationStepPort { get; set; }
/// <summary>
/// 0:notcart , 1:ready, 2:full
/// </summary>
public ushort State { get; set; }
public Boolean Enable
{
get { return _enable; }
set
{
_enable = value;
this.bgColor = value ? Color.Lime : Color.FromArgb(43, 43, 43);
this.fgColor = value ? Color.White : Color.DimGray;
}
}
public CPort()
{
Ready = false;
Enable = false;
rect_title = Rectangle.Empty;
rect_count = Rectangle.Empty;
Rect = RectangleF.Empty;
reelNo = -1;
arrowIndex = 2;
reelCount = 0;
fgColor = Color.Black;
Clear();
AlignOK = 0;
AnimationStepPort = 9;
//Items.Clear();
}
//public void ClearItem()
//{
// Items.Clear();
//}
public void Clear()
{
Enable = true;
Safty1Err = false;
Safty2Err = false;
MotorRun = false;
MotorDir = false;
LimitUpper = false;
LimitLower = false;
reelNo = 0;
reelCount = 0;
DetectUp = false;
DetectDn = false;
}
public void Display(Graphics g, Font fCnt, Font fMsg, Boolean InputMode,Boolean InputActive)
{
if (Enable == false)
{
g.DrawLine(Pens.DimGray, Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
g.DrawLine(Pens.DimGray, Rect.Right, Rect.Top, Rect.Left, Rect.Bottom);
}
//모터사용시 화살표
eDirection DirL = MotorDir == false ? eDirection.TopToBottom : eDirection.BottomToTop;
if (MotorRun) UIControl.Common.Draw_Arrow(g, Rect, DirL, arrowIndex, AnimationStepPort, Color.Gold, fMsg);
//글자표시 (크기 및 작업 수량)
var sf = new StringFormat
{
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center,
};
//리밋영역표시(상/하)
var limitSizeH = (int)(Rect.Height * 0.2);
if (OverLoad == true)//과적
{
g.FillRectangle(Brushes.Red, Rect);
if (InputMode)
{
using (Font f = new Font("맑은 고딕", 20, FontStyle.Bold))
{
g.DrawString("적재초과",
f,
new SolidBrush(fgColor), Rect, sf);
}
}
else
{
g.DrawString("OVER\nLOAD", fMsg, new SolidBrush(fgColor), Rect, sf);
}
}
else
{
//입력모드에서는 별도 처리를 한다
if (InputMode)
{
if(InputActive)
{
using (Font f = new Font("맑은 고딕", 20, FontStyle.Bold))
{
var msg = "투입준비";
g.FillRectangle(new SolidBrush(Color.FromArgb(100, Color.Black)), Rect);
g.DrawString(msg, f, new SolidBrush(fgColor), Rect, sf);
}
}
else
{
using (Font f = new Font("맑은 고딕", 20, FontStyle.Bold))
{
var msg = "--";
g.FillRectangle(new SolidBrush(Color.FromArgb(100, Color.Black)), Rect);
g.DrawString(msg, f, new SolidBrush(fgColor), Rect, sf);
}
}
}
else
{
if (errorCount > 5)
{
g.FillRectangle(new SolidBrush(Color.FromArgb(250, Color.Gold)), Rect);
}
else
{
g.FillRectangle(new SolidBrush(Color.FromArgb(150, Color.Black)), Rect);
}
if (errorCount > 0)
{
if (errorCount > 05)
{
g.DrawString(reelCount.ToString() + "\n(ERROR)", fCnt, new SolidBrush(Color.Red), Rect, sf);
}
else g.DrawString(reelCount.ToString() + "\nE:" + errorCount.ToString(), fCnt, new SolidBrush(Color.Red), Rect, sf);
}
else
{
g.DrawString(reelCount.ToString(), fCnt, new SolidBrush(fgColor), Rect, sf);
}
}
}
//데두리표시 ( 비활성 회색, 활성 감지 : 라임, 미감지 흰색)
Color borderL = Enable ? (LimitUpper ? Color.Red : (LimitLower ? Color.Blue : (DetectUp ? Color.Lime : Color.White))) : Color.DimGray;
if (OverLoad) borderL = Color.White;
int bordersize = (InputMode ? 10 : 7);//ortL.enable ? 7 : 1;
if (OverLoad == false)
{
var fontsize = InputMode ? 9 : 9;
using (Font fnt = new Font("Consolas", fontsize, FontStyle.Bold))
{
//상단 리밋은 상단에
if (LimitUpper)
{
var msgLU = "+ LIMIT";
var fsize = g.MeasureString(msgLU, fnt);
var msgW = fsize.Width * 1.5f;
var msgH = fsize.Height * 1.5f;
if (msgW > this.Rect.Width * 0.70f) msgW = this.Rect.Width * 0.7f;
var RectMsgL = new RectangleF(
Rect.Left + (Rect.Width - msgW) / 2.0f,
Rect.Top - msgH - bordersize / 2.0f + 1,
msgW, msgH);
g.FillRectangle(new SolidBrush(Color.FromArgb(250, Color.Red)), RectMsgL);
// g.DrawRectangle(Pens.Black, RectMsgL);
g.DrawString(msgLU, fnt, Color.White, RectMsgL);
}
//아이템 감지신호는 상단 아래쪽으로
if (Ready)
{
var msgLU = "PORT READY";
var fsize = g.MeasureString(msgLU, fnt);
var msgW = fsize.Width * 1.5f;
var msgH = fsize.Height * 1.5f;
if (msgW > this.Rect.Width * 0.70f) msgW = this.Rect.Width * 0.7f;
var RectMsgL = new RectangleF(
Rect.Left + (Rect.Width - msgW) / 2.0f,
Rect.Top + bordersize / 2.0f - 1,
msgW, msgH);
g.FillRectangle(new SolidBrush(Color.FromArgb(250, Color.Lime)), RectMsgL);
// g.DrawRectangle(Pens.Black, RectMsgL);
g.DrawString(msgLU, fnt, Color.Black, RectMsgL);
}
//하단 리밋은 하단에표시
if (LimitLower)
{
var msgLU = "- LIMIT";
var fsize = g.MeasureString(msgLU, fnt);
var msgW = fsize.Width * 1.5f;
var msgH = fsize.Height * 1.5f;
if (msgW > this.Rect.Width * 0.70f) msgW = this.Rect.Width * 0.7f;
var RectMsgL = new RectangleF(
Rect.Left + (Rect.Width - msgW) / 2.0f,
Rect.Bottom + bordersize / 2.0f - 1,
msgW, msgH);
g.FillRectangle(new SolidBrush(Color.FromArgb(250, Color.Blue)), RectMsgL);
//g.DrawString(msgLU, fnt, Brushes.White, RectMsgL, sf);
g.DrawString(msgLU, fnt, Color.White, RectMsgL);
}
//아이템 감지
if (DetectUp)
{
var msgLU = "ITEM DETECT";
var fsize = g.MeasureString(msgLU, fnt);
var msgW = fsize.Width * 1.5f;
var msgH = fsize.Height * 1.5f;
if (msgW > this.Rect.Width * 0.70f) msgW = this.Rect.Width * 0.7f;
var RectMsgL = new RectangleF(
Rect.Left + (Rect.Width - msgW) / 2.0f,
Rect.Bottom - msgH - bordersize / 2.0f + 1,
msgW, msgH);
g.FillRectangle(new SolidBrush(Color.FromArgb(250, Color.Lime)), RectMsgL);
//g.DrawRectangle(Pens.Black, RectMsgL);
g.DrawString(msgLU, fnt, Color.Black, RectMsgL);
}
//안전 오류는 중앙에
if (SaftyErr && InputMode == false)
{
var msgS = "SAFTY ERROR";
var fsize = g.MeasureString(msgS, fMsg);
var msgW = fsize.Width * 1.5f;
var msgH = fsize.Height * 1.5f;
if (msgW > this.Rect.Width * 0.80f) msgW = this.Rect.Width * 0.8f;
var RectMsgL = new RectangleF(
Rect.Left + (Rect.Width - msgW) / 2.0f,
Rect.Top + (Rect.Height - msgH) / 2.0f,
msgW, msgH);
g.FillRectangle(new SolidBrush(Color.FromArgb(240, Color.Khaki)), RectMsgL);
g.DrawRectangle(Pens.Black, RectMsgL);
g.DrawString(msgS, fMsg, Color.Maroon, RectMsgL);
}
}
}
//테두리가 리밋영역을 감추도록 그린다
g.DrawRectangle(new Pen(borderL, bordersize), Rect.Left, Rect.Top, Rect.Width, Rect.Height);
sf.Dispose();
}
}
}

View File

@@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UIControl
{
public partial class Unloader
{
public class CPortData
{
/// <summary>
/// sid
/// </summary>
public string sid { get; set; }
/// <summary>
/// 현재진행된 수량
/// </summary>
public int qty { get; set; }
public string towername { get; set; }
/// <summary>
/// 전체기준수량
/// </summary>
public int kpc { get; set; }
public CPortData(string sid, int qty, int kpc,string tower_)
{
this.sid = sid;
this.qty = qty;
this.kpc = kpc;
this.Active = true;
this.towername = tower_;
}
public CPortData(string sid,string towr) : this(sid, 0, 0,towr) { }
public Boolean Active { get; set; }
}
}
}

View File

@@ -0,0 +1,73 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
namespace UIControl
{
public partial class Unloader
{
public class CPort
{
public int SortKey { get; set; }
public int portNo { get; set; }
public string portName { get; set; }
public int idx { get; set; }
[Browsable(false)]
public Rectangle rect_title { get; set; }
[Browsable(false)]
public Rectangle rect { get; set; }
[Browsable(false)]
public Rectangle rect_count { get; set; }
[Browsable(false)]
public Rectangle rect_signL { get; set; }
[Browsable(false)]
public Rectangle rect_signR { get; set; }
public List<CPortData> reelSID;
public int cartSize { get; set; }
public ushort cartState { get; set; }
public Boolean SIDUpdate { get; set; }
/// <summary>
/// 이값은 PLC에서 읽은 값이다
/// </summary>
public int reelCount { get; set; }
public int reelCountPLC { get; set; }
public string Mode { get; set; }
public CPort()
{
SortKey = 0;
idx = -1;
Mode = "AUTO";// ePortMode.Auto;
rect_title = Rectangle.Empty;
rect = Rectangle.Empty;
rect_count = Rectangle.Empty;
rect_signL = Rectangle.Empty;
rect_signR = Rectangle.Empty;
reelSID = new List<CPortData>();
cartSize = 0;
cartState = 0;
Clear();
SIDUpdate = true;
}
public void Clear()
{
reelSID.Clear();// = new string[0];// string.Empty;
reelCount = 0;
reelCountPLC = 0;
//기존에 있었는데 지웠다면 업데이트해야함
if (reelSID.Count > 0) SIDUpdate = true;
}
}
}
}

View File

@@ -0,0 +1,126 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
namespace UIControl
{
public static class Common
{
public static void Draw_Arrow(Graphics g, RectangleF rect, eDirection dir, int arrowindex, int animstep, Color basecolor,Font f )
{
//컨베어 RUN 표시기 표시
var paddingX = rect.Height * 0.15f; //상하단에 이만큼의 여백을 준다
var paddingY = rect.Height * 0.15f;
var sigHeight = rect.Height - (paddingX * 2.0f);
var sigWidth = rect.Width / animstep;
if (dir == eDirection.BottomToTop || dir == eDirection.TopToBottom)
{
paddingX = rect.Width * 0.15f;
paddingY = rect.Height / 10.0f;
sigWidth = rect.Width - (paddingX * 2.0f);
sigHeight = rect.Height / 4.5f;
}
List<PointF> pts = new List<PointF>();
//사각영역을 표시해준다.
//if (dir == eDirection.LeftToRight || dir == eDirection.RightToLeft)
//{
// var rect2width = rect.Width / animstep;
// for (int i = 0; i < animstep; i++)
// {
// var rect2 = new RectangleF(rect.X + i * rect2width, rect.Y, rect2width, rect.Height);
// g.DrawRectangle(new Pen(Color.FromArgb(100, Color.Gray)), rect2.Left, rect2.Top, rect2.Width, rect2.Height);
// g.DrawString(i.ToString(), this.Font, Brushes.White, rect2.Left, rect2.Top);
// }
//}
//else
//{
// var rect2width = rect.Height / animstep;
// for (int i = 0; i < animstep; i++)
// {
// var rect2 = new RectangleF(rect.X, rect.Y + i * rect2width, rect.Width, rect2width);
// g.DrawRectangle(new Pen(Color.FromArgb(100, Color.Gray)), rect2.Left, rect2.Top, rect2.Width, rect2.Height);
// g.DrawString(i.ToString(), this.Font, Brushes.White, rect2.Left, rect2.Top);
// }
//}
var bX = rect.X + paddingX;
var bY = rect.Y + paddingY;
if (dir == eDirection.LeftToRight)
{
var gridSize = rect.Width / animstep;
pts.Add(new PointF(rect.X + paddingX + (arrowindex * sigWidth), rect.Y + paddingX));
pts.Add(new PointF(rect.X + paddingX + (arrowindex * sigWidth) + sigWidth, rect.Y + paddingX));
pts.Add(new PointF(rect.X + paddingX + (arrowindex * sigWidth) + sigWidth * 2.0f, rect.Y + paddingX + sigHeight / 2.0f));
pts.Add(new PointF(rect.X + paddingX + (arrowindex * sigWidth) + sigWidth, rect.Y + paddingX + sigHeight));
pts.Add(new PointF(rect.X + paddingX + (arrowindex * sigWidth), rect.Y + paddingX + sigHeight));
pts.Add(new PointF(rect.X + paddingX + (arrowindex * sigWidth) + sigWidth, rect.Y + paddingX + sigHeight / 2.0f));
}
else if (dir == eDirection.RightToLeft)
{
var gridSize = rect.Width / animstep;
paddingY = rect.Height * 0.1f; //상,하 여백을 10%크기로 한다
sigHeight = rect.Height - paddingY * 2.0f;
bX = rect.X + ((animstep - 1) - arrowindex) * gridSize;
bY = rect.Y + paddingY;
pts.Add(new PointF(bX, bY));
pts.Add(new PointF(bX - gridSize, bY + sigHeight / 2.0f));
pts.Add(new PointF(bX, bY + sigHeight));
pts.Add(new PointF(bX + gridSize, bY + sigHeight));
pts.Add(new PointF(bX, bY + sigHeight / 2.0f));
pts.Add(new PointF(bX + gridSize, bY));
}
else if (dir == eDirection.TopToBottom)
{
var gridSize = rect.Height / animstep;
paddingX = rect.Width * 0.2f; //상,하 여백을 10%크기로 한다
sigWidth = rect.Width - paddingX * 2.0f;
bX = rect.X + paddingX;
bY = rect.Y + (arrowindex + 1) * gridSize;
pts.Add(new PointF(bX, bY));
pts.Add(new PointF(bX + (sigWidth / 2.0f), bY + gridSize));
pts.Add(new PointF(bX + sigWidth, bY));
pts.Add(new PointF(bX + sigWidth, bY - gridSize));
pts.Add(new PointF(bX + (sigWidth / 2.0f), bY));
pts.Add(new PointF(bX, bY - gridSize));
}
else if (dir == eDirection.BottomToTop)
{
var gridSize = rect.Height / animstep;
paddingX = rect.Width * 0.2f; //상,하 여백을 10%크기로 한다
sigWidth = rect.Width - paddingX * 2.0f;
bX = rect.X + paddingX;
bY = rect.Y + ((animstep - 1) - arrowindex) * gridSize;
pts.Add(new PointF(bX, bY));
pts.Add(new PointF(bX + (sigWidth / 2.0f), bY - gridSize));
pts.Add(new PointF(bX + sigWidth, bY));
pts.Add(new PointF(bX + sigWidth, bY + gridSize));
pts.Add(new PointF(bX + (sigWidth / 2.0f), bY));
pts.Add(new PointF(bX, bY + gridSize));
}
if (pts.Count > 0)
{
g.FillPolygon(new SolidBrush(Color.FromArgb(10, basecolor)), pts.ToArray());
g.DrawPolygon(new Pen(Color.FromArgb(100, basecolor)), pts.ToArray());
}
//g.DrawString(arrowindex.ToString(), f, Brushes.Yellow, rect.Left, rect.Top - 20);
}
}
}

View File

@@ -0,0 +1,41 @@
namespace UIControl
{
partial class CtlMotor
{
/// <summary>
/// 필수 디자이너 변수입니다.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 사용 중인 모든 리소스를 정리합니다.
/// </summary>
/// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마세요.
/// </summary>
private void InitializeComponent()
{
this.SuspendLayout();
//
// CtlMotor
//
this.ResumeLayout(false);
}
#endregion
}
}

View File

@@ -0,0 +1,79 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace UIControl
{
public partial class CtlMotor : Control
{
public int Length { get; set; }
public Boolean Pin_Run { get; set; }
public Boolean Pin_DirCW { get; set; }
public Boolean Pin_Max { get; set; }
public Boolean Pin_Min { get; set; }
[Browsable(true)]
public new string Text { get; set; }
[Browsable(true)]
public new Font Font { get; set; }
public CtlMotor()
{
InitializeComponent();
Length = 100;
this.Size = new Size(80, 80);
this.MaximumSize = new Size(80, 80);
this.MinimumSize = new Size(40, 40);
if (this.Font == null) this.Font = new Font("맑은 고딕", 10);
if (this.Text == null) this.Text = string.Empty;
}
int anim = 0;
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
pe.Graphics.DrawRect(DisplayRectangle, Color.Gray, 2);
var rect = new Rectangle(DisplayRectangle.Left + 2, DisplayRectangle.Top + 2, 10, 10);
var rect2 = new Rectangle(DisplayRectangle.Right - 2 - 10, DisplayRectangle.Top + 2, 10, 10);
if (this.Pin_Run)
{
if (this.Pin_DirCW)
{
if (anim % 2 == 0)
pe.Graphics.FillEllipse(Brushes.Lime, rect2);
else
pe.Graphics.FillEllipse(Brushes.Yellow, rect2);
pe.Graphics.DrawEllipse(Pens.Black, rect2);
}
else
{
if (anim % 2 == 0)
pe.Graphics.FillEllipse(Brushes.Lime, rect);
else
pe.Graphics.FillEllipse(Brushes.Blue, rect);
pe.Graphics.DrawEllipse(Pens.Black, rect);
}
}
else
{
pe.Graphics.FillEllipse(Brushes.Red, rect);
pe.Graphics.DrawEllipse(Pens.Black, rect);
}
if (string.IsNullOrEmpty(Text) == false)
{
pe.Graphics.DrawString(Text,
this.Font,
Brushes.Black,
DisplayRectangle,
new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
}
anim += 1;
}
}
}

View File

@@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
</root>

View File

@@ -0,0 +1,36 @@
namespace UIControl
{
partial class CtlSensor
{
/// <summary>
/// 필수 디자이너 변수입니다.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 사용 중인 모든 리소스를 정리합니다.
/// </summary>
/// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마세요.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}

View File

@@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace UIControl
{
public partial class CtlSensor : Control
{
string text_ = string.Empty;
Font font_ = new Font("맑은 고딕", 10);
[Browsable(true)]
public new string Text { get { return text_; } set { text_ = value; this.Invalidate(); } }
[Browsable(true)]
public new Font Font { get { return font_; } set { font_ = value; this.Invalidate(); } }
public Color ColorOn { get; set; }
public Color ColorOff { get; set; }
public Boolean Value { get; set; }
public CtlSensor()
{
InitializeComponent();
this.MaximumSize = new Size(80, 80);
this.MinimumSize = new Size(40, 40);
this.ColorOn = Color.Lime;
this.ColorOff = Color.DimGray;
//if (this.Font == null) this.Font = new Font("맑은 고딕", 10);
//if (this.Text == null) this.Text = string.Empty;
Value = false;
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
// pe.Graphics.DrawRect( this.DisplayRectangle,Color.Gray,2);
var rect = new Rectangle(this.DisplayRectangle.Left + 1, DisplayRectangle.Top + 1, DisplayRectangle.Width - 2, DisplayRectangle.Height - 2);
if (Value) pe.Graphics.FillEllipse(new SolidBrush(ColorOn), rect);
else pe.Graphics.FillEllipse(new SolidBrush(ColorOff), rect);
pe.Graphics.DrawEllipse(Pens.Black, rect);
if (string.IsNullOrEmpty(Text) == false)
{
pe.Graphics.DrawString(Text,
this.Font,
Brushes.Black,
DisplayRectangle,
new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
}
}
}
}

View File

@@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UIControl
{
public enum eMsgIcon
{
None,
Info,
Alert,
Error,
Help
}
public enum eButtonType
{
Rectangle = 0,
Circle,
}
public enum eDirection
{
LeftToRight,
RightToLeft,
BottomToTop,
TopToBottom
}
public partial class Loader
{
enum eAxis : byte
{
Y_P = 0,
Z_F,
Z_R,
X_F,
X_R,
}
public enum eScean : byte
{
Nomal = 0,
MotHome,
Input,
}
}
}

View File

@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UIControl
{
public partial class Loader
{
public class MessageArgs : EventArgs
{
public string Message { get; set; }
public Boolean isError { get; set; }
public MessageArgs(string m, Boolean err)
{
this.Message = m;
this.isError = err;
}
}
public event EventHandler<MessageArgs> Message;
}
}

View File

@@ -0,0 +1,38 @@
namespace UIControl
{
partial class Loader
{
/// <summary>
/// 필수 디자이너 변수입니다.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 사용 중인 모든 리소스를 정리합니다.
/// </summary>
/// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마세요.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
}
#endregion
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해
// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면
// 이러한 특성 값을 변경하세요.
[assembly: AssemblyTitle("CapCleaningControl")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("CapCleaningControl")]
[assembly: AssemblyCopyright("Copyright © 2019")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에
// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면
// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요.
[assembly: ComVisible(false)]
// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다.
[assembly: Guid("9264cd2e-7cf8-4237-a69f-dcda984e0613")]
// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다.
//
// 주 버전
// 부 버전
// 빌드 번호
// 수정 버전
//
// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를
// 기본값으로 할 수 있습니다.
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,243 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
namespace UIControl.Properties {
using System;
/// <summary>
/// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다.
/// </summary>
// 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder
// 클래스에서 자동으로 생성되었습니다.
// 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을
// 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("UIControl.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을
/// 재정의합니다.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap air {
get {
object obj = ResourceManager.GetObject("air", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap alert {
get {
object obj = ResourceManager.GetObject("alert", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap bcd {
get {
object obj = ResourceManager.GetObject("bcd", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap bg_blue {
get {
object obj = ResourceManager.GetObject("bg_blue", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap bg_red {
get {
object obj = ResourceManager.GetObject("bg_red", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap debug {
get {
object obj = ResourceManager.GetObject("debug", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap debug40 {
get {
object obj = ResourceManager.GetObject("debug40", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap emg {
get {
object obj = ResourceManager.GetObject("emg", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap erase {
get {
object obj = ResourceManager.GetObject("erase", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap error {
get {
object obj = ResourceManager.GetObject("error", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap help {
get {
object obj = ResourceManager.GetObject("help", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap icons8_pause_button_30 {
get {
object obj = ResourceManager.GetObject("icons8_pause_button_30", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap info {
get {
object obj = ResourceManager.GetObject("info", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap mot {
get {
object obj = ResourceManager.GetObject("mot", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap plc {
get {
object obj = ResourceManager.GetObject("plc", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap reel_big {
get {
object obj = ResourceManager.GetObject("reel_big", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap reel_small {
get {
object obj = ResourceManager.GetObject("reel_small", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap safty {
get {
object obj = ResourceManager.GetObject("safty", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

View File

@@ -0,0 +1,435 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="air" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAALGPC/xhBQAABXRJREFUWEft
WHlM22UYxmMeMWo8ojPxH2E6l02dqPFWsrgZ2WaWsbiLjcTEOc8tGq9t0f3hkajTMGJBEDY2GFA3xmCj
COUqpXd/pa1dyzoJjGsgx2DGxOn4fN7m/fWADtNC2WL2JE8gv/f73vf5rvd7v8ZdxqUGu91+h9VqXQQu
t1gsiS6X6xo2XVxAzFK9RdLnqN1iR0WbeL+sQ3xZeVKUNTnOwqYA7+KmMwulUnkVgud8W+UVD+cMi3sU
ZydwZWGvqGh2jpjN5sXcbeaApcx9p/RUWGHBXPDjiChudJ2TJOlJ7hp7YOZWfK3yhghZU9wrdle3itxa
t/gUS/147pDftjB7WNTpbW1er/dadhFbNJkk60MIKgsgsZjRDCxlvMPhuAUDWNJokNzJ+/v8bWhvwr6R
XcQOQogrihpc5+XAqw/0CgjazWY/jEbjbapmx8AcxaivXWLOEAksZ3NsYbRIVWklXWJ5wWmham7p1ul0
t7IpBBD0xYrC0/5ZrNbbO9kUW2i12hsRfDsJAOP58wTA9vbGkm6/wHLMKJsuDWDpC5/OG/SJS8gcFdiX
LjZdfGD2krPV7jF59l7c1097VcHm6EGbGyfyFXBTNKRlhZADWTWesfnIgbLADKQg5MJHOUx0MBgMd6u0
9sF3SzvEpoNdUZEOz3N7BvzCiGuLeygN7eMw0QMjfy81aFNPB0mc1mST6GBxmOiB5Vm182hb2ECRkA7E
S/v7haKmdQyDzp8WcQRKwnD4TWWzva9cax+NhkebnYNNRpsTS5oBX4ns+n8OjHYlcpTjcJOjZyZYq7d1
aAwSwlpzwWVYuStZykSYTKbZRSiH5mYFUsJMMAF3dNLe332Vj8Zo80DHUywpFLRPvlKdDOtkpkiFREGD
62/M5nqWFUB9ff3VWF7zB2XtYfNaLEi5cilKMTrtssh78X9+3fF/kEmSWFoAEHkdDCkYQdjbIQZ8C/xO
pXMMrC7q9Yt8MPuMwP5s9xe2ELV4XMdJifZrwAtWL5ECN9dNBqPl2Hokc1kkF7YbaO/totdXakmPWIcG
/8UNuGHoDZJZ4xF6s6WarkWOMyXguXqDWt/SNTeLC9ufhqmoqIgr0zj+kFVHykU4fRVax9CUL38GBO2g
N43sv1LnHIjDwbA/EfSwiZSJeGqq8RBCNX09x4kaWNJVVKDIvpWaX89Rcp6nN1vVuJ66wyXT8SzTOvqy
1Z6xpKBKhU4kRv8xxwkBvq9D4HJwJ/6fxZ/DAvY3X/05UKTg0T/KpsgARwlqg/3UApw2cnQ/9o3OLJnY
7AcG/+wP1R7xANptPthJg8hkU1gYTJKW9h75pL1oNEl6NkUOBNuSpgyM9ojWOcImP6hNanGgTUbNiTHM
5Fo2hwDfP/wsqIKiNwz6f8Lm8ECDRLXB9ptS4/oL/6cH35WYnc9Tgl5qlTp7H5v8wLU1P682UO7TNapQ
t46hby5sz0NUPPwuMVkspZRJ4jlhU+I+1OT8ExniTnYVHhqjZKJfA6jT1sMdNCIlnCbh75YC3NvyW/cR
XFEIUsHdQoD2379xqNPXTmYyakSarfTqE74fmigbBNvpXsYgtrKLC6NOL7nuCyoelhX0ie3lbeJ17Ce6
kuTvVNxCSAp3CwEGM0tntvyyeZzIcIwHt8E/+uRw98mBhmm7qry+juEcEmmZkQVqqMjlbhNAIsF0Ov0v
5IfOFpH8v4zHf2G9kwqFbZP5mgDavLnYR8/wu1bmPLzUPjrSLgxmqRHBb+bmkwL7biH85VXqHGeyaty+
F15OrUeodC39NACIm8NNIwMcPwYHymNae/+eOrcobDh+HoWmHQ5fo98HuVlEgM/ZEEuH5Hb+ND2gh8+M
/Xx2GVNGXNy/B7Gt3iRjVn4AAAAASUVORK5CYII=
</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="alert" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-automatic-gearbox-warning-80.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="bcd" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAALGPC/xhBQAAAsxJREFUWEft
ll1IU1EcwBdGBUFvPfRUD0VBjaAeerCHCMyHHkrXsZwhohOE2q6F835s0jUlg6h7J2rp7hJsICzQHiJI
LGePfdFLDyVEEEG9SEEguez0P/Nfzu3cfRjn+rIf/OAw/uec38O2e11lypQpEcWMBRXTWgSpQ75X++9u
x+sLo5rWC84hYo3EavD6wihmdIJ7iFgJXl8Y1Yz1cQ4QbfGBcsTycg4QbfGBmjG8g3OAaIsPZMAv+Tnn
EGHKkegpvLo45EjMzztIgClwRu+Pb8Ori6PjxthW2Pgl46D/tvPmCJWuD9C27lu0OdxHz3depWcv6efw
ytJRjFgD76JCdvXfXhoY6aWDd0K0vaeXNso9tK49TM8EtBw9kjaE160N+AO9ApcuZUegC7IZfaUY1his
ZdmwTirG6C76aPfmxeSB8VTSTb9NHaKh7jZuHNMT0N7hVWtHNaxKNWINQcQ92bTCqhGtDUZG95BEogJH
cqAJUpGadU+zyPmpw7Q52MENZNZeCO3Ebc7yc8a9DwJ/s8j4YB03jkkktQW3OA/EvWGBrxPHuXHoOI47
D8RNssC5B5W8sGUl9SuMblje4TC/Zt0N8F18+SxePceNQ2v88kHcsj5AxLXsqExJIHQZR9cHiPicHbVK
SXuIo+sDRKRyolb7/Ziub8Rx54EAH/gxIyhHj6QewfH8VHlb3zLZ+oTXp1d5fbS6vnU/k63ZZytzPrpi
S/qVKb2u991n60yamvQt8OQY5sUx4f9QwdH8iApksEiImc+OWzb0GMfyIzKQATHTuXFpfxBd34Rj9ogO
JH5tkhOXlkihozhmj+hACElmh2XYhWP2OBD4IStqRUl9gmP2iAwkUngvNwwlAe0pjtojNDCgSbywv8J3
8CKO2iMyEB5pjbwwNEEIsX0J/ofIQPY4gxD24sCeKgvgJ3DC066expEyZcqUhsv1B6iAtIhPh2shAAAA
AElFTkSuQmCC
</value>
</data>
<data name="bg_blue" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAABGdBTUEAALGPC/xhBQAAAsFJREFUeF7t
nL1uE0EUhS0QvBDvYCcVCHAQeRoXId4N1IBrRyClSiSwgR7vFoCgQHZkp4wpDUqo+Bnm7M5AFM1aa07n
OUf6uvG17ifvrKvTUBRFUZan3fl8vdnN7rXS/FkrySetJDu3mDXD7mR3K3bMtrCzW59Lq5vf2UhGJ5e+
LAZmG2l222lYPe2Dg6utNHvkB24/+WR2h3PT//DdHB3/NIPZ77UCO2E37Ihd/d72x/Ow0zFXnJb68fI2
93KTvPliBtPwF68jL6e/TPf1vNgdDpppvue01AseWy+vN/oa/JIY6I0WFySObjk9y4PL0995xS8vMDgm
dl/N/eM8rfViKd629gO4B/BTDg2NCTjYfvyxvA+7o7bTVJ1mkj3HYZgPDYyRneGpE5jtO03VsQePcXjf
vpFCw2Kk//7cPcb5xGmqjj14hsOHkx/BYTFyZF2UArMzp6k67mBwUMx4L05TdSQwjASSSCCJBJJIIIkE
kkggiQSSSCCJBJJIIIkEkkggiQSSSCCJBJJIIIkEkkggiQSSSCCJBJJIIIkEkkggiQSSSCCJBJJIIIkE
kkggiQSSSCCJBJJIIIkEkkggiQSSSCCJBJJIIIkEkkggiQSSSCCJBJJIIIkEkkggiQSSSCDJKgKL0gkU
LYQGxcjh+G/pxDenqTr2kGpPLrFa7UnZn2ceDE+Dw2JkZ1AW7zSTrO80Vcce3MJh1B2p+qmsfrrvqp+a
aX7XaaoOCrbs4Rk+gAq40NCYQJ8gXFimN3rvrjlNy4PmRnyorL9bBAfHwNO3C7OZlvV39v676fTUC5ob
vUQUkcX0OL+wu+KX909eljot9YPaSzQ3ugHFnYgWM7yR1rFXCzthN7w8/Z3n5f1XBagPmhvtkOmFgbFg
d17xsa0KLk+UD6I/zw4eW4o/22sGdhpjR7xta78wFEVRok2j8Qfk0Qty9BRILAAAAABJRU5ErkJggg==
</value>
</data>
<data name="bg_red" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAABGdBTUEAALGPC/xhBQAAAsFJREFUeF7t
nMFOE1EYhRuMvozLtok+gxq1UMDAri7EXaXs2WkpbO3MGiyKb6EriVsD9g68AwFcSa73n/mnMeROM8PZ
zT0n+XZ37uT/OnOnq9NgGIZh5ufh0a8H7ShZaUXJxHHaisyVw9YMN5PMlkzaY7MsM+v4WFrj6aLb/OzW
zUIgaUfTjmqonu6Rved+id18w5W9b/ZwMLRnvZ79s/bS2tUntUJmktlkRpk1n7sZTUeNbbugWsonl/f4
46n9+u69vVl96r1xHbl59cx+2fyQzp6JTHZUS7noa5tucPym771JCBxv9GcSm3HyQvXMjxye7oL0zJMn
z7dxSHzeHGZPYWxMqQ9L9rXNzjx5lH2bhoQ4WN77rk+h6aqm4rTi6aEslsPUt2GIfBqMMoGROVBNxXEL
f8vic/dF8m0WIknvdfYau/+Jqqk4buGlLL6u4V+Vu3K93lGB5lI1FUcXejcKmdyLaioOBfqhQBAKBKFA
EAoEoUAQCgShQBAKBKFAEAoEoUAQCgShQBAKBKFAEAoEoUAQCgShQBAKBKFAEAoEoUAQCgShQBAKBKFA
EAoEoUAQCgShQBAKBKFAEAoEoUAQCgShQBAKBKFAEAoEoUAQCgShQBAKBKFAEAoEoUAQCgShQBAKBKki
MCudWO94NwqRq7XFXOCFaiqOW8Tak1tUrD2RjkBjJ4Md72Yhsr+1mz+B+6qpOFI+KIul7ojVT1n1U1er
nxxLqqk4Wj6WyAVSAefbNCSkAiuVFxvTjH/eV03zI82NclFaf7cRbv3dj7d9+2icdwia56qnXKS5MZco
FXAhvc5/3azy5M3kxclQtVTItl2Q5ka1n56J0mImX6Q69mrJTDLbwdbo/zMvk3eXCtA80two7/9sw1DI
Zq722hZFDk8pH5T+PLfpiSP9s10zZKYTnXGp9AeDYRgm2DQa/wBGopc1FSaqkQAAAABJRU5ErkJggg==
</value>
</data>
<data name="debug" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-bug-80.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="debug40" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-bug-40.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="emg" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAALGPC/xhBQAABOJJREFUWEft
WOtvFFUUb6Ifff8HRv8AE9xZmqJsd0ZgW0BCWWp4tDxcKIK8FFsSEx/VAlXjB1NrNWpCMUSiSLR0i00w
EEHlIeq3on4UE40K2Z2ZfR/PuXvnzr0z03Vf9VNP8ktn5575nd/ce+fcc9oyb/NWwf6Khe8yDa0zHdX6
zaj2Nv79iMCv+2mMfLj7/2MQidye0sNPpPXQl2ldKyDgP5BHTKX0UDfE47dxmrkxFLYmpWu/egRUDVPX
fkkZodWcrnl2a2nrfSjsVFBQgrkyClZvHOydW8HevQ3sJ9fjPT3Ql4BcJ28uWnQvp2/MbkVaHwyaNbMr
Brk3DkPxi9MAV34EuPqTD8WpafQZBqt7ufIse97Qfr4ZXfAAD1OfkTgk+10hXhGF/OgIwKVrgaICgS+Q
f2c0aFZv1C2SL6syc3ZiA5TOnlcCFz49CdlDg2DvSoC1uRusresgs7cPskMv4+xOKEJL575Gjo2yQDaT
/0QeuoeHrd6C9pzVuxbgm8ssWOHoUbA2rlHGg2BtWA2Fj0+4Qi99z16Atkh26CXmY+qhT3jY6iwV1eLe
QA7s3QnIDOwLHKuEzMFnAC7/IESWzl+A/IcfiHH8wlfx8JWtnOekpTXCYO/YLIgagf10golzZlMWiLhe
VZ4sJ+HyQ7SEtMeIzFq3SiarHfiiucOvKF+8RyBgjlzLZcxudEKwL3XkLYUs9+ZrClmtMDseZdsjO/gi
5N8bg+LnE5B/d8zrl+Qygu1vY8Hd6FQwOxezPVOaPisEls5dgPSSVi9hs5H/s63tTi7Hb+zglx4onp4q
i5v+Cq+TYO/pk8nmBGb04RiX47e0ERoQjsvb3eV9/Uj5XsdihaxhLGtjqSsde8S9Z2gHuBy/pQxt1HGk
hOsIpPNVEDQJdt8mscetHjefmnp4hMvxGzocEwS4oYXALesFQbNgbep2+Z/aIo2Fx7kcv6FDoECaTZeg
OVAEYhXkjlUQKC+xrSxxQiJoDljS5vzVLzGW6cLxcV0Q5IaHBEGzkKWkTfy4DynvirFo+Fkux29me7hD
JqF6jkjoNJHvNwPFz04xbqp41LHQMi7Hb9TgoBP1EMyZik1nFmnPuCSNgZbU4c0NH5LHchUTNRnmoTOC
CCthJxUUxsdlooZAXEwgFg5m11JpLDzJZcxu1H3JZPmxUfG29ZRZXmSf7xd8VJnLY1TmcRmzG5U8VOU6
D9GJIqrob6+wBCuT1gKWnL+7yrjobPe0ADNVt6UpI9wlPQj2th63B8EAmef2ysR+yEcXBytYHQ78a2/v
UcbN9oUrefjqjFpDmYCOO+ftCbSPgkp+M96Jdd774jedtWrJfw0y+3epzxjaCR62eqO+VV5qgr29V22a
EJl9O9xAWKYVJ6ewnL9YbkknJhVfWlbvzCFmqMzjYWszagmR4IZMaK6IuG0n9hiU0NnYYwuhcPy4IkgA
fekZavBlLsx5v9lLtPt5uPqMRHpnkkDpITOwX/zOHNijisL0VJxMQu7Iq7jsMeVZjpmGxTlGfSu1hgFB
FNBXWkyeYQIpnQT5EGjP1b2slYxaQwxw3RtQAS519oWD2PMOBo3P1Py11mqUq6j7wmBJhDgWfcAujl/n
6ISgJDzn/37zGp2b1ENQmU5lEoqhevIYu8Z7dPD/EYncwd3nbd781tLyLxOgcrDBNHH8AAAAAElFTkSu
QmCC
</value>
</data>
<data name="erase" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAK
YQAACmEB/MxKJQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJrSURBVEhLvdZd
b9JQGAdwEr3wTm9M/AheqJlfxWSfQudMBnYaWarQ8WIyMBlUWoSp0CkzawWM6C5G0aiZzhfoMCZidIu6
bG5DL8yc0mMPO8cwOIUyWv/J/6aF55eekifYzMogHT424AqdoGl6H7pkfSgvn/bzYu36XVmlfNHNU3Tk
MLplXRwe7mn0zqw6pyyCuYUlIL+sgLPe6O+BS+xx9BHzA1GGnVLThTJ4UvxUh2ELrypg2BezBseomFeA
JCsg84iMn2FCfegrvacZxW3BtWMf9se2TMH10B14aSdO+a719uSdUFxTcaMorg7e3bHbPZH0yBVBlfIl
IqLX7OMyeNbwzvPz74HDw//UlsxeNFo/rnCSCgnZqjNwE9x6ME8E2jXThN+QCurgxXA/Gk8OROPizFr1
lwreLa2CnnFtyVzmp2unGfYIIlrTiP7YAvX+wx/uAtfeOZeaUbWjTiOiNe6Q4Elm5Y3vCGxs5es6GNHw
yfvPiQCp4mwJXAgmVDvD3UZEa9qhuBgXci+IUGNNQ3GN4KajuO1wQyjDCkPNPySjJeEQdWqow8uJiGiN
wx8/FJyQlneD4kLcObaNG0Jhzvu5PuGevEoa2E3fLq7Un9wZTKpDTCSLxuunP5XaM8pOvi5/XK6RBhot
PLHxRKZq9/ASGt05lDey380KpTeVz39IQzt1Y7OmLYfcmms8cRKNNJ46HhaUbvGeUByMFytfDOGmoDhG
cVNRnE44RKNTuW+mojh0IH6AhFuK4kCcCQsLxQ/b+H9Bcc6Nxg66rwqKtsfXAxPTK3C9olvWB/5Hosbi
R+F6RZd6jM32F+J393EUKic/AAAAAElFTkSuQmCC
</value>
</data>
<data name="error" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-hazard-warning-flasher-80.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="help" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-help-80.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8_pause_button_30" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAK
YQAACmEB/MxKJQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKmSURBVEhL1ZfL
bxJRFMbrwvj4a4wLXdRUXZo4vGkxtDst0MQFGKMwMB1eKdVNI9CdaNQmxkWtIQyvqRTqprU8VpZuNLFt
FOq0tbpo7ALvCbch0gsZ4Frjl3wJmTnn/HIvl3MPff+F9NZXZxi7cFnBCka1K3lf7Uzcg88KNjZwhc+c
xmH0pOFSar17Pmfwvd0YCxertsjavmPmUw1se1zeh2cGf2Z90D2fVXMJJU7rXhoucVXPi2vm6dKe/021
9jC+29YQYw4X9/QesazhkwO4TGfSuUXXSCD3zfe6QoS0s3euUhtGuTo+5cDl5EnHi89NofzuA2GHWFiO
IdcULOwg+FNctr104ym/JVz6QSrWjS2hwne09RwuT5aajV8yBhalXlbabKhlDOQkrSt2EWOaVTuhd6dX
fTIOUaf2z1VrWj79ARgY1pDKmVTBd0JKfLn0s3aoz9LBkffw7FAQ2/webArmtxln8jrGNTToSb9rtVoa
YPh16N1iFuPqYvjoWYN/YZOUAKYBBhu8C5t/dDhoeZbpkkQKBtMCm0NFSWEX+jEWTrNgvBMpH5CCwbTA
tsjqL4aN3cBY1BpRl7K/+EgMBtMC21FvR33fhbHQk5Pj9pljAqNFYmx9q2EbSMFgWmArYihZYQhj/+Hh
unZbODXky2yQgsG0wAZvZn10dOUkxtaF2mXubzcQHZ/OYFxD0DLNocI2KYkG2PSoRcsEocu/4Jn9Skzs
xZ7ZL9AuVzDmqDQuod84kduifS0OT2SrKjZ6AWPIQrPS2K2p9y1PeKe+ObUsabi4CZdvL3R3PqM1+mh5
8QkuK09aLn13ZLKHYW9ycUvrTltxuc7EOKLnUfIyGlkrssfbYL6KBrwllSN2DpfpXjCkyx3olVySwWn0
dOx/Yeirr+83SXRvTbd4pKkAAAAASUVORK5CYII=
</value>
</data>
<data name="info" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-info-80.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="mot" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAALGPC/xhBQAABF1JREFUWEft
Vt1PU2ccZtebu5gXy7Ys2TJ3vf9id5rtZhdeumQxQbaQQQnooAWhxZaPtpSV0p5+QG0nLT0gVaHGQqQF
lkgUK6UyQJSYbZmaqVkCi5ydp/m97Hh62h5LSxazJ3mSk/M+z+/39LwffateOySCX22lr317rxTCS2Uq
h3Ss+o+d9T6hFMJLZSqH/wPuF//pgDVnLJ/09bU/dwx2PyuF8KIGlSsvTp2xftxs9qdH40sCP5MqiZH4
baHFHMjUt9k/pbLlQTnCMZY9ZDnDMZYtZCXCMe47ZCXDMZYc8iDCMb5yyIMMx6g6JM6oZvP5ZRiUCknJ
jSWeGRyRVTU0cRcfFKuJcfQueE42mrw31YT7MXj1UZ3e2UG2oqAfnlYTEhnIlovmXv+MklFK6/Dkb/Ud
Tg1ZVANL54fe4ksHGciSi3qD2x2O31I0gl3c+P269oHjJH9lFAuJ9w0GzkXyXJxq6z/mjszuyI2R6ZSg
t4+u1bcNfE7SklEoJMdf/7tGZztK0lyc0HQeOufk78mNLZZApqbV/hnJ9g2syRZxTcr7oDcykEwZzRZ/
Um4UN4SHhssG1JT3EUMnaDg/Gjpdgcj0y7tNKeCggW8K2q9tXnDMbBQiNNCSbQ/ygOjZcI7z03B+fNfa
f9w7nnwhNcsD9mgDH0U8iY1f7jwV1JD3JDZt2qEjZM9CHtA7lnxRq+0vvgG/1na/Y3Jf3JKa5QHdXdHp
zNKTvQCrqafC8o3Hwu2FR1niGe/Y+F1R6zZGp4Uq4Q0qkRPQxI1vVTf2HabhwtBZAj9LzdKAg/rI9wvx
jb9Y8yUx0NzUQ+FSMCWEXfPbIJ7xDmGZDh54qUxOQK01sEBDxdFgdId5yTpkAbtPez8Ic7NrrOni7O/C
ZGh519cbW7ad5Y8a63xvgnbx2WeeSk+G0rvQMD28qIFa0oA4xhqNnhG8V4XaVvvJoej8rjwgZ4zGVmhq
8eUQzmO6wmVNCuCMV7xToZVdaOGBFzUwJg04HJ0Xas86TmZNavBNU897vZ7or9KAg+189dzV9edohPWF
KcSXI0teiJqVudhD0fNnNiRqoJY0YI/Y64TG+j5Z1EFnDS6yAho9FxxxzqyiAYhNgHWGaSV5Xgy0hb64
/FNKuHPj302FWqjJ6uusgUWSq0edwTXCrktave/+ys3Hew0wZSHn3LZNe+EtkudFp8Z1SNTuSDdM5tYT
oUXve8DqoxfJS4PbOHFZIeCOmoCWmuG3lQK6TdEJkuwfvU3n31WaYuxWkuSFQxf+UmmKUZMk5YHiJhGP
EhrOiyFLLKO0SWi4vJAeM5gynHM4Smg4B+6uS/5YnmOmIlA6qHHO4Uv2d4wdw5oEMa0+cyyDcPkO6opB
8a9OnEKss1FufhvEM96xLwfK/+oqCs40EcdOZM2xvrAJMO0gntmaA3FZEKf2pctCRWE7HfiQ9ybXWYBi
5D3JTVzRyH4wwCU0zF1f472J1UKERunC+pqgquofdvoa6+LDQkwAAAAASUVORK5CYII=
</value>
</data>
<data name="plc" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAALGPC/xhBQAAAnhJREFUWEft
ls1rE1EUxd/eP0BcigvBpS5sQcVdFEVTUFuoOi1pG8ViotSkBGea1tSQzJBObEhSMOmHMYm2JqmlWgNq
IoiLdiXBD1zozmVx6cJc33u+DIozNZ1JYsU58CMhN/eew7tvYJApU1tZMIe2wRSaw6w1lDh6jj/3Mhv9
ghgaxMOgKcRQidnoFx7iVR3eGCrMRr/++YDvvAgWL6pTvorgW0y9j9H8gPJpBMEObT6Oq/cxmh/wlQvB
LKdO/gKCrxH1PoZ5B41iBjSKGdAoZkCjmAGNYgY0yv8RcOu98vd6pT0cL+0juH3uA6/Du5ffT+5800je
yrtWs+KxrrOeiR3Mtn71jYY+9fAitIpeQfrACVI3s/+zAsl7n8dvp6EV8JEZ6B+TqzSsII6xCBur8Oxl
BQPzKyVw+SQYuMaDP5YA8tvPTM5mwe4SwDnih9TSk19qm+lN5pbBKcbIaVbP82I7i6EtPIAG7By4DPst
JxW8oahicGsmC20Wq1KzdHIwXywp9c32JguP2cqlaRZDW3hIJfWwSJs5hwvuLK7AoRNn4JTtkmJidwu0
Hs88gCteP/0uT6dpTW+v/Ua4ygniKouhLTykQlbUfrQDjnfbwBMIQ9sRK5wbHFJMHCM36WBiUDutqUyO
1vT0xtM5sI2GyF18wWJoCw+hKx72TyirOGztUgIQyJ0jqyE1Qv/QdaWmpzeSKbAnWvSxGNrCQ2hAQnJh
CUKJFGQfPVUMaiwUyyAn72Lz/G81Qj298XSehvtxetJ6n0fezmJoa1hOfHEGo9BsHIFoba3k4Vjv4YMH
WYSNhf98HzettQRBLJO11nVypkz9FSH0HdsLU8gVsNwDAAAAAElFTkSuQmCC
</value>
</data>
<data name="reel_big" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAABGdBTUEAALGPC/xhBQAADlRJREFUeF7t
XOlzFMcV96dcH5L8BTm+53alkg+5/oNUkvJ3V0VoDyGMsGFXO7urlbQ6kXbn2FurvXQghGStThsMso2N
IWAS4jJg7LKNMT6CQRDQEYOh079mZMFs7zkzwgev6le1pZnu9/qpu9/Rr+eRh/SQvr5U74t/x+oM/sni
DFhtLjnU4A0dafAo521u+ZJVkFYszeJnAH7jb3hmp+/g3fpm0bKlOfBH9KF29/WgOqH/txZBbKeK+LfF
JX7a5I9f84gjK10DeSIOHyCxiRfJwNTLJD17jGQXjjPgN/6GZ3gH73rE4ZWm9vg19GHzKKfq3VIbVepv
VDZfLapzKz+2CHIrnUUfbmuNXm+LjN+UR58jmbl/kKFnXtUF9IG+2sLjNxt9kRt2t/KB1SX56Mz+kcr+
y0t1TulRm0d+lipu1SvvWYuMP89VgpEIjy+SFnlszeqW1+weeaHeFfyVKs6Xh6A4q1t50e5Rlulyu23E
TKsW4NmTnL5D981V+g88bHX2/1IV74tLj/uC37e5pSQVeKV3cPZ2bv44d3CbCcjQm5q5Q/dJzMpEvaP7
e6q4XyyyCeJjVHlXPeLoanrmGHcwDxKpmaPEHRyhs1G6ahXEv6liP3h63Of7lk2QB7Z6Q8vhvebvcXoR
HlskW73hFTudjY2N8jfVYTwYgnWly+INZ192OT33xZt1xZCibpGjN7NKjczZB2atLY7+n9sEaal7IP9Z
boEvKFDqmdkoJ1dXIn/L6pau1LnEn6nD2hxCBECVdyOQW7jDE24d0sh+8mRnnDnCvOdmAjzBOzj0LPf5
OjAGui/esDjEP6jDM5egPLpsV+C88gQCBqePEG8wSzy7Q0ROREhnbB/3PTPRQXlKlLe3L8RkSeZf4b4H
YCwYk+lKrHcEfkqn/HV55ABXEACzrrFFJk9PJ8itT3Lk6oUs2eaTSw7AaIAXeII3ZJjMJ5hMUgm5lT0H
CWbiFlfwF+pwjSUYDOx5pZZtd3KK7OoMkXfPpAlZGvocGIBPGeG2MQPgNTmVuE+Gd8+kyK4OhfQM5rlt
AIwNe6LhhkV1Vc7BYPAYI+CH0L7+MLn2fvY+wYG1j3OkqU1hyQBeeyMBHuAFnlo5MCNb+kOkjcqamz/B
bQ/DYndLZwx1cRBdOHrSK3yrdoK0SDnSF4lwhV7HwecGiDuQ4rQ3Fu7+NDl08P7Zdy/+958cCcQjTGbI
rm2PMTp3Z1ZsHimuDl8fIcJo8IZWivl57eExEohFyGef8AVeB/YiZ1eI7TW8fowA+gYP8OLJsA7I2h+N
UNn3cPuBn9hAne0tzsBfVDXURmpse7VYhNERnyStgRD7r/IE1eLE0STZ1RWnbfnLRw8wcxzdcfLq0UEu
by2wWloCYdJFx8DrLzR2iBoVeUlX7Gx3K0mPNLrKYyAO76cGQyH/5ex5xXDnyhDxi2HSn10o6E8v0Gdb
MMJ48HjzgP16Jx1DMLef26cQHF21CUpUVUd1VOeUHqXxIjcxkJp+hWxvC5HzGmtbCd58LUWa2sMsS6Lt
t1bAiO3wh8kbpyqbfffivbNpOhaFjUnbLxIQyGXW5NpQ5b3Um5otcFmwVIT+DJmeLb5Rl4MYj5Z0J6pF
TzJPneYol1clyM8kiNCX4oZ+PcmZ2za38ryqlsoIyUe6fFeznFnSl56j+164rNEohQ/fypBtrQoxIgGB
PtAX+uTxqgQYC1ywvvR8Qf9YKXavsoIVqaqnPDV4lWe7B6ZvazuDQpvo0sW05wlSDTIjMeKPjd/Xfy3w
R8dJZjTG5VENsB1hW+JNmi7q/9o9yryqntLEIg667nlpeOpIk9Bg7UvlXmADZyHe1JECPpUCMTf6WHqv
ckNWCkoyhmOAAj7QBc5Y/i70/VBVU3HC6RkOgHidPNEaIu+fq32paDE1HSc+ufYQr0UaJlN0/+L1XQs+
eDNDnvAp3NNC6MTqkjyqmooTnX0f8E7P8J+JZvQvlXuhJ8QrFbLpQSRFZ+Fg4SyEL0yNyUVVTXzCoTfO
bbWNgV1dsZrchHI4dJCGeDT84vEsBVjNxUMD3D714My/UsTZA2f/fn6w0Ftbwje2OMVfq+oqJKsr6G8L
77upbRyfPEx2tCvk9mU+Uz2ABXR2KUQZrTzEQ8gGJ75cyFYL4Ig/6VfYmLV8W5XxT6mOfKq6CgnlFrxE
KZKTE5r0kJE4eSxJdlYc4p1gIdvJY8avhnWMT8ZZmKrljTyo3R06qarrfkKRDupMeBvoUx2Rghyfkbgb
4kUqCvHwDt6tJmSrFu+cTtMxRwt4Qzesnqcp8G1VbRuEKikU+mgbDdIQp8Ej0eVr/HK5F2+/nmYhXpQa
sPbIGN1zo4wvgN/+8BiJTrxAl1eYvPWaef9MANuK3S2ysWv10dSeuMZN/aPEDFVS2gaB3DOkU4lwGRmJ
W5eGiNCrkO2tMpmbT5ALb6RZlge4QB13/O0J+sxN3zFj79OiQ44QkXMg5Q6OLG9pFreoatsgqyCFUTam
bdARmyBPU3+Nx8QoQHn9UTr70qWTsngWSYVJIFY+56cXk3m6D8YK90Gqozt2ISSpatsgFDfyDl1axCw5
fiTJZWIUhvdGSYwqr5J9De9E02GyZ58xEVExHHs5SceeKdAH6hO3epXDqto2yOZV3uM5tA7qE507leIy
MQIXz9EN2y9V5RCvfpRlbRA58J4bgbPUH3T0JAr0Edv3AqHeyruq2jbIJsiXB/IvFzRArkxPpqMc9k7E
yDzd33jPSmF2Lk7GaVveMyOAMSO5oNXHAI3dabR2SVXbBqEOGWcB2gawgviP85gYgZY+mbxPDQbvWSnA
sPj6Ze4zI7DyUY6NXasPJFmtbvmGqrYNQjE3MrvaBtTvIfXNQdNgE4IVn6ncCyx5uBq8Po2CVRAL9IH8
INXJLVVtG1RMgWajwVvd/rcOtOHNELNRVIHFlrDZ2NkZYT4fT0mlgKTuTupg8/o0E0WXcDEjYjYQYczW
cL4yMxMn7WH9Ge1qUdSI2D2h85tReqFFfOJw1Xk9GDVELLyMidko6sbAkYaTyGtkNlAhoCSjFTvS8kCU
xcu8vsyGOLSf70hTixPuTuZLFkyaBRgv1+5BpsRSLhOe4R0XjiCLFAeZjaKhXLFkwmYhQ63bU9SgNLWK
zEmGkYB7g6WN3/gbniG1lp17MMoDiiYTUHna5E8UpLM2Cz2DM+y8GQ4yIgw4yY1ekQG/xydjLOzzS2HS
myo8s9gsbPfHr9U1B36vqm2DSiVUzQYMCVJVH79dPmT85B2cnMlsM+f1ZSZKJlRBNq9yqlTtsxmAUE91
RsnRlyrP+Bx/ZZDs8Ee4x49mAtkqaoFfVdVVSLiGipuUvMZmAZWtg0PVJwWStE1raPPKhgFfCIdKUouq
rkLCfVtcGeU1NgO4goCCyFpCORgYV0/IlFI5HtaPNcvWyODweDOupSbzR+i+p7Dib56CKgGsM/pAdMDj
YSTCexeJ3aNcUNVUnHBZmVfaYSRyCyeIs2eAHNiv/6j0wP4Blvg02y/0SqNrlmbRraqpOKHEv1hxkVHA
OUt/rLLIoxzQB+oNO+PmXeaBLqxuaa3eIf1AVVNpogp8pntgmnulQS9Qe7yjTa6qNLgcrl/MscoJswrY
uxJTKG+bU9VTnlDSWqzAUg+QCkKaHPUnPEXoAc5tcPwwOH2Uy7tWQAdUeStVfzqAKvBFGh0UFFnWClgx
TyBjaonIvqk4K1QCL54MtaA7OY0S30OqWionlPliL8Ss4XVcLVAyhlDNzPNcVE+wUI9TnlYLUHiOQvua
r8PaBCnuFod1JxiqCdX0wshQTwiOrFoFJayqo3rCJRN20WZskcugEtQSqumFEaHe3Ys20lKjT/6uqo7a
yNIc/CuuPdV6XtIq01Bt2NzSEB4QHrbWeEMUd2Nwvc3iCPxZVYM+srrlRPHLhsWhJ1TTi1pDPYzRsTu7
TP2+iDp8/YSrn3aPdBZXQXlMeTAiVNOLWkK9zvjULWo4Xn/M5/uGOnxjCBGKVZAv0/9oWdfGyFBNL6oJ
9QJZ9v2EyxVHHNUSjZN/YhWk61KZnKE/NkncvSFTaqqrBWSALJCJJ+s6UKNNlXcDXyNRh2sOoTqT7okl
PzqBT9U1706SDuqTIQ3PG9hmAHda4Be6qCyQiScrgNpnjInOvN+pwzSXcB0CM7EvM1fiFO8E2Z2eI9vp
HgQrfOW8eQVKWlw+n2FWGLwhQynj159ZuI2xcM85zCR455TxFRiWUgLi+y347AlzbjMxVsDNG7QRePt0
il0GguHAzYJSfiBkhsHAnoetSR3W5tLd1Jd0xtGbWS7nJ2Iw3ck8c6qbe8JkZjbBTuD0pLTQFpYWV2+b
u0NkJ+0bN6rKOdDw8xy96VWbRz5tmsGolODiWF1yDB8fg/fOE1iLyN5FdssShUUI8YLxKJmeuXtdH7MI
X9dY+TDHFATgN/6GSn68k6fvBuMxss0nsQIj9IUPL/J4aQEZG7zKql1Qooa7KnoIH2iwueUlfGKumgQE
blyiXMIfmyA+KUtcvQmW8mpskYjFFWT1ifiNv+GZT86yd9Gmmo/5IDEgBBDbykuGRRhGE4udPVIUWRzc
9DY6n1gLIANSUsiqILrQHdtuBiEhaxPkRSo0PgF6S09QXyvYnnv3ojRdrvLipn+hzQhSM9vz1Mda88h7
1sz+QCMsK07PcACEM4wGtzJrumO8GYSb3pZm0Ust9kWcrbYqe2/CeTViZqIPVAzg0Bt94+jR6gp6Hrh1
NYtw3xan+zav8k9WZ9KeuCYER7DU736Ie98LLGqAW4SyNwC/2Ye46TMYD+p7EiE4vIxCH/SBG5R0y/DW
VfNhiK8CoUgHoaHFGaxHzV2DN/RSg0d5hxqhS1TJn38K3iKIy/gbnqG4Ee+iDaKHooU+D+khfQ3okUf+
D1WHWk/swkxBAAAAAElFTkSuQmCC
</value>
<comment>rell icon ( 80x80)</comment>
</data>
<data name="reel_small" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAALGPC/xhBQAABe5JREFUWEfd
mF1zE1UYxzOjd+r38AVH/TBcOIgX3sggQtJqgQIlpQn2vSSbwiabzW42zXvSNiUJjjJKodBC6oXjgKDA
ADpjWxTEGwWkx/Pf7gm7ydlkU+SGZ+Y3k9lznv95Nuftedb1wtqOfcH3uv3S8N4htXrwWGqpL5i5TLlp
cPngxNQS2tBnZ+/Eu4bb87WPeoZe8/ijg/snEstjavVBbG6RJE4ttwR9RtXqnwfGEsuegcjgTu/kq4bc
/2der/dlj0/y9wXTP0Vnz6/zAnGCNLuwTjWueXyRAWga8s9mu72BLXuHleVw8exj3qCbQSzMP+4ZVmvd
R8U3jWE2Z3v84of9ofxtrVrjDvQsQPNIKH+ryy99YAzXmXn8kT3Dcmm1Lli5RILxPBmX002DOQW+0IAW
ezYolVa7ByKfGsM6s939ke3D8txvTEQuLZCQqpK1Gyo5fVohkeKZ+gBOgQ98oRFSFF2TtQ1F59Yc/5NY
c5hW5ixR4VgqRh7f1Qi5lyBPftdIUNHq4k6BD3yhAS2ZakrF+Xp7fyh3yz0w+YYRBt+ws7Ah2JqLzi4Q
JRMj638kdGFGbVEhxzNf1cXbgb6XFlWLBjSVlKyPgT5apUawcVrubhwlbLdinUzSaf33rjU4xnE1ToWd
bJ6a3pengX8SSyde3ViTYn7+kXsgfMQIx2o4hHHOMeGAmiN3b/KFwfUfVCIky6ZA+AjJk+Rn2penAdZu
xEkgnq33p7fQVe5hjhuCHcLRmQUyV45xBc1Ek4plRzaCNvTh+ZoplRUc4rpPdOb8epc/ctQI66ntn5ha
ZsIBJUUervHFzKzQHRnUpi1BmUEb+vB8zfyzSjeemqr79Y5pNSOsDcPFj7sVjWr5IslMt39rxlReIbGT
S5bAgFJeIql8+1lgJGlfjA3fMbVyf9ch4W0jPExveJRd/MJUhdy52v6tGX/9qtF//OkaYuAZ2ng+PG5f
UYiQqui+sdIF0u2TvjDCc7n2jcQrTBh/deOx0o7sdJQE5Lh+XoKJaJz+ezK3rx0YUzBN894RtWyE53Id
HJ+6yBrklPO3BvduqyRXDJNHxkEO8DtbEPU2c992ROnYLA4a06IRnsvVF8hcYQ1arjPRwrRoCY6BZ8UZ
sel5KzA2iwNJrxEevUGE7HXW4Bckkp9RHaMm7YNQUyLXxw6/EKkH6BUy143wrAF2CtYcLzigpGNcHydY
AjRPcacEYhvT2RgcngnKFNfHCZYpNm+STpFmzpJYMmYJEr9lPRG4wPVxgmWT9JiOmc0wKqVIMnuC5It0
zVHSOZGMRTef2ALLMdN1NDLipELjEc59Tc6dab55LiwoRMw6T8nM4KC23McfHwq+g9KQ17kVeCklbX8t
xlL0GqSD8XxbMaqU7+/oDWwxwtuwA+OJGq+zHVoVG0Qjf6/YH+xIAo7Jmt6Xp2FHU7IAQ1GNupXnwAOZ
Sqs8j3HzCs0bE/YZTyPSzPknbr/YnG4hSURRzXNqJFz4llROOc94ylWF+nzD1WqkL5C8uv2zkVeMsKzm
8Yn9kcLZhzxHBlIiUVM6SijQFz4snbJDzJ951DUQ9hrhNBsKlp4htdaqUJ+QU+TBL/algB0badnTbKUR
FE2fDyqXtm7NvWSEwzd8jkDFzxOZpPnadxedT20j39cUqnGySRd4adm5yyu8boTR2ty+E9toMV0v3AFd
vDTr7SzH4wENaJm1h6TSqtsX2WYM78y6fOHdg9G5FSaCKQgliqRQotfamv3RYgdKzMqXKjmm5Ejc+ulj
xd3ppw9mbp+8DRW/eU1Ks+eIoGVIqqjqpUGrzYK2Oz+qet9QPE0rtnN1HbwwptXtE983htuc4XMEKn4U
1UwcYEdOpqskSAeW0zTZzKokWVB08BuZOdqwbht3bzg//xAbwvGaa2cbHzAj/SiqUbeaB+sEHMI459x+
6XDb3boZw2GOU37/uFZDaejknpVLi/rd2juWqMH3uXwC5hkuc1yPPcNKBbkbEszDQuYGwG88Q5uHlo+f
HAq9Zbi9aOZy/Qe4xYHxvg6NpAAAAABJRU5ErkJggg==
</value>
<comment>reel icon (40x40)</comment>
</data>
<data name="safty" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAALGPC/xhBQAAAW9JREFUWEfl
2E1qwlAUBeBndygvC9CdCHHcuIkWqp27DK3toLiIOrRkkno1B6TcJO/e95fSA2fiUfgwPogx/yLNYvGw
K4rqOJt9UPfWPtJr7Zw3BNlPpy+nsvw+V1VD/SrL+s3a1+zIxpjJBfJ8j0NPy2V9KIpNNmQfDs2GdMGh
yZESHJoMqcGh0ZE+ODQaMgQODY6U4BBuu28wpPSbQ7jtd72RmsuKcBtXNVL7m0O4ratipM+BQLitr85I
HxwV4bahDiJ9cVSE21zaiQyBoyLc5loWSTebdA/HfUBShNskJQuZWp4xx/n8nXujtAi3Sft5MbW8PwAc
4yWm/zUt73ZIDtY+jeiQrNmTHALp004ckhM5iEPUyNWqqbfba9m9p844RIMkGCJBinGIFKkBqnGIBpkM
h8Q4OMFwSEhkcBwSAhkNh/ggo+MQDTIZDpEgk+MQF2Q2HNKHzI5DCDDaR8AIQeiml+6CqaN6iB43xvwA
iFk1KsvXeuAAAAAASUVORK5CYII=
</value>
</data>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 789 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 778 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 778 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 750 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 865 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 667 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 816 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 648 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 825 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 997 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 809 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 705 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 B

View File

@@ -0,0 +1,187 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{9264CD2E-7CF8-4237-A69F-DCDA984E0613}</ProjectGuid>
<OutputType>Library</OutputType>
<RootNamespace>UIControl</RootNamespace>
<AssemblyName>UIControl</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="CItem.cs" />
<Compile Include="CMenu.cs" />
<Compile Include="Common.cs" />
<Compile Include="CPicker.cs" />
<Compile Include="CIcon.cs" />
<Compile Include="CPort.cs" />
<Compile Include="CUnPortData.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="CUnPortInfo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="EnumStruct.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Events.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Loader.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Loader.Designer.cs">
<DependentUpon>Loader.cs</DependentUpon>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Unloader.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Unloader.Designer.cs">
<DependentUpon>Unloader.cs</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Utility.cs" />
<Service Include="{94E38DFF-614B-4cbd-B67C-F211BB35CE8B}" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-code-30.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-erase-30.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-pause-button-30.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-settings-30.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-start-30.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-assembly-machine-40.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-rounded-square-80.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-rounded-square-80_blue.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-rounded-square-80_red.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-high-priority-40.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-wind-40.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-emergency-stop-button-40.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-deployment-40.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-barcode-reader-40.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\reel_big.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\reel_small.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\bg_red.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\air.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\bcd.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\bg_blue.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\emg.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\erase.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8_pause_button_30.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\mot.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\plc.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\safty.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-automatic-gearbox-warning-80.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-hazard-warning-flasher-80.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-info-80.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-help-80.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-bug-80.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8-bug-40.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@@ -0,0 +1,38 @@
namespace UIControl
{
partial class Unloader
{
/// <summary>
/// 필수 디자이너 변수입니다.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 사용 중인 모든 리소스를 정리합니다.
/// </summary>
/// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마세요.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
}
#endregion
}
}

View File

@@ -0,0 +1,343 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace UIControl
{
public partial class Unloader : UserControl
{
public Boolean bRemakeRect = true;
public CPort[] ports;
public Font Font_Alert { get; set; }
public Font Font_SIDLIST { get; set; }
public Font Font_Sign { get; set; }
private Color _portback = Color.FromArgb(32, 32, 32);
public Color arPortBack { get { return _portback; } set { _portback = value; this.Invalidate(); } }
private Color _titleback = Color.DeepSkyBlue;
public Color arTitleBack { get { return _titleback; } set { _titleback = value; this.Invalidate(); } }
public Boolean arStop { get; set; }
public Boolean arBusy { get; set; }
public Boolean debugMode { get; set; }
double port_width, port_height, space_width;
public Unloader()
{
InitializeComponent();
// Set Optimized Double Buffer to reduce flickering
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.SetStyle(ControlStyles.ContainerControl, false);
this.SetStyle(ControlStyles.Selectable, true);
// Redraw when resized
this.SetStyle(ControlStyles.ResizeRedraw, true);
Font_SIDLIST = new Font("Consolas", 30, FontStyle.Bold);
this.Padding = new Padding(5, 5, 5, 5);
this.Font_Sign = new Font("Consolas", 15, FontStyle.Bold);
this.Font_Alert = new Font("Consolas", 30, FontStyle.Bold);
}
protected override void OnResize(EventArgs e)
{
bRemakeRect = true;
Invalidate();
// base.OnResize(e);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (ports == null || ports.Length == 0)
{
this.ports = new CPort[]
{
new CPort(){ cartSize=7, cartState = 1, Mode="USER", portName="#11", portNo=1 },
new CPort(){ cartSize=7, cartState = 1, Mode="USER", portName="#21", portNo=2 },
new CPort(){ cartSize=13, cartState = 0, Mode="USER", portName="#12", portNo=3 },
new CPort(){ cartSize=13, cartState = 2, Mode="USER", portName="#22", portNo=4 },
};
this.ports[0].reelSID.Add(new CPortData("012345678",30,100,"릴#6"));
//e.Graphics.DrawString("PORT가 설정되지 않았습니다", this.Font, Brushes.White, DisplayRectangle,
// new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
//return;
}
//Set Optimized Double Buffer to reduce flickering
e.Graphics.CompositingQuality = CompositingQuality.HighQuality;
e.Graphics.InterpolationMode = InterpolationMode.High;
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
//e.Graphics.DrawString(DisplayRectangle.ToString(), this.Font, Brushes.White, 1, 1);
//포트영역생성
if (bRemakeRect)
{
space_width = 10;
int row = 2;
int col = 2;
port_width = (DisplayRectangle.Width - (col - 1) * space_width) / 2f;
port_height = (DisplayRectangle.Height - (row - 1) * space_width) / 2f;
//space_width = (DisplayRectangle.Width - (port_width * 2.0)) / 3.0;
//space_height = (DisplayRectangle.Height - (port_height * 2.0)) / 3.0;
var signSize = e.Graphics.MeasureString("13\"", this.Font_Sign);
var titlesize = e.Graphics.MeasureString("1.01234567890", this.Font);
var idx = 0;
for (int c = 0; c < col; c++)
{
for (int r = 0; r < row; r++)
{
ports[idx].rect = new Rectangle(
(int)(DisplayRectangle.Left + (c * space_width) + (c * port_width)),
(int)(DisplayRectangle.Top + (r * space_width) + (r * port_height)),
(int)port_width,
(int)port_height);
ports[idx].rect_signL = new Rectangle(
(int)(DisplayRectangle.Left + (c * space_width) + (c * port_width)),
(int)(DisplayRectangle.Top + (r * space_width) + (r * port_height)),
(int)(signSize.Width * 1.05f),
(int)(signSize.Height * 1.05f));
ports[idx].rect_signR = new Rectangle(
(int)(ports[idx].rect.Right - ports[idx].rect_signL.Width),
ports[idx].rect_signL.Top,
ports[idx].rect_signL.Width,
ports[idx].rect_signL.Height);
ports[idx].rect_title = new Rectangle(
(int)(ports[idx].rect.Left),
(int)(ports[idx].rect.Top), //Bottom - (titlesize.Height * 1.2f)),
ports[idx].rect.Width,
(int)(signSize.Height * 1.05f));
ports[idx].rect_count = new Rectangle(
ports[idx].rect.Left + 2,
ports[idx].rect_title.Bottom + 2,
ports[idx].rect.Width - 4,
ports[idx].rect.Height - ports[idx].rect_title.Height - 4
);
idx += 1;
}
}
bRemakeRect = false;
}
//포트그리기 (총 4개의 포트가 있다)
var sfCenter = new StringFormat
{
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center,
};
var sfLeft = new StringFormat
{
Alignment = StringAlignment.Near,
LineAlignment = StringAlignment.Center,
};
foreach (var port in ports)
{
//배경영역 칠하기
e.Graphics.FillRectangle(new SolidBrush(this._portback), port.rect);
if (port.Mode == "USER")
e.Graphics.FillRectangle(new SolidBrush(Color.SkyBlue), port.rect_title);
else
e.Graphics.FillRectangle(new SolidBrush(this._titleback), port.rect_title);
//글자영역 칠하기
if(port.cartSize ==13)
e.Graphics.FillRectangle(Brushes.Gold, port.rect_signL);
else
e.Graphics.FillRectangle(Brushes.WhiteSmoke, port.rect_signL);
e.Graphics.FillRectangle(Brushes.WhiteSmoke, port.rect_signR);
var portSize = port.cartSize == 0 ? "--" : port.cartSize + "\"";
e.Graphics.DrawString(portSize, this.Font_Sign, Brushes.Black, port.rect_signL, sfCenter);
//sign R 에는 카운트를 넣는다
//var portStat = port.cartState == 0 ? "STP" : (port.cartState == 1 ? "RDY" : "MAX");
var portStatBG = port.cartState == 0 ? Color.Gray : (port.cartState == 1 ? Color.Green : Color.Tomato);
e.Graphics.DrawString(port.reelCount.ToString(), this.Font_Sign, new SolidBrush(portStatBG), port.rect_signR, sfCenter);
//타이틀 글자
var title = "[ " + port.portNo.ToString() + " ]";
if (string.IsNullOrEmpty(port.portName) == false && port.portName != port.portNo.ToString())
{
title = "[" + port.portNo.ToString() + ":" + port.portName + "]";
}
//if (port.Mode == "DISABLE") title += " (사용안함)";
//else if (port.Mode == "EXIT") title += " (배출전용)";
//if (port.Mode == "USER") title = "* " + port.portNo.ToString() + " *";
//else if (port.Mode == "DISABLE") title = "# " + port.portNo.ToString() + " #";
//else
//{
//if (port.reelSID.Count == 0) title += " (할당안됨)";
//else if (port.reelSID.Count == 1) title += " " + port.reelSID[0];
//else title += " " + port.reelSID[0] + "(" + (port.reelSID.Count - 1).ToString() + ")";
//}
if (string.IsNullOrEmpty(title) == false)
{
e.Graphics.DrawString(title, Font_Sign, new SolidBrush(Color.Black), port.rect_title, sfCenter);
}
//SID목록 가져온다
//port.reelSID.Clear();
//port.reelSID.AddRange(new CPortData[] {
// new CPortData("0123456789A",1,10),
// new CPortData("0123456789B",2,10),
// new CPortData("0123456789C",3,10),
// new CPortData("0123456789D",4,10)
//});
Color cntColor = ForeColor;
string SidList = string.Empty;
if (port.Mode == "USER") SidList = "";// cntColor = Color.FromArgb(50, 50, 50);
foreach (var sid in port.reelSID)
{
if (sid.Active == false) continue; //비활성화된것은 표시하지 않는다
if (string.IsNullOrEmpty(SidList) == false) SidList += "\n";
SidList += string.Format(" {0} ({1}/{2})→{3}", sid.sid, sid.qty, sid.kpc,sid.towername);
}
e.Graphics.DrawString(SidList,
Font_SIDLIST,
new SolidBrush(cntColor),
port.rect_count, new StringFormat { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Near });
//e.Graphics.DrawRect(port.rect_count, Color.DarkBlue, 5);
///테두리
e.Graphics.DrawRectangle(Pens.Gray, port.rect);
using (Font fsta = new Font("맑은 고딕", 25f, FontStyle.Regular))
{
//장비상태는 추가로 표시해준다.
//STOP혹은 MAX라면 별도 표기한다. //미사용도 마찬가지
if (port.Mode == "DISABLE")
{
using (var sb = new SolidBrush(Color.FromArgb(220, Color.White)))
{
e.Graphics.FillRectangle(sb, port.rect_count);
}
if (string.IsNullOrEmpty(port.portName) == false && port.portName != port.portNo.ToString())
e.Graphics.DrawString(title + "\nDISABLE", fsta, new SolidBrush(Color.Black), port.rect_count, sfCenter);
else e.Graphics.DrawString(title + "\nDISABLE", fsta, new SolidBrush(Color.Black), port.rect_count, sfCenter);
}
else if (port.cartState == 0)
{
//stop
using (var sb = new SolidBrush(Color.FromArgb(220, Color.Yellow)))
{
e.Graphics.FillRectangle(sb, port.rect_count);
}
if (string.IsNullOrEmpty(port.portName) == false && port.portName != port.portNo.ToString())
e.Graphics.DrawString(title + "\nSTOP", fsta, new SolidBrush(Color.Black), port.rect_count, sfCenter);
else
e.Graphics.DrawString(title + "\nSTOP", fsta, new SolidBrush(Color.Black), port.rect_count, sfCenter);
}
else if (port.cartState == 2)
{
//max
using (var sb = new SolidBrush(Color.FromArgb(220, Color.Red)))
{
e.Graphics.FillRectangle(sb, port.rect_count);
}
if (string.IsNullOrEmpty(port.portName) == false && port.portName != port.portNo.ToString())
e.Graphics.DrawString(title + "\nFULL", fsta, new SolidBrush(Color.Black), port.rect_count, sfCenter);
else
e.Graphics.DrawString(title + "\nFULL", fsta, new SolidBrush(Color.White), port.rect_count, sfCenter);
}
}
//var portStat = port.cartState == 0 ? "STP" : (port.cartState == 1 ? "RDY" : "MAX");
//var portStatBG = port.cartState == 0 ? Color.Gray : (port.cartState == 1 ? Color.Green : Color.Tomato);
//e.Graphics.DrawString(portStat, this.Font_Sign, new SolidBrush(portStatBG), port.rect_signR, sfCenter);
}
if (this.arStop)
{
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(240, Color.Black)), DisplayRectangle);
e.Graphics.DrawString("STOP", this.Font_Alert, Brushes.Orange, DisplayRectangle, sfCenter);
}
else if (this.arBusy)
{
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(240, Color.Black)), DisplayRectangle);
e.Graphics.DrawString("BUSY", this.Font_Alert, Brushes.Aqua, DisplayRectangle, sfCenter);
}
if (debugMode)
{
var sb = new System.Text.StringBuilder();
sb.AppendLine("unloader ctonrol");
sb.AppendLine(string.Format("port size {0}x{1}", port_width, port_height));
sb.AppendLine(string.Format("space size {0}x{1}", space_width, space_width));
sb.AppendLine(string.Format("display rect {0}", DisplayRectangle));
e.Graphics.DrawString(sb.ToString(), this.Font, Brushes.White, 10, 10);
}
//e.Graphics.DrawRectangle(Pens.White, DisplayRectangle);
sfCenter.Dispose();
sfLeft.Dispose();
}
public class ClickEventArgs : EventArgs
{
public int idx { get; set; }
public ClickEventArgs(int idx_)
{
this.idx = idx_;
}
}
public event EventHandler<ClickEventArgs> ItemClick;
protected override void OnMouseClick(MouseEventArgs e)
{
base.OnMouseClick(e);
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
var item = this.ports.Where(t => t.rect.Contains(e.Location)).FirstOrDefault();
if (item != null)
{
//이 영역을 클릭한것으로 한다
if (ItemClick != null)
ItemClick(this, new ClickEventArgs(item.idx));
}
}
}
}
}

View File

@@ -0,0 +1,168 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
namespace UIControl
{
public static class Utility
{
public static Rectangle OffsetRect(this Rectangle rect, int x,int y)
{
var retval = new Rectangle(rect.X + x, rect.Y + y, rect.Width, rect.Height);
return retval;
}
public static void DrawString(this Graphics g,
string msg,
Font font,
Color fcolor,
RectangleF rect,
ContentAlignment textalign = ContentAlignment.MiddleCenter,
Color? ShadowColor = null,
Brush BackBrush = null,
Pen BorderPen = null)
{
DrawString(g, msg, font, fcolor, rect.toRect(), textalign, ShadowColor, BackBrush, BorderPen);
}
public static void DrawRectangle(this Graphics g, Pen pen, RectangleF rect)
{
g.DrawRectangle(pen, rect.Left, rect.Top, rect.Width, rect.Height);
}
public static void DrawString(this Graphics g,
string msg,
Font font,
Color fcolor,
Rectangle rect,
ContentAlignment textalign = ContentAlignment.MiddleCenter,
Color? ShadowColor = null,
Brush BackBrush = null,
Pen BorderPen = null)
{
//배경색 지정되어 있다면
if (BackBrush != null) g.FillRectangle(BackBrush, rect);
//테두리 지정되어 있다면
if (BorderPen != null) g.DrawRectangle(BorderPen, rect);
//그립자가 지정되있다면 별도 처리를 한다
if (ShadowColor != null && ShadowColor != Color.Transparent)
{
SizeF fsize;
var drawPT = GetTextPosition(g, msg, font, rect, textalign, out fsize);
//그림자를 먼저 그린다
g.DrawString(msg, font, new SolidBrush((Color)ShadowColor), drawPT.X + 1, drawPT.Y + 1);
g.DrawString(msg, font, new SolidBrush(fcolor), drawPT.X, drawPT.Y);
}
else
{
var sf = new StringFormat();
if (textalign == ContentAlignment.BottomCenter) { sf.Alignment = StringAlignment.Center; sf.LineAlignment = StringAlignment.Near; }
else if (textalign == ContentAlignment.BottomLeft) { sf.Alignment = StringAlignment.Near; sf.LineAlignment = StringAlignment.Near; }
else if (textalign == ContentAlignment.BottomRight) { sf.Alignment = StringAlignment.Far; sf.LineAlignment = StringAlignment.Near; }
else if (textalign == ContentAlignment.MiddleCenter) { sf.Alignment = StringAlignment.Center; sf.LineAlignment = StringAlignment.Center; }
else if (textalign == ContentAlignment.MiddleLeft) { sf.Alignment = StringAlignment.Near; sf.LineAlignment = StringAlignment.Center; }
else if (textalign == ContentAlignment.MiddleRight) { sf.Alignment = StringAlignment.Far; sf.LineAlignment = StringAlignment.Center; }
else if (textalign == ContentAlignment.TopCenter) { sf.Alignment = StringAlignment.Center; sf.LineAlignment = StringAlignment.Far; }
else if (textalign == ContentAlignment.TopLeft) { sf.Alignment = StringAlignment.Near; sf.LineAlignment = StringAlignment.Far; }
else if (textalign == ContentAlignment.TopRight) { sf.Alignment = StringAlignment.Far; sf.LineAlignment = StringAlignment.Far; }
else { sf.Alignment = StringAlignment.Center; sf.LineAlignment = StringAlignment.Center; }
g.DrawString(msg, font, new SolidBrush(fcolor), rect, sf);
sf.Dispose();
}
}
public static void DrawRect(this Graphics g, Rectangle rect, Color color, Color shadowColor, int pensize = 1)
{
//우측하단에 선을 그려준다. 일단은 검은색
g.DrawLine(new Pen(shadowColor, pensize), rect.Left + 1, rect.Bottom + 1, rect.Right - 1, rect.Bottom + 1);
g.DrawLine(new Pen(shadowColor, pensize), rect.Right + 1, rect.Top + 1, rect.Right + 1, rect.Bottom - 1);
DrawRect(g, rect, color, pensize);
}
public static void DrawRect(this Graphics g, Rectangle rect, Color color, int pensize = 1)
{
g.DrawRectangle(new Pen(color, pensize), rect);
}
public static void DrawRect(this Graphics g, RectangleF rect, Color color, int pensize = 1, Boolean shadow = false)
{
g.DrawRectangle(new Pen(color, pensize), rect.Left, rect.Top, rect.Width, rect.Height);
}
/// <summary>
/// Rectangle 개체를 반환 합니다. 단순 float -> int 로 값을 변환 합니다.
/// </summary>
/// <param name="rect"></param>
/// <returns></returns>
public static Rectangle toRect(this RectangleF rect)
{
return new Rectangle((int)rect.Left, (int)rect.Top, (int)rect.Width, (int)rect.Height); ;
}
static PointF GetTextPosition(Graphics g, string data, Font f, Rectangle rect, ContentAlignment align, System.Windows.Forms.Padding Padding, out SizeF fsize)
{
float x = 0;
float y = 0;
fsize = g.MeasureString(data, f);
if (align == ContentAlignment.MiddleCenter)
{
x = (rect.Width - fsize.Width) / 2 + Padding.Left - Padding.Right;
y = (rect.Height - fsize.Height) / 2 + Padding.Top - Padding.Bottom;
}
else if (align == ContentAlignment.MiddleLeft)
{
x = Padding.Left;
y = (rect.Height - fsize.Height) / 2;
}
else if (align == ContentAlignment.MiddleRight)
{
x = rect.Width - fsize.Width - Padding.Right;
y = (rect.Height - fsize.Height) / 2;
}
else if (align == ContentAlignment.BottomLeft)
{
x = Padding.Left;
y = rect.Height - fsize.Height - Padding.Bottom;
}
else if (align == ContentAlignment.BottomRight)
{
x = rect.Width - fsize.Width - Padding.Right;
y = rect.Height - fsize.Height - Padding.Bottom;
}
else if (align == ContentAlignment.BottomCenter)
{
x = (rect.Width - fsize.Width) / 2;
y = rect.Height - fsize.Height - Padding.Bottom;
}
else if (align == ContentAlignment.TopLeft)
{
x = Padding.Left;
y = Padding.Top;
}
else if (align == ContentAlignment.TopRight)
{
x = rect.Width - fsize.Width - Padding.Right;
y = Padding.Top;
}
else if (align == ContentAlignment.TopCenter)
{
x = (rect.Width - fsize.Width) / 2;
y = Padding.Top;
}
return new PointF(x + rect.Left, y + rect.Top);
}
static PointF GetTextPosition(Graphics g, string data, Font f, Rectangle rect, ContentAlignment align, out SizeF fsize)
{
return GetTextPosition(g, data, f, rect, align, new System.Windows.Forms.Padding(0), out fsize);
}
}
}

BIN
QRValidation/DLL/AMM.dll Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More