예제 #1
0
            public bool BeginBoot()
            {
                BaseSession         = new Session();
                Session.BaseSession = BaseSession;

                Shell                  = new Bin.Bash(NewPid());
                BaseSession.Shell      = Shell;
                BaseSession.MainSystem = this;
                Shell.StdOut.WriteLine("Booting...");

                MainDeviceManager = new Device.DeviceManager(this);

                RootDrive            = new FileSystem.FileSystem(this);
                RootDrive.RootFolder = Path.Combine(Directory.GetCurrentDirectory(), "root");
                Directory.CreateDirectory(RootDrive.RootFolder);
                ActivePrograms = new Dictionary <int, Bin.Program>();

                BinPrograms = new Dictionary <string, Type>();
                AddProgram("echo", typeof(Bin.Echo));
                AddProgram("pwd", typeof(Bin.Pwd));
                AddProgram("cd", typeof(Bin.Cd));
                AddProgram("cp", typeof(Bin.Cp));
                AddProgram("ls", typeof(Bin.Ls));
                AddProgram("clear", typeof(Bin.Clear));
                AddProgram("lua", typeof(Bin.RunLua));
                AddProgram("cat", typeof(Bin.Cat));
                AddProgram("mkdir", typeof(Bin.Mkdir));
                AddProgram("mv", typeof(Bin.Mv));
                AddProgram("rm", typeof(Bin.Rm));
                AddProgram("ln", typeof(Bin.Ln));
                AddProgram("mkdevice", typeof(Bin.MakeDevice));

                RootDrive.MakeDirectory(new NixPath("/dev"), true);
                Device.CharacterDevice device = new Device.NullDevice();
                MainDeviceManager.AddDevice(device);
                RootDrive.MakeCharacterDevice(new NixPath("/dev/null"), device.Id);

                device = new Device.ZeroDevice();
                MainDeviceManager.AddDevice(device);
                RootDrive.MakeCharacterDevice(new NixPath("/dev/zero"), device.Id);

                device = new Device.TestDevice();
                MainDeviceManager.AddDevice(device);
                RootDrive.MakeCharacterDevice(new NixPath("/dev/test"), device.Id);

                /*
                 * Terminal term = GetComponent<Terminal>();
                 * if (term != null)
                 * {
                 *  //term.Shell = Shell;
                 *  //term.CurrentSession = BaseSession;
                 * }
                 */

                Shell.StdOut.WriteLine("Booting Complete...");

                Shell.ExecuteAsync(this, BaseSession, new string[] { "" });

                return(true);
            }
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="cfg">設定クラス</param>
 /// <param name="_recipeNo">レシピ番号</param>
 /// <param name="_user">作業者</param>
 public ControllerInspection(Config.ConfigDataManager cfg, Device.DeviceManager dev, string _recipeNo, Operator _user)
 {
     m_recipeNo = _recipeNo;
     m_user     = _user;
     m_devMgr   = dev;
     m_cfg      = cfg;
 }
예제 #3
0
        /// <summary>
        /// Обновление дерева на основе текущих устройств проекта.
        /// </summary>
        /// <param name="deviceManager">Менеджер устройств проекта.</param>
        /// <param name="checkedDev">Выбранные устройства.</param>
        private void Refresh(Device.DeviceManager deviceManager,
                             string checkedDev)
        {
            devicesTreeViewAdv.BeginUpdate();

            devicesTreeViewAdv.Model = null;
            devicesTreeViewAdv.Refresh();
            var treeModel = new TreeModel();

            string mainNodeName = "Устройства проекта";
            var    root         = new Node(mainNodeName);

            treeModel.Nodes.Add(root);

            // Подтипы, которые отдельно записываем в устройства
            var devicesSubTypesEnum = new string[]
            {
                "AI_VIRT",
                "AO_VIRT",
                "DI_VIRT",
                "DO_VIRT"
            };

            object[] devicesArray = GenerateArrayObjectsForFill(
                devicesSubTypesEnum);
            FillMainDevicesInNode(root, devicesArray);

            Dictionary <string, int> countDev = MakeDevicesCounterDictionary(
                root.Nodes);

            foreach (Device.IODevice dev in deviceManager.Devices)
            {
                string deviceDescription = GenerateDeviceDescription(dev);
                string devSubType        = dev.GetDeviceSubTypeStr(dev.DeviceType,
                                                                   dev.DeviceSubType);
                if (devicesSubTypesEnum.Contains(devSubType))
                {
                    FillSubTypeNode(dev, root, deviceDescription, countDev);
                }
                else
                {
                    FillTypeNode(dev, root, deviceDescription, countDev,
                                 checkedDev);
                }
            }

            UpdateDevicesCountInHeaders(devicesArray, root, countDev);
            SortTreeView(treeModel);

            devicesTreeViewAdv.Model = treeModel;

            List <TreeNodeAdv> nodes    = devicesTreeViewAdv.AllNodes.ToList();
            TreeNodeAdv        treeNode = nodes[0];

            OnHideOperationTree.Execute(treeNode);

            devicesTreeViewAdv.ExpandAll();
            devicesTreeViewAdv.Refresh();
            devicesTreeViewAdv.EndUpdate();
        }
