Пример #1
0
        public bool isUpdateFrame(byte[] frame)
        {
            bool rv;
            byte order;

            byte[]     data;
            insertData insdata;
            checkData  ckdata;

            rv      = true;
            order   = 0;
            data    = null;
            insdata = new insertData();
            ckdata  = new checkData();

            //(2)解帧操作
            if (!frameDecode(frame, ref data, ref order))
            {
                rv = false;
                goto isUpdateFrame_EXIT;  //解帧失败
            }
            //(3)判断帧长
            if (data.Length != Marshal.SizeOf(insdata) && data.Length != Marshal.SizeOf(ckdata))
            {
                rv = false;
                goto isUpdateFrame_EXIT;  //解帧失败
            }

isUpdateFrame_EXIT:
            return(rv);
        }
Пример #2
0
        public async Task <IActionResult> insertnewAsync([FromBody] insertData body)
        {
            await Db.Connection.OpenAsync();

            var query = new employee(Db);

            var result = new insertData();

            result.salutation   = body.salutation;
            result.firstName    = body.firstName;
            result.MiddleName   = body.MiddleName;
            result.lastName     = body.lastName;
            result.gender       = body.gender;
            result.nationality  = body.nationality;
            result.date         = body.date;
            result.addressLine1 = body.addressLine1;
            result.addressLine2 = body.addressLine2;
            result.Locality     = body.Locality;
            result.city         = body.city;
            result.contact      = body.contact;

            await query.insertAsync(result);

            return(new OkObjectResult(result));
        }
Пример #3
0
        public async Task insertAsync(insertData result)
        {
            using var cmd   = Db.Connection.CreateCommand();
            cmd.CommandText = @"insert into employee(salutationId,firstName,middleName,lastName,employeeGenderId,birthDate)values
(32,@salutation,@firstName,@middleName,@lastName,@gender,@date);
set @last_id=LAST_INSERT_ID();
insert into address(employeeId,addressLine1,
addressLine2,
landmark,cityId)
 values(@last_id,@addressLine1,@addressLine2,@Locality,@city);
 insert into contact_information(employeeId,contactNumber)
 values(@last_id,@contact);";
            BindParamsDATA(cmd, result.salutation, result.firstName, result.MiddleName, result.lastName, result.gender, result.date, result.contact, result.city);
            BindId(cmd, result.addressLine1, result.addressLine2, result.Locality);
            //bindParams

            cmd.CommandText = cmd.CommandText;

            await cmd.ExecuteNonQueryAsync();
        }
Пример #4
0
        private byte[] check;                 //检查帧状态,每1位表示一帧数据发送状态,1:已发送;0:未发送

        //======================================================================
        //函数名称:Update构造函数
        //函数返回:无
        //参数说明:hexList:待更新的Hex文件链表数据
        //功能概要:Update构造函数,根据传入的Hex数据构造返回终端的更新数据帧和命令帧
        //======================================================================
        public Update(List <hexStruct> hexList)
        {
            //(1)变量声明
            int        i;
            ushort     sum, cur;
            insertData insdata;

            //(2)获得传入的Hex文件链表数据
            this.hexList = hexList;
            //(3)初始化发送至终端的链表
            this.insertList = new List <insertData>();
            //(4)构造开始更新命令帧,数据任意,在发送至终端时命令需设为0
            insdata            = new insertData();
            insdata.insertInfo = new ushort[40];
            insdata.data       = new byte[400];
            this.insertList.Add(insdata);//将更新命令帧插入链表
            //(5)构造插入帧链表数据,发送时命令为1
            getBackList();
            //(6)构造更新检查帧和更新命令帧,数据任意,其对应的命令分别为2,3
            this.insertList.Add(insdata);  //添加更新检查帧
            this.insertList.Add(insdata);  //添加更新命令帧
            //(7)修改总帧数和帧号
            sum = (ushort)this.insertList.Count;
            cur = 0;
            for (i = 0; i < this.insertList.Count; i++)
            {
                insdata          = this.insertList[i];
                insdata.frameNum = sum;
                insdata.curFrame = cur++;
                this.insertList.RemoveAt(i);
                this.insertList.Insert(i, insdata);
            }
            //(8)初始化帧发送标识
            check = new byte[sum];
            for (i = 0; i < check.Length; i++)
            {
                check[i] = 0;
            }
        }
