示例#1
0
        private bool SendHexDate(Stm8HexData hd, int row)
        {
            int retryCnt = 0;

            while (retryCnt < 5)
            {
                UpdateProgress(String.Format(" {0:X2}:", hd.Page));
                if (hd == null)
                {
                    UpdateLog(String.Format("\r\n\r\n第 {0} 筆資料錯誤, 燒錄停止......\r\n", row));
                    return(false);
                }
                else
                {
                    byte servoResponse;
                    if (!WriteStm8HexData(hd, out servoResponse))
                    {
                        UpdateLog("\r\n\r\n燒錄失敗......\r\n", true);
                        // This case may retry
                        // return false;
                    }
                    else
                    {
                        if (servoResponse == 0xA0)
                        {
                            break;
                        }

                        // retry for any case even A1

                        /*
                         * if (servoResponse != 0xA1)
                         * {
                         *  UpdateLog("\r\n\r\n回傳不正常, 燒錄停止......\r\n", true);
                         *  // return false;
                         * }
                         */
                    }
                }
                UpdateProgress("ERR ");
                retryCnt++;
            }
            if (retryCnt >= 5)
            {
                UpdateLog(String.Format("\r\n\r\n第 {0} 筆資料多次傳送錯誤, 燒錄停止......\r\n", row));
                return(false);
            }
            UpdateProgress("OK ");
            return(true);
        }
示例#2
0
        public bool ReadFile(List <string> txtData)
        {
            data = new List <Stm8HexData>();
            if (txtData.Count == 0)
            {
                return(true);
            }

            string r1 = txtData[0];
            int    page, offset, dataLen;

            if (!Stm8HexData.GetPage(r1, out page, out offset, out dataLen))
            {
                return(false);
            }
            if (offset != 0)
            {
                return(false);
            }

            startPage = (byte)page;

            dataRowCnt = 0;
            int  line    = 0;
            int  cmdPage = startPage;
            bool goNext  = true;

            while (goNext && (line < txtData.Count))
            {
                Stm8HexData hd      = new Stm8HexData(cmdPage);
                int         dataRow = 0;
                if (hd.ReadData(line, txtData, out dataRow))
                {
                    dataRowCnt += dataRow;
                    data.Add(hd);
                }
                else
                {
                    goNext = false;
                    break;
                }
                cmdPage++;
                line += 4;
            }
            return(true);
        }
示例#3
0
 private bool WriteStm8HexData(Stm8HexData hd, out byte servoReturn)
 {
     UpdateLog("\r\n=> ");
     receiveBuffer.Clear();
     byte[] startCode = { 0xA7, hd.Page };
     SerialSendByte(startCode);
     if (receiveBuffer.Count > 0)
     {
         // unexpected return;
         byte[] b = ShowReceiveBuffer();
         servoReturn = b[b.Length - 1];  // just check the last one is enqugh
         return(false);
     }
     for (int i = 0; i < 64; i++)
     {
         SerialSendByte(hd.Data(i));
         if (ServoReturned(out servoReturn))
         {
             return(false);
         }
     }
     SerialSendByte(hd.CheckSum);
     return(WaitServoReturn(out servoReturn));
 }
示例#4
0
        private bool WriteEmptyPage(byte page, out byte servoReturn)
        {
            Stm8HexData hd = new Stm8HexData(page);

            return(WriteStm8HexData(hd, out servoReturn));
        }
示例#5
0
        private void GoBurn()
        {
            UpdateInfo("偵測舵機");
            UpdateLog("偵測舵機.\r\n=> ", true);
            bool waitReply = true;
            int  sendCnt   = 0;
            int  maxSend   = 500;
            byte lastByte  = 0;

            while (waitReply)
            {
                if (sendCnt > maxSend)
                {
                    UpdateLog("\r\n\r\n偵測超時: 舵機沒回應", true);
                    UpdateInfo("偵測超時: 舵機沒回應", UTIL.InfoType.error);
                    return;
                }

                SerialSendByte(0xA5, true);
                Thread.Sleep(10);
                sendCnt++;

                while (receiveBuffer.Count > 0)
                {
                    UpdateLog("\r\n<= ", true);
                    lastByte = receiveBuffer[0];
                    UpdateLog(String.Format(" {0:X2}", lastByte), true);
                    // Just for safety, differnt response from servo, A0 & A1 may cause by previous incomplete write
                    if ((lastByte == 0xA9) || (lastByte == 0xE9) || (lastByte == 0xA1) || (lastByte == 0xA0))
                    {
                        waitReply = false;
                    }
                    receiveBuffer.RemoveAt(0);
                }
            }

            if ((lastByte == 0xA0) || (lastByte == 0xA1))
            {
                string s1 = "偵測到之前燒錄未完成";
                string s2 = "安全起見, 請重置舵機, 再次重新燒錄.";

                UpdateLog(string.Format("\r\n\r\n!!!! {0} !!!!\r\n{1}", s1, s2), true);
                MessageBox.Show(s2, s1);
                return;
            }
            UpdateInfo("燒錄進行中, 請耐心等待......");
            UpdateLog("\r\n\r\n開始燒錄......\r\n", true);
            double nPage   = sendData.Count;
            byte   endPage = sendData.EndPage;

            if (endPage < 0x7F)
            {
                nPage += (0x7F - endPage);
            }
            for (int i = 0; i < sendData.Count; i++)
            {
                Stm8HexData hd = sendData.GetHexData(i);
                if (!SendHexDate(hd, i))
                {
                    return;
                }
                UpdatePorgress((double)100.0 * i / nPage);
            }
            for (int i = endPage + 1; i < 0x80; i++)
            {
                Stm8HexData hd = new Stm8HexData(i);
                hd.Reset();
                if (!SendHexDate(hd, 999))
                {
                    return;
                }
                UpdatePorgress((double)100.0 * (sendData.Count + i) / nPage);
            }
            UpdatePorgress(100);

            UpdateLog("\r\n=> ");
            SerialSendByte(0xA9);
            if (WaitServoReturn(out lastByte))
            {
                if (lastByte == 0xA0)
                {
                    UpdateLog("\r\n\r\n燒錄完成\r\n", true);
                    UpdateInfo("燒錄順利完成");
                    return;
                }
            }

            UpdateLog("\r\n\r\n燒錄完成, 但終結的 0xA9 沒回傳 A0\r\n", true);
            UpdateInfo("燒錄完成, 但終結的 0xA9 沒回傳");
            return;
        }