예제 #4
0
        virtual public void ModifyDevNames(int newTechObjectN,
                                           int oldTechObjectN, string techObjectName)
        {
            List <int> tmpIndex = new List <int>();

            foreach (int index in deviceIndex)
            {
                tmpIndex.Add(index);
            }

            Device.DeviceManager deviceManager = Device.DeviceManager
                                                 .GetInstance();
            foreach (int index in deviceIndex)
            {
                var             newDevName = string.Empty;
                Device.IODevice device     = deviceManager.GetDeviceByIndex(index);
                int             objNum     = device.ObjectNumber;
                string          objName    = device.ObjectName;

                if (objNum > 0)
                {
                    //Для устройств в пределах объекта меняем номер объекта.
                    if (techObjectName == objName)
                    {
                        // COAG2V1 --> COAG1V1
                        if (objNum == newTechObjectN && oldTechObjectN != -1)
                        {
                            newDevName = objName + oldTechObjectN +
                                         device.DeviceType.ToString() + device.
                                         DeviceNumber;
                        }
                        if (oldTechObjectN == -1 ||
                            oldTechObjectN == objNum)
                        {
                            //COAG1V1 --> COAG2V1
                            newDevName = objName + newTechObjectN +
                                         device.DeviceType.ToString() + device
                                         .DeviceNumber;
                        }
                    }
                }

                if (newDevName != string.Empty)
                {
                    int indexOfDeletingElement = tmpIndex.IndexOf(index);
                    tmpIndex.Remove(index);
                    int tmpDevInd = Device.DeviceManager.GetInstance()
                                    .GetDeviceIndex(newDevName);
                    if (tmpDevInd >= 0)
                    {
                        tmpIndex.Insert(indexOfDeletingElement, tmpDevInd);
                    }
                }
            }

            deviceIndex = tmpIndex;
        }
예제 #5
0
        /// <summary>
        /// Сохранение в виде таблицы Lua.
        /// </summary>
        /// <param name="prefix">Префикс (для выравнивания).</param>
        /// <returns>Описание в виде таблицы Lua.</returns>
        public virtual string SaveAsLuaTable(string prefix)
        {
            if (deviceIndex.Count == 0)
            {
                return("");
            }

            string res = prefix;

            if (LuaName != "")
            {
                res += LuaName + " = ";
            }

            res += "--" + name + "\n" + prefix + "\t{\n";

            res += prefix + "\t";
            Device.DeviceManager deviceManager = Device.DeviceManager.
                                                 GetInstance();
            int devicesCounter = 0;

            foreach (int index in deviceIndex)
            {
                if (deviceManager.GetDeviceByIndex(index).Name !=
                    StaticHelper.CommonConst.Cap)
                {
                    devicesCounter++;
                    res += "'" + deviceManager.GetDeviceByIndex(index).Name +
                           "', ";
                }
            }

            if (devicesCounter == 0)
            {
                return("");
            }

            res  = res.Remove(res.Length - 2, 2);
            res += "\n";

            res += prefix + "\t},\n";
            return(res);
        }
예제 #6
0
        virtual public void ModifyDevNames(string newTechObjectName,
                                           int newTechObjectNumber, string oldTechObjectName,
                                           int oldTechObjNumber)
        {
            List <int> tmpIndex = new List <int>();

            foreach (int index in deviceIndex)
            {
                tmpIndex.Add(index);
            }

            Device.DeviceManager deviceManager = Device.DeviceManager
                                                 .GetInstance();
            foreach (int index in deviceIndex)
            {
                string          newDevName = string.Empty;
                Device.IODevice device     = deviceManager.GetDeviceByIndex(index);
                int             objNum     = newTechObjectNumber;
                string          objName    = device.ObjectName;

                if (objName == oldTechObjectName &&
                    device.ObjectNumber == oldTechObjNumber)
                {
                    newDevName = newTechObjectName + objNum +
                                 device.DeviceType.ToString() + device.DeviceNumber;
                }

                if (newDevName != string.Empty)
                {
                    int indexOfDeletingElement = tmpIndex.IndexOf(index);
                    tmpIndex.Remove(index);
                    int tmpDevInd = Device.DeviceManager.GetInstance()
                                    .GetDeviceIndex(newDevName);
                    if (tmpDevInd >= 0)
                    {
                        tmpIndex.Insert(indexOfDeletingElement, tmpDevInd);
                    }
                }
            }

            deviceIndex = tmpIndex;
        }