Пример #5
0
        public void setUserAddress(int useraddr)
        {
            //(1)变量声明
            int        i;
            ushort     sum, cur;
            insertData insdata;

            //(2)移除多余代码
            removeCurableCode();
            //(3)构造开始更新命令帧,数据任意,在发送至终端时命令需设为0
            insdata            = new insertData();
            insdata.insertInfo = new ushort[40];
            insdata.data       = new byte[400];
            this.insertList.Add(insdata);
            //(4)构造插入帧链表数据,发送时命令为1
            getBackList();
            //(5)构造更新检查帧和更新命令帧,数据任意,其对应的命令分别为2,3
            this.insertList.Add(insdata);  //添加更新检查帧
            this.insertList.Add(insdata);  //添加更新命令帧
            //(6)修改总帧数和帧号
            sum = (ushort)this.insertList.Count;
            cur = 0;
            for (i = 0; i < this.insertList.Count; i++)
            {
                insdata          = this.insertList[i];
                insdata.frameNum = sum;
                insdata.curFrame = cur++;
                this.insertList.RemoveAt(i);
                this.insertList.Insert(i, insdata);
            }
            //(12)初始化帧发送标识
            check = new byte[sum];
            for (i = 0; i < check.Length; i++)
            {
                check[i] = 0;
            }
        }
Пример #6
0
        //public bool isUpdateFrame(byte[] frame)
        //{
        //    bool rv;
        //    byte order;
        //    byte[] data;
        //    insertData insdata;
        //    checkData ckdata;

        //    rv = true;
        //    order = 0;
        //    data = null;
        //    insdata = new insertData();
        //    ckdata = new checkData();

        //    //(2)解帧操作
        //    if (!frameDecode(frame, ref data, ref order))
        //    {
        //        rv = false;
        //        goto isUpdateFrame_EXIT;  //解帧失败
        //    }
        //    //(3)判断帧长
        //    if (data.Length != Marshal.SizeOf(insdata) && data.Length != Marshal.SizeOf(ckdata))
        //    {
        //        rv = false;
        //        goto isUpdateFrame_EXIT;  //解帧失败
        //    }

        //isUpdateFrame_EXIT:
        //    return rv;
        //}



        //===========================内部函数==================================
        //======================================================================
        //函数名称:getBackList
        //函数返回:无
        //参数说明:无
        //功能概要:根据传入的Hex文件数据按照插入帧的格式构造数据帧(非命令帧)
        //======================================================================
        private void getBackList()
        {
            //(1)变量声明
            int    i, j;
            ushort addr;
            ushort len;
            ushort lastAddr;
            ushort lastLen;
            ushort sumLen;

            byte[] data;

            insertData idata;

            //(2)数据初始化
            idata            = new insertData();
            idata.insertInfo = new ushort[40];
            idata.data       = new byte[400];

            //(3)遍历Hex数据链表来构造返回插入链表
            for (i = 0; i < this.hexList.Count; i++)
            {
                //(3.1)获取本行数据基本信息
                //获取本行代码待插入的地址
                addr = this.hexList[i].address;
                //获取本行代码长度
                len = this.hexList[i].len;
                //获取本行代码数据
                data = this.hexList[i].data;

                //(3.2)进行插入帧赋值操作
                if (idata.insertNum == 0)  //判断当前行数据是否是第一个数据
                {
                    idata.operate       = 1;
                    idata.insertNum     = 1;
                    idata.insertInfo[0] = addr;
                    idata.insertInfo[1] = len;
                    Array.Copy(data, 0, idata.data, 0, len);
                }
                else  //其他情况
                {
                    //获取当前已插入的数据总长度
                    sumLen = 0;
                    for (j = 0; j < idata.insertNum; j++)
                    {
                        sumLen += idata.insertInfo[j * 2 + 1];
                    }
                    //判断已插入的数据是否超出上限,包括插入个数和总的插入数据长度
                    if ((idata.insertNum >= 20) || (sumLen + len > 400))  //超出界限,新建一帧数据
                    {
                        //将当前插入帧加入链表
                        this.insertList.Add(idata);
                        //新建一个插入帧并赋值
                        idata               = new insertData();
                        idata.insertInfo    = new ushort[40];
                        idata.data          = new byte[400];
                        idata.operate       = 1;
                        idata.insertNum     = 1;
                        idata.insertInfo[0] = addr;
                        idata.insertInfo[1] = len;
                        Array.Copy(data, 0, idata.data, 0, len);
                    }
                    else  //未超出上限,再本插入帧中继续添加数据
                    {
                        //判断本次插入数据是否与上次的相连
                        //先取出先前一行数据信息,包括地址和长度
                        lastAddr = idata.insertInfo[(idata.insertNum - 1) * 2];
                        lastLen  = idata.insertInfo[(idata.insertNum - 1) * 2 + 1];
                        if (lastAddr + lastLen == addr)  //相连,添加数据并修改上次数据长度
                        {
                            Array.Copy(data, 0, idata.data, sumLen, len);
                            idata.insertInfo[(idata.insertNum - 1) * 2 + 1] += len;
                        }
                        else  //不相连,添加新的数据
                        {
                            idata.insertInfo[idata.insertNum * 2]     = addr;
                            idata.insertInfo[idata.insertNum * 2 + 1] = len;
                            idata.insertNum++;
                            Array.Copy(data, 0, idata.data, sumLen, len);
                        }
                    }
                } //end if
            }     //end for
            //(4)结束遍历,把最后的插入帧加入链表
            this.insertList.Add(idata);
        }
