コード例 #1
0
ファイル: queue.cs プロジェクト: shenyanjun/packet_tools
        public scan_handle_data pop_queue()
        {
            scan_handle_data d = null;

            if (_queue.Count > 0)
            {
                _mutex.WaitOne();
                d = _queue.Dequeue();
                _mutex.ReleaseMutex();
            }
            return(d);
        }
コード例 #2
0
ファイル: scanner.cs プロジェクト: shenyanjun/packet_tools
        //串口接收线程函数
        private void recvSCDataProc()
        {
            //开始标志
            bool start_recv_flag  = false;
            long timeout_readbyte = 0;

            bool start_sleep   = false;
            long timeout_sleep = 0;

            while (_sc_recv_flag)
            {
                try
                {
                    //先读取进来
                    byte data = (byte)_port.ReadByte();

                    if (start_sleep)
                    {
                        if ((DateTime.Now.Ticks - timeout_sleep) / 10000.0 > 200.0)
                        {
                            start_sleep = false;
                        }
                        else
                        {
                            continue;
                        }
                    }
                    //
                    if (!start_recv_flag)
                    {
                        start_recv_flag  = true;
                        timeout_readbyte = DateTime.Now.Ticks;
                        if (data == 0x0d)
                        {
                            continue;
                        }
                        else
                        {
                            _recv_data_queue.Enqueue(data);
                            continue;
                        }
                    }

                    //单个字节间隔超过100ms
                    if (start_recv_flag)
                    {
                        if ((DateTime.Now.Ticks - timeout_readbyte) / 10000.0 > 50.0)
                        {
                            _recv_data_queue.Clear();
                            timeout_readbyte = DateTime.Now.Ticks;
                            continue;
                        }
                    }

                    if (data != 0x0d)
                    {
                        _recv_data_queue.Enqueue(data);
                    }
                    else
                    {
                        start_recv_flag = false;//重新开始
                        if (_recv_data_queue.Count == 0)
                        {
                            continue;
                        }
                        else
                        {
                            string sn = Encoding.ASCII.GetString(_recv_data_queue.ToArray());
                            Console.WriteLine(sn);
                            scan_handle_data dat = new scan_handle_data();
                            dat.handle  = _scanner_handle;
                            dat.sn_data = sn;
                            //放入数据到队列
                            run_contex.instance()._sn_scan_queue.push_queue(dat);
                            _recv_data_queue.Clear();
                            //开始休眠
                            start_sleep   = true;
                            timeout_sleep = DateTime.Now.Ticks;
                        }
                    }
                }
                catch (Exception e)
                {
                    break;
                }
            }
        }
コード例 #3
0
ファイル: queue.cs プロジェクト: shenyanjun/packet_tools
 public void push_queue(scan_handle_data d)
 {
     _mutex.WaitOne();
     _queue.Enqueue(d);
     _mutex.ReleaseMutex();
 }