예제 #7
0
        /// <summary>
        /// Получить индексы устройств
        /// </summary>
        /// <param name="values">Список значений</param>
        /// <returns></returns>
        private List <int> GetDevicesIndexes(ref List <string> values)
        {
            Device.DeviceManager deviceManager = Device.DeviceManager
                                                 .GetInstance();
            var indexes      = new List <int>();
            var copiedValues = new string[values.Count];

            values.CopyTo(copiedValues);

            foreach (var copiedValue in copiedValues)
            {
                int index = deviceManager.GetDeviceIndex(copiedValue);
                if (index >= 0)
                {
                    indexes.Add(index);
                    values.Remove(copiedValue);
                }
            }

            return(indexes);
        }
예제 #8
0
        /// <summary>
        /// Построение дерева на основе определенных устройств проекта.
        /// </summary>
        /// <param name="deviceManager">Менеджер устройств проекта.</param>
        /// <param name="devTypes">Показывать данные типы устройств.</param>
        /// /// <param name="devSubTypes">Показывать данные подтипы устройств.
        /// </param>
        public bool ShowDevices(Device.DeviceManager deviceManager,
                                Device.DeviceType[] devTypes, Device.DeviceSubType[] devSubTypes,
                                bool showChannels, bool showCheckboxes, string checkedDev,
                                OnSetNewValue fn, bool isRebuiltTree = false)
        {
            prevShowChannels   = showChannels;
            prevShowCheckboxes = showCheckboxes;

            if (fn != null)
            {
                functionAfterCheck = fn;
            }

            if (showCheckboxes)
            {
                devicesTreeViewAdv.NodeControls.Insert(0, nodeCheckBox);
            }
            else
            {
                devicesTreeViewAdv.NodeControls.Remove(nodeCheckBox);
            }

            //Проверяем на изменение типов отображаемых устройств.
            if (Equals(devTypes, devTypesLastSelected) &&
                Equals(devSubTypes, devSubTypesLastSelected) &&
                isRebuiltTree == false)
            {
                ShowDlg();
                return(true);
            }

            devTypesLastSelected    = devTypes;
            devSubTypesLastSelected = devSubTypes;

            Refresh(deviceManager, checkedDev);

            ShowDlg();
            return(true);
        }
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="cfg">設定クラス</param>
 /// <param name="dev">デバイス管理クラス</param>
 public ControllerDebug(Config.ConfigDataManager cfg, Device.DeviceManager dev)
 {
     m_cfg    = cfg;
     m_devMgr = dev;
 }