Пример #7
0
        //======================================================================
        //函数名称:updateRecv
        //函数返回:0:数据命令帧发送成功;
        //          1:解帧操作失败;2:当前更新发生错误,更新操作需重新开始;
        //          3:检查操作失败;4:其他未知指令
        //参数说明:frame:终端返回的帧数据
        //功能概要:数据命令帧发送至终端后,终端返回数据至frame。
        //          解析frame数据来判断终端操作状态
        //======================================================================
        public int updateRecv(byte[] frame)
        {
            //(1)变量声明
            int  i;
            int  rv;   //返回值
            byte order;

            byte[]     data;
            ushort     framenum;
            ushort     curframe;
            insertData insdata;
            checkData  ckdata;

            rv       = 0; //返回值默认成功,为0
            order    = 0;
            data     = null;
            framenum = 0;
            curframe = 0;
            insdata  = new insertData();
            ckdata   = new checkData();

            //(2)解帧操作
            if (!frameDecode(frame, ref data, ref order))
            {
                rv = 1;
                goto updateRecv_EXIT;  //解帧失败
            }
            //(3)命令判断
            switch (order)
            {
            case 4:                                         //(3.1)终端数据接收成功
                //判断返回的帧结构
                if (data.Length == Marshal.SizeOf(insdata)) //满足插入帧
                {
                    //将byte数据转换为对应的更新帧结构体数据
                    insdata  = (insertData)bytesToStruct(data, typeof(insertData));
                    framenum = insdata.frameNum;
                    curframe = insdata.curFrame;
                }
                //修改发送标识
                check[curframe] = 1;    //数据发送成功
                //若终端接收到开始更新命令,check
                if (curframe == 0)
                {
                    for (i = 1; i < check.Length; i++)
                    {
                        check[i] = 0;                                     //check数组初始值为0
                    }
                }
                break;

            case 5:                                //(3.2)当前更新发生错误,更新操作得重新开始
                for (i = 0; i < check.Length; i++) //check数组重新赋值为0
                {
                    check[i] = 0;
                }
                rv = 2;
                break;

            case 6:      //(3.3)检查操作失败
                if (data.Length == Marshal.SizeOf(ckdata))
                {
                    //将byte数组解析为对应的检查帧结构体数据
                    ckdata = (checkData)bytesToStruct(data, typeof(checkData));
                    //根据终端返回的未接收帧号来修改check数组
                    for (i = 0; i < ckdata.loseNum; i++)
                    {
                        check[ckdata.loseFrame[i]] = 0;
                    }
                    rv = 3;
                }
                break;

            default:     //其他未知命令
                rv = 4;
                break;
            }

updateRecv_EXIT:
            return(rv);
        }