示例#6
0
        private void GoBurn()
        {
            writeSend = true;
            UpdateInfo("偵測舵機");
            UpdateLog("偵測舵機.\r\n=> ", true);
            bool waitReply = true;
            int  sendCnt   = 0;
            int  maxSend   = 500;
            byte lastByte  = 0;

            receiveBuffer.Clear();
            while (waitReply)
            {
                if (sendCnt > maxSend)
                {
                    UpdateLog("\r\n\r\n偵測超時: 舵機沒回應", true);
                    UpdateInfo("偵測超時: 舵機沒回應", MyUtil.UTIL.InfoType.error);
                    return;
                }

                if (!writeSend)
                {
                    writeSend = true;
                    UpdateLog("\r\n=> ", true);
                }
                SerialSendByte(0xA5, true);
                Thread.Sleep(10);
                sendCnt++;

                while (receiveBuffer.Count > 0)
                {
                    writeSend = false;
                    UpdateLog("\r\n<= ", true);
                    lastByte = receiveBuffer[0];
                    UpdateLog(String.Format(" {0:X2}", lastByte), true);
                    receiveBuffer.RemoveAt(0);

                    if ((lastByte == 0xA9) || (lastByte == 0xA1) || (lastByte == 0xA0))
                    {
                        waitReply = false;
                        break;
                    }
                }
            }

            // cleanup buffer, just for safety
            Thread.Sleep(1000);
            if (receiveBuffer.Count > 0)
            {
                for (int i = 0; i < receiveBuffer.Count; i++)
                {
                    UpdateLog(String.Format(" {0:X2}", receiveBuffer[i]), true);
                }
            }
            receiveBuffer.Clear();

            // for very very very rare case, the data can complete a previous transaction, and got a A0 return.
            // It's almost mission impossible, just keep the logic for safety check
            if (lastByte == 0xA0)
            {
                string s1 = "偵測到之前燒錄未完成";
                string s2 = "安全起見, 請重置舵機, 再次重新燒錄.";

                UpdateLog(string.Format("\r\n\r\n!!!! {0} !!!!\r\n{1}", s1, s2), true);
                MessageBox.Show(s2, s1);
                return;
            }

            UpdateInfo("燒錄進行中, 請耐心等待......");
            UpdateLog("\r\n\r\n開始燒錄......\r\n", true);
            double nPage   = sendData.Count;
            byte   endPage = sendData.EndPage;

            if (endPage < 0x7F)
            {
                nPage += (0x7F - endPage);
            }
            for (int i = 0; i < sendData.Count; i++)
            {
                Stm8HexData hd = sendData.GetHexData(i);
                if (!SendHexDate(hd, i))
                {
                    UpdateInfo(string.Format("Error sending page {0}", i));
                    return;
                }
                UpdatePorgress((double)100.0 * i / nPage);
            }
            for (int i = endPage + 1; i < 0x80; i++)
            {
                Stm8HexData hd = new Stm8HexData(i);
                hd.Reset();
                if (!SendHexDate(hd, 999))
                {
                    UpdateInfo("Error sending last page");
                    return;
                }
                UpdatePorgress((double)100.0 * (sendData.Count + i) / nPage);
            }
            UpdatePorgress(100);

            UpdateLog("\r\n=> ");
            SerialSendByte(0xA9);

            /*
             * if (WaitServoReturn(out lastByte))
             * {
             *  if (lastByte == 0xA0)
             *  {
             *      UpdateLog("\r\n\r\n燒錄順利完成\r\n", true);
             *      UpdateInfo("燒錄順利完成");
             *      return;
             *  }
             * }
             */
            UpdateLog("\r\n\r\n燒錄完成\r\n", true);
            UpdateInfo("燒錄完成");
            return;
        }