예제 #10
0
        /// <summary>
        /// Обновление дерева на основе текущих устройств проекта.
        /// </summary>
        ///
        /// <param name="deviceManager">Менеджер устройств проекта.</param>
        /// <param name="checkedDev">Выбранные устройства.</param>
        private void Refresh(Device.DeviceManager deviceManager,
                             string checkedDev)
        {
            devicesTreeViewAdv.BeginUpdate();

            devicesTreeViewAdv.Model = null;
            devicesTreeViewAdv.Refresh();
            TreeModel treeModel = new TreeModel();

            Node root = new Node("Устройства проекта");

            treeModel.Nodes.Add(root);

            foreach (Device.DeviceType devType in Enum.GetValues(typeof(Device.DeviceType)))
            {
                Node r = new Node(devType.ToString());
                r.Tag = devType;
                root.Nodes.Add(r);
            }

            int[] countDev = new int[Enum.GetValues(typeof(Device.DeviceType)).Length];


            //Заполняем узлы дерева устройствами.
            foreach (Device.IODevice dev in deviceManager.Devices)
            {
                Node parent  = null;
                Node devNode = null;
                foreach (Node node in root.Nodes)
                {
                    if ((Device.DeviceType)node.Tag == dev.DeviceType)
                    {
                        parent = node;
                        break;
                    }
                }

                //Не найден тип устройства.
                if (parent == null)
                {
                    break;
                }

                // Если есть символы переноса строки
                string result = "";
                if (dev.Description.Contains('\n'))
                {
                    string[] devDescr = dev.Description.Split('\n');
                    foreach (string str in devDescr)
                    {
                        result += str + " ";
                    }
                }
                else
                {
                    result = dev.Description;
                }

                if (dev.ObjectName != "")
                {
                    string objectName = dev.ObjectName + dev.ObjectNumber;
                    Node   devParent  = null;

                    foreach (Node node in parent.Nodes)
                    {
                        if ((node.Tag is String) &&
                            (string)node.Tag == objectName)
                        {
                            devParent = node;
                            break;
                        }
                    }

                    if (devParent == null)
                    {
                        devParent     = new Node(objectName);
                        devParent.Tag = objectName;
                        parent.Nodes.Add(devParent);
                    }

                    devNode     = new Node(dev.DeviceType + dev.DeviceNumber.ToString() + "\t  " + result);
                    devNode.Tag = dev;
                    devParent.Nodes.Add(devNode);
                }
                else
                {
                    devNode     = new Node(dev.name + "\t  " + result);
                    devNode.Tag = dev;
                    parent.Nodes.Add(devNode);
                }

                //Check.
                checkedDev = ' ' + checkedDev + ' ';
                if (checkedDev != "  " && checkedDev.Contains(' ' + dev.Name + ' '))
                {
                    devNode.CheckState = CheckState.Checked;
                }
                else
                {
                    devNode.CheckState = CheckState.Unchecked;
                }

                bool isDevVisible = false;
                if (prevShowChannels)
                {
                    Node newNodeCh = null;

                    //Показываем каналы.
                    foreach (Device.IODevice.IOChannel ch in dev.Channels)
                    {
                        if (!ch.IsEmpty())
                        {
                            newNodeCh = new Node(ch.Name + " " + ch.Comment +
                                                 $" (A{ch.FullModule}:" + ch.PhysicalClamp + ")");
                            newNodeCh.Tag = ch;
                            devNode.Nodes.Add(newNodeCh);

                            if (noAssigmentBtn.Checked)
                            {
                                newNodeCh.IsHidden = true;
                            }
                            else
                            {
                                isDevVisible = true;
                            }
                        }
                        else
                        {
                            newNodeCh     = new Node(ch.Name + " " + ch.Comment);
                            newNodeCh.Tag = ch;
                            devNode.Nodes.Add(newNodeCh);

                            isDevVisible = true;
                        }
                    }
                }

                //Пропускаем устройства ненужных типов.
                if (devTypesLastSelected != null &&
                    !devTypesLastSelected.Contains(dev.DeviceType))
                {
                    devNode.IsHidden = true;
                }
                else
                {
                    if (devSubTypesLastSelected != null &&
                        !devSubTypesLastSelected.Contains(dev.DeviceSubType))
                    {
                        devNode.IsHidden = true;
                    }
                    else
                    {
                        if (prevShowChannels && !isDevVisible)
                        {
                            devNode.IsHidden = true;
                        }
                        else
                        {
                            countDev[(int)dev.DeviceType]++;
                        }
                    }
                }
            }

            //Обновляем названия строк (добавляем количество устройств).
            int idx   = 0;
            int total = 0;

            foreach (Device.DeviceType devType in Enum.GetValues(typeof(Device.DeviceType)))
            {
                foreach (Node node in root.Nodes)
                {
                    if ((Device.DeviceType)node.Tag == devType)
                    {
                        total    += countDev[idx];
                        node.Text = devType.ToString() + " (" + countDev[idx++] + ")  ";
                        break;
                    }
                }
            }

            root.Text = "Устройства проекта (" + total + ")";

            // Сортировка узлов
            List <Node> rootNodes = treeModel.Nodes.ToList();
            // [0] - узловой с названием проекта
            List <Node> nodeNodes = rootNodes[0].Nodes.ToList();

            // Сортируем узлы внутри каждого устройства Device
            foreach (Node node in nodeNodes)
            {
                TreeSort(node.Nodes.ToList(), node);
            }

            devicesTreeViewAdv.Model = treeModel;

            List <TreeNodeAdv> nodes    = devicesTreeViewAdv.AllNodes.ToList();
            TreeNodeAdv        treeNode = nodes[0];

            OnHideOperationTree.Execute(treeNode);

            devicesTreeViewAdv.ExpandAll();
            devicesTreeViewAdv.Refresh();
            devicesTreeViewAdv.EndUpdate();
        }
