Library for XBus servo (under construction)

Dependents:   mbed_XBus_Test mbed_XBus_MotionTest XBusServoTest ControlYokutan2017_2 ... more

It's pre-opened page. it's still a little bit unstable to use command packet but mostly work. Tested only on KL25Z

暫定版ページです。 まだコマンドパケット使用時に時々不安定になりますが、概ね動作しています。 KL25Z上でのみ、動作確認しています

Revision:
18:75ddf12d93b6
Parent:
17:3ffb2e3e3bec
--- a/XBusServo.cpp	Thu Oct 30 05:11:46 2014 +0000
+++ b/XBusServo.cpp	Wed Nov 05 03:12:27 2014 +0000
@@ -10,8 +10,6 @@
 
 #include "XBusServo.h"
 #include "pinmap.h"
-#include "gpio_api.h"
-
 
 
 #define kXBusBaudrate           250000          // bps
@@ -258,7 +256,6 @@
 //    2014/10/24 : add to setup reading for command data packet
 //****************************************************************************
 void XBusServo::TxIrqHandler(void)
-//void XBusServo::TxIrqHandler(MODSERIAL_IRQ_INFO *q)
 {
     int             result = 0;
 //    DBG("XBusServo::TxIrqHandler\n");
@@ -306,7 +303,6 @@
 //    2014/10/24 : modify to get the data from 1st byte of buffer
 //****************************************************************************
 void XBusServo::RxIrqHandler(void)
-//void XBusServo::RxIrqHandler(MODSERIAL_IRQ_INFO *q)
 {
 //    DBG("XBusServo::RxIrqHandler\n");
 
@@ -362,8 +358,8 @@
 XBusError XBusServo::sendCommandDataPacket(uint8_t command, uint8_t channelID, uint8_t order, int16_t* value, uint8_t valueSize)
 {
     int                 sendSize;
-    int                 prevData = -1;
     uint8_t             dummy;
+    volatile uint8_t*   recieveDataPtr;
 
     DBG("XBusServo::sendCommandDataPacket\n");
 
@@ -394,22 +390,22 @@
     // send command
     sendSize = sendBuffer[kCmdDataPacketLength] + kPacketHeaderFooterSize;
     need2ReadData = ((! txOnly) && (channelID != 0));
-    recieveBuffer[sendSize + kCmdDataPacketLength] = 5;            // dummy to get real packet size
+    recieveDataPtr = &(recieveBuffer[sendSize]);
+    recieveDataPtr[kCmdDataPacketLength] = 5;            // dummy to get real packet size
     write(sendBuffer, sendSize);
 //    DBG("XBusServo::sendCommandDataPacket 2\n");
 
-    // if it's tx only mode or ID=0, it done
+    // if it's tx only mode or ID=0, it's done
     if (! need2ReadData) {
         flush();
         return kXBusError_NoError;
     }
 
 // wait to read all packet
-    while(recieveBufferPointer < (recieveBuffer[sendSize + kCmdDataPacketLength] + kPacketHeaderFooterSize + sendSize)) {
-        if (prevData != recieveBufferPointer) {
-            prevData = recieveBufferPointer;
-//           DBGF("XBusServo::sendCommandDataPacket 3 %02d %02X \n", recieveBufferPointer, recieveBuffer[recieveBufferPointer - 1]);
-        }
+    while(recieveBufferPointer < (recieveDataPtr[kCmdDataPacketLength] + kPacketHeaderFooterSize + sendSize)) {
+        if (recieveBufferPointer > 16)
+            break;                                  // some trouble happen
+            
         //                                           need to add time out
     }
 
@@ -421,26 +417,26 @@
     serialCommandBusy = false;
 
     // check CRC
-    if (crc8(recieveBuffer, recieveBuffer[kCHDataPacketLength] + 3) != 0) {
+    if (crc8((uint8_t*)recieveDataPtr, recieveDataPtr[kCHDataPacketLength] + 3) != 0) {
         DBG("XBusServo::sendCommandDataPacket kXBusError_CRCError\n");
         return kXBusError_CRCError;
     }
 
     // check unsupported
-    if (recieveBuffer[kCmdDataPacketOrder] == kXBusOrder_1_Unsupported) {
+    if (recieveDataPtr[kCmdDataPacketOrder] == kXBusOrder_1_Unsupported) {
         DBG("XBusServo::sendCommandDataPacket kXBusError_Unsupported\n");
         return kXBusError_Unsupported;
     }
 
     // send back the value
     if (valueSize == 1) {                   // 1 byte value
-        *value = recieveBuffer[sendSize + kCmdDataPacketData1];
+        *value = recieveDataPtr[kCmdDataPacketData1];
         if (*value & 0x0080)
             *value |= 0xFF00;
     } else {
-        *value = recieveBuffer[sendSize + kCmdDataPacketData1];
+        *value = recieveDataPtr[kCmdDataPacketData1];
         *value <<= 8;
-        *value |= recieveBuffer[sendSize + kCmdDataPacketData2];
+        *value |= recieveDataPtr[kCmdDataPacketData2];
     }
 
     return kXBusError_NoError;
@@ -652,7 +648,7 @@
 
     DBG("XBusServo::setChannelID\n");
 
-    if (txOnly)
+    if (! txOnly)
         return kXBusError_OnlyForTxOnlyMode;
 
     value = kXBusMode_IDSet;
@@ -677,9 +673,7 @@
 //****************************************************************************
 uint8_t XBusServo::getDataSize(uint8_t order)
 {
-    uint8_t        dataSize = 1;
-
-    DBG("XBusServo::getDataSize\n");
+ //   DBG("XBusServo::getDataSize\n");
 
     switch(order) {
         case kXBusOrder_2_Version:      // only for get
@@ -696,10 +690,10 @@
         case kXBusOrder_2_AlarmDelay:
         case kXBusOrder_2_CurrentPos:   // only for get
         case kXBusOrder_2_MaxInteger:
-            dataSize = 2;
+            return 2;
+        default:
+            return 1;
     }
-
-    return dataSize;
 }
 
 
@@ -753,7 +747,7 @@
 {
     DBG("XBusServo::setCommand\n");
 
-    if (txOnly)
+    if (! txOnly)
         return kXBusError_OnlyForTxOnlyMode;
 
     return sendCommandDataPacket(kXBusCmd_Set, 0, order, value, getDataSize(order));