OSDN Git Service

キャリブレーションの処理をリファクタリングした。
authorkouichi <kkoba@kirari-kobayashi.(none)>
Wed, 18 Sep 2013 14:51:49 +0000 (23:51 +0900)
committerkouichi <kkoba@kirari-kobayashi.(none)>
Wed, 18 Sep 2013 14:51:49 +0000 (23:51 +0900)
ETUtility.cpp
ETUtility.h
main.cpp

index b38a653..a25f5fb 100644 (file)
@@ -2,9 +2,10 @@
 #include "Lcd.h"
 #include "Bluetooth.h"
 #include "BTConnection.h"
-#include "Clock.h"
 #include "TouchSensor.h"
 #include "ETTailControl.h"
+#include "Speaker.h"
+#include "tsprintf.h"
 
 using namespace ecrobot;
 
@@ -70,3 +71,18 @@ void ETUtilityStuff::Waitstart(ecrobot::TouchSensor& touch,ecrobot::ETTailContro
     }
 }
 
+void ETUtilityStuff::DisplayCalibResult(Lcd& lcd,
+                                        Speaker& speaker,
+                                        char* disp,
+                                        const unsigned long offset,
+                                        const int tone,
+                                        const unsigned long y)
+{
+       char str[16+1];
+       tsprintf(str,disp,offset);
+       lcd.cursor(0,y);
+       lcd.putf("s",str);
+       lcd.disp();
+       speaker.playTone(tone,100,50);
+}
+
index 3362b0e..8757fbf 100644 (file)
@@ -1,10 +1,15 @@
 #ifndef ET_UTILITYSTUFF_H\r
 #define ET_UTILITYSTUFF\r
 \r
+#include "GyroSensor.h"\r
+#include "LightSensor.h"\r
+#include "Clock.h"\r
+\r
 namespace ecrobot{\r
     class TouchSensor;\r
     class ETTailControl;\r
-\r
+    class Lcd;\r
+    class Speaker;\r
     struct ETBluetoothString{\r
         static const char* PASS_KEY;\r
         static const char CMD_START;\r
@@ -15,6 +20,46 @@ namespace ecrobot{
         bool IsBluetoothReceived(char cmd);\r
         bool Istouched(ecrobot::TouchSensor& touch,ecrobot::ETTailControl& tailcontroler);\r
         void Waitstart(ecrobot::TouchSensor& touch,ecrobot::ETTailControl& tailcontroler,char cmd);\r
+        void DisplayCalibResult(Lcd& lcd,\r
+                                Speaker& speaker,\r
+                                char* disp,\r
+                                const unsigned long offset,\r
+                                const int tone,\r
+                                const unsigned long y);\r
+\r
+            template<class T>\r
+            struct traits{\r
+                unsigned long foo(T& x){\r
+                    return 0;\r
+                }\r
+            };\r
+\r
+            //traitsクラス(デフォルトはアルゴリズムA)\r
+            template<>\r
+            struct traits<GyroSensor>{\r
+                static unsigned long foo(GyroSensor& x){\r
+                    return x.get();\r
+                }\r
+            };\r
+            //traitsクラス(Hoge型はアルゴリズムB)\r
+            template<>\r
+            struct traits<LightSensor>{\r
+                static unsigned long foo(LightSensor& x){\r
+                    return x.getBrightness();\r
+                }\r
+            };\r
+\r
+            //タグごとに処理を切り替えて実行\r
+            template<class T>\r
+            unsigned long GetOffset(T & x,Clock& clock){\r
+                const int sum_num = 256;\r
+                unsigned long sum = 0;\r
+                for(int i=0;i<sum_num;i++){\r
+                    sum += traits<T>::foo(x);\r
+                    clock.wait(10);\r
+                }\r
+                return sum / sum_num;\r
+            }\r
     }\r
 }\r
 #endif /* ET_UTILITYSTUFF */\r
index f49dc61..1a02292 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -64,7 +64,6 @@ void ecrobot_device_terminate()
        ecrobot_term_bt_connection(); /* Bluetooth\92Ê\90M\82ð\8fI\97¹ */                                                 //ex4\r
 }\r
 \r
\r
 // nxtOSEK hook to be invoked from an ISR in category 2\r
 void user_1ms_isr_type2(void)\r
 {\r
@@ -89,53 +88,27 @@ TASK(TaskMain)
     tailcontroler.Init();\r
     tailcontroler.SetAngle(ETTailControl::ANGLE_STAND_UP);\r
 \r
-       // TODO:\82Æ\82è\82 \82¦\82¸\82Ì\83L\83\83\83\8a\83u\83\8c\81[\83V\83\87\83\93\r
-       static const int sum_num = 256;\r
-       unsigned long sum = 0;\r
-       char str[16+1];\r
+       // \83L\83\83\83\8a\83u\83\8c\81[\83V\83\87\83\93\r
        // \83W\83\83\83C\83\8d\r
        while(!ETUtilityStuff::Istouched(touch,tailcontroler)) {}\r
-       for(int i=0;i<sum_num;i++){\r
-               sum += gyro.get();\r
-               clock.wait(10);\r
-       }\r
-       unsigned long offset = sum / sum_num;\r
+    unsigned long offset = ETUtilityStuff::GetOffset(gyro,clock);\r
        runner.SetGyroOffset(offset);\r
-       tsprintf(str,"Offset = %d",offset);\r
-       lcd.cursor(0,1);\r
-       lcd.putf("s",str);\r
-       lcd.disp();\r
-       speaker.playTone(1000,100,50);\r
+    //display to LCD\r
+    ETUtilityStuff::DisplayCalibResult(lcd,speaker,"Offset = %d",offset,1000,1);\r
 \r
        // \94\92\r
        while(!ETUtilityStuff::Istouched(touch,tailcontroler)) {}\r
-       sum = 0;\r
-       for(int i=0;i<sum_num;i++){\r
-               sum += light.getBrightness();\r
-               clock.wait(10);\r
-       }\r
-       unsigned long white = sum / sum_num;\r
+    unsigned long white = ETUtilityStuff::GetOffset(light,clock);\r
        linepos.SetWhite(white);\r
-       tsprintf(str,"White = %d",white);\r
-       lcd.cursor(0,2);\r
-       lcd.putf("s",str);\r
-       lcd.disp();\r
-       speaker.playTone(1200,100,50);\r
+    //display to LCD\r
+    ETUtilityStuff::DisplayCalibResult(lcd,speaker,"White = %d",white,1200,2);\r
 \r
        // \8d\95\r
        while(!ETUtilityStuff::Istouched(touch,tailcontroler)) {}\r
-       sum = 0;\r
-       for(int i=0;i<sum_num;i++){\r
-               sum += light.getBrightness();\r
-               clock.wait(10);\r
-       }\r
-       unsigned long black = sum / sum_num;\r
+    unsigned long black = ETUtilityStuff::GetOffset(light,clock);\r
        linepos.SetBlack(black);\r
-       tsprintf(str,"Black = %d",black);\r
-       lcd.cursor(0,3);\r
-       lcd.putf("s",str);\r
-       lcd.disp();\r
-       speaker.playTone(1400,100,50);\r
+    //display to LCD\r
+    ETUtilityStuff::DisplayCalibResult(lcd,speaker,"Black = %d",black,1400,3);\r
 \r
     //wait for touch or bluetooth.\r
     ETUtilityStuff::Waitstart(touch,tailcontroler,ETBluetoothString::CMD_START);\r