예제 #11
0
        /// <summary>
        /// 主処理
        /// </summary>
        public void MainProc()
        {
            // 機器設定ファイル
            if (!m_cfg.LoadDeviceConfigFiles())
            {
                CommonUI.MsgBox.Error("機器設定ファイルリードエラー");
                return;
            }

            // レシピファイルの一覧を取得
            if (!m_cfg.GetRecipeFiles())
            {
                CommonUI.MsgBox.Error("検査レシピファイル検索エラー");
                return;
            }
            if (m_cfg.RecipeFileList.Count == 0)
            {
                CommonUI.MsgBox.Error("検査レシピファイルが1件も存在しません");
                return;
            }
            log.Info("検査レシピ検出完了。 {0}件存在します : [{1}]", m_cfg.RecipeFileList.Count, string.Join(", ", m_cfg.RecipeFileList.Keys));

            // 作業者リストファイルから作業者リストを取得
            if (!m_cfg.ReadOperatorList())
            {
                CommonUI.MsgBox.Error("作業者リストファイルリードエラー");
                return;
            }

            // ユーザデータファイルの読み込み
            if (!m_cfg.LoadUserData())
            {
                // LoadUserData内でエラーポップアップを表示しているので何もしない
                return;
            }

            // 機器管理クラス
            m_devMgr = new Device.DeviceManager();
            // キー入力監視開始
            m_devMgr.StartKeyInput();
            m_devMgr.InputID += OnDeviceInputId;
            // 各機器のインスタンス作成
            if (!m_devMgr.CreateDevices())
            {
                CommonUI.MsgBox.Error("機器インスタンス生成エラー");
                return;
            }
            Enum err_dev;

            // 各機器のパラメータ設定
            if (!m_devMgr.SetParamAll(m_cfg, out err_dev))
            {
                CommonUI.MsgBox.Error($"機器設定値エラー({err_dev})");
                return;
            }
            // ライブラリ情報をログ出力
            Util.GetDllInfos().ForEach(info => log.Info("ライブラリ情報 {0}", info));

            var fmInput = new CommonUI.FormInputID(m_cfg.RecipeFileList.Keys, m_cfg.OperatorList);
            // ID入力画面表示
            var fmtask = UITask(fmInput);


            // ID入力画面終了待ち
            fmtask.Wait();

            if (m_user == null)
            {
                // ID入力画面で「終了」選択時
                return;
            }

            bool ctrRet;

            if (m_cfg.Mode != Config.ConfigBase.AppMode.Debug && m_user.ID != "9999999999")
            {
                // 検査モード
                var ctrlIns = new ControllerInspection(m_cfg, m_devMgr, m_recipeNo, m_user);
                ctrRet = ctrlIns.MainProc();

                string insErrorMsg = ctrlIns.GetErrorMsg();
                if (ctrRet)
                {
                    // エラー無し、正常にアプリを終了の場合
                    m_cfg.UnsendDataList = m_devMgr.CIM.GetUnsendDataList();
                    m_cfg.SaveUserData();

                    // 消灯
                    m_devMgr.PLC.SignalTower(Device.SigType.None);
                }
                else
                {
                    Task cimTask = Task.Run(() =>
                    {
                        // CIMにエラー報告
                        UploadEquipmentError();

                        // CIMから未送信データリストを取得、ユーザーデータ更新
                        m_cfg.UnsendDataList = m_devMgr.CIM.GetUnsendDataList();
                        m_cfg.SaveUserData();
                    });

                    // エラーメッセージが設定済みかどうか
                    if (insErrorMsg != null)
                    {
                        // エラーメッセージボックス表示
                        Task msgboxTask = Task.Run(() => CommonUI.MsgBox.Error(insErrorMsg));

                        // 赤点灯 & ブザー音(連続音)
                        m_devMgr.PLC.SignalTower(Device.SigType.Red | Device.SigType.BuzCont);

                        // エラーメッセージボックスが閉じられるのを待機する
                        msgboxTask.Wait();
                    }

                    // CIMエラー送信タスクの終了を待機する
                    cimTask.Wait();

                    // シグナルタワー赤(ブザー音無し)
                    m_devMgr.PLC.SignalTower(Device.SigType.Red);
                }
            }
            else
            {
                // デバッグモード
                var ctrlDbg = new ControllerDebug(m_cfg, m_devMgr);
                ctrRet = ctrlDbg.MainProc();
            }

            // 機器終了処理
            m_devMgr.Exit();
            // キー入力監視終了
            m_devMgr.InputID -= OnDeviceInputId;
            m_devMgr.StopKeyInput();
        }