OSDN Git Service

ETLineTracer: 前進量もPIDで決めるようにした。
[tondenhei/et2013.git] / main.cpp
1 /* main.cpp for TOPPERS/ATK(OSEK) */ \r
2 \r
3 // ECRobot++ API\r
4 #include "Lcd.h"\r
5 #include "Bluetooth.h"\r
6 #include "BTConnection.h"\r
7 #include "Clock.h"\r
8 #include "GyroSensor.h"\r
9 #include "LightSensor.h"\r
10 #include "Motor.h"\r
11 #include "Nxt.h"\r
12 #include "SonarSensor.h"\r
13 #include "Speaker.h"\r
14 #include "TouchSensor.h"\r
15 \r
16 #include "tsprintf.h"\r
17 #include "ETLineTracer.h"\r
18 #include "ETLinePos.h"\r
19 #include "ETBalanceRunner.h"\r
20 #include "ETTailControl.h"\r
21 #include "context.h"\r
22 #include "ETUtility.h"\r
23 \r
24 using namespace ecrobot;\r
25 \r
26 extern "C"\r
27 {\r
28 #include "kernel.h"\r
29 #include "kernel_id.h"\r
30 #include "ecrobot_interface.h"\r
31 \r
32 DeclareTask(TaskMain);\r
33 DeclareCounter(SysTimerCnt);//Alarm\97\98\97p\8e\9e\95K\97v\r
34 \r
35 // global object instances\r
36 Nxt nxt;\r
37 Lcd lcd;\r
38 Speaker speaker;\r
39 Bluetooth bt;\r
40 Clock clock;\r
41 GyroSensor gyro(PORT_1);\r
42 SonarSensor sonar(PORT_2);\r
43 LightSensor light(PORT_3);\r
44 TouchSensor touch(PORT_4);\r
45 Motor motorT(PORT_A);\r
46 Motor motorR(PORT_B);\r
47 Motor motorL(PORT_C);\r
48 \r
49 ETBalanceRunner runner(motorL,motorR,gyro,nxt);\r
50 ETLinePos linepos(light);\r
51 ETLineTracer tracer(linepos,runner);\r
52 ETTailControl tailcontroler(motorT,0);\r
53 ContextStuff::Context context;\r
54 \r
55 /* \83f\83o\83C\83X\8fI\97¹\97p\83t\83b\83N\8aÖ\90\94 */\r
56 /* \82±\82Ì\8aÖ\90\94\82ÍSTOP\82Ü\82½\82ÍEXIT\83{\83^\83\93\82ª\89\9f\82³\82ê\82½\8e\9e\82É\8eÀ\8ds\82³\82ê\82Ü\82·\81B */\r
57 void ecrobot_device_terminate()\r
58 {\r
59         /* \83Z\83\93\83T\81A\83\82\81[\83^\82È\82Ç\82Ì\8ae\83f\83o\83C\83X\82Ì\8fI\97¹\8aÖ\90\94\82ð\r
60          * \82±\82±\82Å\8eÀ\91\95\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B\r
61          * \81Ë\81@\8cõ\83Z\83\93\83T\90Ô\90FLED\82ðOFF\82É\82·\82é\r
62          */\r
63         //ecrobot_set_light_sensor_inactive(SENSOR_LIGHT);\r
64         ecrobot_term_bt_connection(); /* Bluetooth\92Ê\90M\82ð\8fI\97¹ */                                                 //ex4\r
65 }\r
66 \r
67 // nxtOSEK hook to be invoked from an ISR in category 2\r
68 void user_1ms_isr_type2(void)\r
69 {\r
70     //  //Sleep\97\98\97p\8e\9e\95K\97v\r
71     SleeperMonitor();\r
72     //  //Alarm\97\98\97p\8e\9e\95K\97v\r
73     StatusType ercd;\r
74     ercd = SignalCounter(SysTimerCnt);\r
75     if (ercd != E_OK) {\r
76         ShutdownOS(ercd);\r
77     }\r
78 }\r
79 \r
80 TASK(TaskMain)\r
81 {\r
82     //bt.setFriendlyName(DEVICE_NAME);\r
83         BTConnection btConnection(bt, lcd, nxt);\r
84         btConnection.connect(ETBluetoothString::PASS_KEY);\r
85         lcd.clear();\r
86         lcd.putf("s", "Hello World");\r
87         lcd.disp();\r
88     tailcontroler.Init();\r
89     tailcontroler.SetAngle(ETTailControl::ANGLE_STAND_UP);\r
90 \r
91         // \83L\83\83\83\8a\83u\83\8c\81[\83V\83\87\83\93\r
92         // \83W\83\83\83C\83\8d\r
93         while(!ETUtilityStuff::Istouched(touch,tailcontroler)) {}\r
94     unsigned long offset = ETUtilityStuff::GetOffset(gyro,clock);\r
95         runner.SetGyroOffset(offset);\r
96     //display to LCD\r
97     ETUtilityStuff::DisplayCalibResult(lcd,speaker,"Offset = %d",offset,1000,1);\r
98 \r
99         // \94\92\r
100         while(!ETUtilityStuff::Istouched(touch,tailcontroler)) {}\r
101     unsigned long white = ETUtilityStuff::GetOffset(light,clock);\r
102         linepos.SetWhite(white);\r
103     //display to LCD\r
104     ETUtilityStuff::DisplayCalibResult(lcd,speaker,"White = %d",white,1200,2);\r
105 \r
106         // \8d\95\r
107         while(!ETUtilityStuff::Istouched(touch,tailcontroler)) {}\r
108     unsigned long black = ETUtilityStuff::GetOffset(light,clock);\r
109         linepos.SetBlack(black);\r
110     //display to LCD\r
111     ETUtilityStuff::DisplayCalibResult(lcd,speaker,"Black = %d",black,1400,3);\r
112 \r
113     //wait for touch or bluetooth.\r
114     ETUtilityStuff::Waitstart(touch,tailcontroler,ETBluetoothString::CMD_START);\r
115 \r
116         tailcontroler.SetAngle(ETTailControl::ANGLE_DRIVE);\r
117     context.SetETLineTracer(&tracer);\r
118         TerminateTask();\r
119 }\r
120 \r
121 TASK(Task4ms)\r
122 {\r
123         if(touch.isPressed()){\r
124 //              motorR.setPWM(0);\r
125 //              motorL.setPWM(0);\r
126                 tracer.Stop();\r
127                 tracer.Reset();\r
128                 ActivateTask(TaskMain);\r
129                 TerminateTask();\r
130                 return;\r
131         }\r
132     context.Display(lcd);\r
133     context.CyclicExcute();\r
134     tailcontroler.Control();\r
135 \r
136         TerminateTask();\r
137 }\r
138 \r
139 int __cxa_pure_virtual(){\r
140         // \8f\83\90\88\89¼\91z\8aÖ\90\94\82ª\83I\81[\83o\81[\83\89\83C\83h\82µ\82È\82¢\82Å\8cÄ\82Ñ\8fo\82³\82ê\82½\8e\9e\82Ì\83G\83\89\81[\83n\83\93\83h\83\89\82ð\8bó\8eÀ\91\95\r
141         // \82±\82ê\82ð\93ü\82ê\82È\82¢\82Æram\8eg\97p\97Ê\82ª\82Æ\82Ä\82à\91\9d\82¦\82é\81E\81E\81E\r
142         return 0;\r
143 }\r
144 \r
145 }       // extern "C"\r