コード例 #4
0
ファイル: run_contex.cs プロジェクト: shenyanjun/packet_tools
        private void _procedure_logic(object p)
        {
            while (_logic_flags)
            {
                scan_handle_data d = _sn_scan_queue.pop_queue();
                if (d != null)
                {
                    //产品号
                    if (d.handle == 0)
                    {
                        //修改数据

                        /*
                         * if (mainForm.getMainForm()._changeValue) {
                         *  mainForm.getMainForm()._changeDlg.changeProductSN(d.sn_data);
                         *  continue;
                         * }
                         * */
                        //第一次输入产品,这时候把是否为满的状态置为非满状态
                        if (_allProductNums > 0 &&
                            (_allProductNums == _leaveProductNums) &&
                            _isFull &&
                            d.sn_data != "" && run_contex.instance()._curBoxsn != "")
                        {
                            _isFull = false;
                        }
                        if (_isFull)
                        {
                            if (run_contex.instance()._curBoxsn == "")
                            {
                                mainForm.getMainForm().setProductNum("请扫描箱号!");
                            }
                        }
                        //没满开始扫描
                        if (_isFull == false)
                        {
                            bool checkRes = false;
                            checkRes = checkSN(d.sn_data, _productSnFormula);
                            if (!checkRes)
                            {
                                mainForm.getMainForm().setProductNum("输入的产品号不对!");
                                //16/5/30 产品号重复也要提示
                                mainForm.getMainForm().PlayFileAudio("error.wav");
                                string snstatus = System.Environment.CurrentDirectory + "\\snstatus";
                                if (File.ReadAllLines(snstatus)[0].Trim() == "-1")
                                {
                                    mainForm.getMainForm().setRepeatWarnSNDlg();
                                }
                            }
                            if (!_isFull && _curFormula != "" &&
                                _curBoxsn != "" && checkRes)
                            {
                                mainForm.getMainForm().setProductNum(d.sn_data);
                                //
                                if (_scan_work_logic.onProductScanner(d.sn_data))
                                {
                                    _leaveProductNums = _allProductNums - _curProductNums;
                                    mainForm.getMainForm().setLeaveProductNum(_leaveProductNums.ToString());
                                    mainForm.getMainForm().setCurProductNum(_curProductNums.ToString());
                                    mainForm.getMainForm().setAllProductNum(_allProductNums.ToString());
                                    mainForm.getMainForm().setInsertRowData(d.sn_data); //插入数据
                                    mainForm.getMainForm().moveListTolast();            //滚动到最后
                                    if (_curProductNums >= _allProductNums)
                                    {
                                        //满了
                                        _isFull = true;
                                        run_contex.instance().material_ok = false;
                                        _curProductNums   = 0;
                                        _leaveProductNums = _allProductNums;
                                        _curBoxsn         = "";//箱号为空
                                        //fix bug
                                        _scan_work_logic.updateBoxset(run_contex.instance()._curFormula);
                                        //fix bug
                                        //打包完毕将箱号清零
                                        run_contex.instance()._curBoxsn = "";
                                        mainForm.getMainForm().setBoxNum("本箱产品已经打包完毕!");
                                        //string audiofile_scanok = System.Environment.CurrentDirectory + "\\提示音.wav";
                                        mainForm.getMainForm().PlayFileAudio();
                                    }
                                    else
                                    {
                                        string audiofile_scanok     = System.Environment.CurrentDirectory + "\\叮.wav";
                                        System.Media.SoundPlayer sp = new System.Media.SoundPlayer();
                                        sp.SoundLocation = audiofile_scanok;
                                        sp.PlaySync();
                                    }
                                }
                            }
                            else if (_isFull)
                            {
                                mainForm.getMainForm().setProductNum("请扫描箱号!");
                            }
                        }
                    }
                    //箱号
                    if (d.handle == 1)
                    {
                        //--------------------------------------------------
                        //这里有bug

                        /*
                         * if (mainForm.getMainForm()._changeValue) {
                         *  //更改箱号
                         *  mainForm.getMainForm()._changeDlg.changeBoxSN(d.sn_data);
                         *  run_contex.instance()._curBoxsn = d.sn_data;//更改box sn
                         *  continue;
                         * }
                         * */
                        //新加入的料号检查
                        if (_isFull && run_contex.instance()._env.material_num != "0" &&
                            !run_contex.instance().material_ok)
                        {
                            if (d.sn_data.Trim() != run_contex.instance()._env.material_num)
                            {
                                System.Windows.Forms.MessageBox.Show("请先用箱号扫描枪扫入料号!");
                            }
                            else
                            {
                                run_contex.instance().material_ok = true;
                                mainForm.getMainForm().updateInfo("提示信息:扫描料号成功!");
                            }
                            return;
                        }
                        mainForm.getMainForm().updateInfo("提示信息:");
                        //---------------------------------------------------
                        //满了,并且检查到箱号符合规则,并且配方有效
                        bool checkres = checkSN(d.sn_data, _boxSnFormula);
                        if (_isFull && checkres && _curFormula != "")
                        {
                            //更新box_set属性
                            if (!_scan_work_logic.onPBoxScanner(d.sn_data))
                            {
                                System.Threading.Thread.Sleep(500);
                                run_contex.instance()._curBoxsn = "";//清掉箱号
                                mainForm.getMainForm().setBoxNum("请不要输入重复的箱号!");
                                //

                                /*
                                 * mainForm.getMainForm().logRepeatTime("重复的箱号:", d.sn_data);
                                 * mainForm.getMainForm().PlayFileAudio("Repeat.wav");
                                 * string status = System.Environment.CurrentDirectory + "\\status";
                                 * if (File.ReadAllLines(status)[0].Trim() == "-1") {
                                 *  mainForm.getMainForm().setRepeatWarnDlg();
                                 * }
                                 * */
                                continue;
                            }
                            mainForm.getMainForm().setBoxNum(d.sn_data);
                            //重新开始计数
                            if (_curProductNums == 0)
                            {
                                //不重复则返回true
                                if (_scan_work_logic.onPBoxScanner(d.sn_data))
                                {
                                    //这里是一个bug会造成输入连续第二遍箱号输入不进去的情况,所以必须是触发了扫描箱号才能设置
                                    //_isFull = false;
                                    run_contex.instance()._leaveProductNums = run_contex.instance()._allProductNums;//触发设置剩余箱数目,因为要用到
                                    mainForm.getMainForm().setAllProductNum(_allProductNums.ToString());
                                    mainForm.getMainForm().setLeaveProductNum(_allProductNums.ToString());
                                    mainForm.getMainForm().setCurProductNum(_curProductNums.ToString());
                                    mainForm.getMainForm().setProductNum("");
                                    //mainForm.getMainForm().setBoxNum("");
                                }
                                else
                                {
                                    System.Threading.Thread.Sleep(500);
                                    mainForm.getMainForm().setBoxNum("请不要输入重复的箱号!");
                                    run_contex.instance()._curBoxsn = "";//清掉箱号
                                    _isFull = true;
                                    //

                                    /*
                                     * mainForm.getMainForm().logRepeatTime("重复的箱号:", d.sn_data);
                                     * mainForm.getMainForm().PlayFileAudio("Repeat.wav");
                                     * string status = System.Environment.CurrentDirectory + "\\status";
                                     * if (File.ReadAllLines(status)[0].Trim() == "-1") {
                                     *  mainForm.getMainForm().setRepeatWarnDlg();
                                     * }
                                     * */
                                }
                            }
                        }
                        else if (!checkres)
                        {
                            mainForm.getMainForm().setBoxNum("请检查输入的箱号是否符合规则!");
                        }
                    }
                }
                else
                {
                    Thread.Sleep(100);
                }
            }
        }