RTno is communicating library and framework which allows you to make your embedded device capable of communicating with RT-middleware world. RT-middleware is a platform software to realize Robotic system. In RTM, robots are developed by constructing robotics technologies\' elements (components) named RT-component. Therefore, the RTno helps you to create your own RT-component with your mbed and arduino. To know how to use your RTno device, visit here: http://ysuga.net/robot_e/rtm_e/rtc_e/1065?lang=en To know about RT-middleware and RT-component, visit http://www.openrtm.org
Dependencies: EthernetInterface mbed-rtos
main_template.cpp@2:cd91d780177c, 2013-07-08 (annotated)
- Committer:
- ysuga
- Date:
- Mon Jul 08 07:18:51 2013 +0000
- Revision:
- 2:cd91d780177c
add main_template.cpp
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ysuga | 2:cd91d780177c | 1 | // Set 1 if use this main program. |
ysuga | 2:cd91d780177c | 2 | // I recommend to copy and paste this template to your main.cpp. |
ysuga | 2:cd91d780177c | 3 | // And your main function in your main.cpp generated by server must be deleted. |
ysuga | 2:cd91d780177c | 4 | |
ysuga | 2:cd91d780177c | 5 | #if 0 |
ysuga | 2:cd91d780177c | 6 | #include "mbed.h" |
ysuga | 2:cd91d780177c | 7 | |
ysuga | 2:cd91d780177c | 8 | /** |
ysuga | 2:cd91d780177c | 9 | * RTno_Template.pde |
ysuga | 2:cd91d780177c | 10 | * RTno is RT-middleware and arduino. |
ysuga | 2:cd91d780177c | 11 | * |
ysuga | 2:cd91d780177c | 12 | * Using RTno, arduino device can communicate any RT-components |
ysuga | 2:cd91d780177c | 13 | * through the RTno-proxy component which is launched in PC. |
ysuga | 2:cd91d780177c | 14 | * Connect arduino with USB, and program with RTno library. |
ysuga | 2:cd91d780177c | 15 | * You do not have to define any protocols to establish communication |
ysuga | 2:cd91d780177c | 16 | * between arduino and PC. |
ysuga | 2:cd91d780177c | 17 | * |
ysuga | 2:cd91d780177c | 18 | * Using RTno, you must not define the function "setup" and "loop". |
ysuga | 2:cd91d780177c | 19 | * Those functions are automatically defined in the RTno libarary. |
ysuga | 2:cd91d780177c | 20 | * You, developers, must define following functions: |
ysuga | 2:cd91d780177c | 21 | * int onInitialize(void); |
ysuga | 2:cd91d780177c | 22 | * int onActivated(void); |
ysuga | 2:cd91d780177c | 23 | * int onDeactivated(void); |
ysuga | 2:cd91d780177c | 24 | * int onExecute(void); |
ysuga | 2:cd91d780177c | 25 | * int onError(void); |
ysuga | 2:cd91d780177c | 26 | * int onReset(void); |
ysuga | 2:cd91d780177c | 27 | * These functions are spontaneously called by the RTno-proxy |
ysuga | 2:cd91d780177c | 28 | * RT-component which is launched in the PC. |
ysuga | 2:cd91d780177c | 29 | * @author Yuki Suga |
ysuga | 2:cd91d780177c | 30 | * This code is written/distributed for public-domain. |
ysuga | 2:cd91d780177c | 31 | */ |
ysuga | 2:cd91d780177c | 32 | |
ysuga | 2:cd91d780177c | 33 | #include <RTno.h> |
ysuga | 2:cd91d780177c | 34 | |
ysuga | 2:cd91d780177c | 35 | /** |
ysuga | 2:cd91d780177c | 36 | * This function is called at first. |
ysuga | 2:cd91d780177c | 37 | * conf._default.baudrate: baudrate of serial communication |
ysuga | 2:cd91d780177c | 38 | * exec_cxt.periodic.type: reserved but not used. |
ysuga | 2:cd91d780177c | 39 | */ |
ysuga | 2:cd91d780177c | 40 | void rtcconf(config_str& conf, exec_cxt_str& exec_cxt) { |
ysuga | 2:cd91d780177c | 41 | // If you want to use Serial Connection, configure below: |
ysuga | 2:cd91d780177c | 42 | conf._default.connection_type = ConnectionTypeSerialUSB; // USBTX & USBRX (In Windows, Driver must be updated.) |
ysuga | 2:cd91d780177c | 43 | //conf._default.connection_type = ConnectionTypeSerial1; // pin9=tx, pin10=rx |
ysuga | 2:cd91d780177c | 44 | //conf._default.connection_type = ConnectionTypeSerial2; // pin13=tx, pin14=rx |
ysuga | 2:cd91d780177c | 45 | //conf._default.connection_type = ConnectionTypeSerial3; // pin28=tx, pin27=rx |
ysuga | 2:cd91d780177c | 46 | conf._default.baudrate = 57600; // This value is required when you select ConnectionTypeSerial* |
ysuga | 2:cd91d780177c | 47 | |
ysuga | 2:cd91d780177c | 48 | // If you want to use EthernetTCP, configure below: |
ysuga | 2:cd91d780177c | 49 | //conf._default.connection_type = ConnectionTypeEtherTcp; |
ysuga | 2:cd91d780177c | 50 | //conf._default.port = 23; |
ysuga | 2:cd91d780177c | 51 | //conf._default.mac_address = MACaddr(0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED); |
ysuga | 2:cd91d780177c | 52 | //conf._default.ip_address = IPaddr(192,168,42,100); |
ysuga | 2:cd91d780177c | 53 | //conf._default.subnet_mask = IPaddr(255,255,255,0); |
ysuga | 2:cd91d780177c | 54 | //conf._default.default_gateway = IPaddr(192,168,42,254); |
ysuga | 2:cd91d780177c | 55 | exec_cxt.periodic.type = ProxySynchronousExecutionContext; |
ysuga | 2:cd91d780177c | 56 | //exec_cxt.periodic.type = Timer1ExecutionContext; // onExecute is called by Timer1. Period must be specified by 'rate' option. |
ysuga | 2:cd91d780177c | 57 | exec_cxt.periodic.rate = 100; // [Hz] This option is indispensable when type is Timer*ExecutionContext. |
ysuga | 2:cd91d780177c | 58 | } |
ysuga | 2:cd91d780177c | 59 | |
ysuga | 2:cd91d780177c | 60 | |
ysuga | 2:cd91d780177c | 61 | /** |
ysuga | 2:cd91d780177c | 62 | * Declaration Division: |
ysuga | 2:cd91d780177c | 63 | * |
ysuga | 2:cd91d780177c | 64 | * DataPort and Data Buffer should be placed here. |
ysuga | 2:cd91d780177c | 65 | * |
ysuga | 2:cd91d780177c | 66 | * available data types are as follows: |
ysuga | 2:cd91d780177c | 67 | * TimedLong |
ysuga | 2:cd91d780177c | 68 | * TimedDouble |
ysuga | 2:cd91d780177c | 69 | * TimedFloat |
ysuga | 2:cd91d780177c | 70 | * TimedLongSeq |
ysuga | 2:cd91d780177c | 71 | * TimedDoubleSeq |
ysuga | 2:cd91d780177c | 72 | * TimedFloatSeq |
ysuga | 2:cd91d780177c | 73 | * |
ysuga | 2:cd91d780177c | 74 | * Please refer following comments. If you need to use some ports, |
ysuga | 2:cd91d780177c | 75 | * uncomment the line you want to declare. |
ysuga | 2:cd91d780177c | 76 | **/ |
ysuga | 2:cd91d780177c | 77 | TimedLong in0; |
ysuga | 2:cd91d780177c | 78 | InPort<TimedLong> in0In("in0", in0); |
ysuga | 2:cd91d780177c | 79 | ///TimedLong in1; |
ysuga | 2:cd91d780177c | 80 | //InPort<TimedLong> in1In("in1", in1); |
ysuga | 2:cd91d780177c | 81 | //TimedLongSeq in0; |
ysuga | 2:cd91d780177c | 82 | //InPort<TimedLongSeq> in0In("in0", in0); |
ysuga | 2:cd91d780177c | 83 | |
ysuga | 2:cd91d780177c | 84 | TimedLong out0; |
ysuga | 2:cd91d780177c | 85 | OutPort<TimedLong> out0Out("out0", out0); |
ysuga | 2:cd91d780177c | 86 | //TimedLongSeq<TimedLongSeq> out0; |
ysuga | 2:cd91d780177c | 87 | //OutPort out0Out("out0", out0); |
ysuga | 2:cd91d780177c | 88 | |
ysuga | 2:cd91d780177c | 89 | DigitalOut led1(LED1); |
ysuga | 2:cd91d780177c | 90 | DigitalOut led2(LED2); |
ysuga | 2:cd91d780177c | 91 | DigitalOut led3(LED3); |
ysuga | 2:cd91d780177c | 92 | DigitalOut led4(LED4); |
ysuga | 2:cd91d780177c | 93 | |
ysuga | 2:cd91d780177c | 94 | DigitalIn sw1(p21); |
ysuga | 2:cd91d780177c | 95 | ////////////////////////////////////////// |
ysuga | 2:cd91d780177c | 96 | // on_initialize |
ysuga | 2:cd91d780177c | 97 | // |
ysuga | 2:cd91d780177c | 98 | // This function is called in the initialization |
ysuga | 2:cd91d780177c | 99 | // sequence. The sequence is triggered by the |
ysuga | 2:cd91d780177c | 100 | // PC. When the RTnoRTC is launched in the PC, |
ysuga | 2:cd91d780177c | 101 | // then, this function is remotely called |
ysuga | 2:cd91d780177c | 102 | // through the USB cable. |
ysuga | 2:cd91d780177c | 103 | // In on_initialize, usually DataPorts are added. |
ysuga | 2:cd91d780177c | 104 | // |
ysuga | 2:cd91d780177c | 105 | ////////////////////////////////////////// |
ysuga | 2:cd91d780177c | 106 | int RTno::onInitialize() { |
ysuga | 2:cd91d780177c | 107 | /* Data Ports are added in this section. |
ysuga | 2:cd91d780177c | 108 | |
ysuga | 2:cd91d780177c | 109 | addInPort(in1In); |
ysuga | 2:cd91d780177c | 110 | addOutPort(out0Out); |
ysuga | 2:cd91d780177c | 111 | addOutPort(out1Out); |
ysuga | 2:cd91d780177c | 112 | */ |
ysuga | 2:cd91d780177c | 113 | |
ysuga | 2:cd91d780177c | 114 | addInPort(in0In); |
ysuga | 2:cd91d780177c | 115 | //addInPort(in1In); |
ysuga | 2:cd91d780177c | 116 | addOutPort(out0Out); |
ysuga | 2:cd91d780177c | 117 | led1 = 1; |
ysuga | 2:cd91d780177c | 118 | led2 = 0; |
ysuga | 2:cd91d780177c | 119 | led3 = 0; |
ysuga | 2:cd91d780177c | 120 | led4 = 0; |
ysuga | 2:cd91d780177c | 121 | sw1.mode(PullUp); |
ysuga | 2:cd91d780177c | 122 | // Some initialization (like port direction setting) |
ysuga | 2:cd91d780177c | 123 | // int LED = 13; |
ysuga | 2:cd91d780177c | 124 | // pinMode(LED, OUTPUT); |
ysuga | 2:cd91d780177c | 125 | |
ysuga | 2:cd91d780177c | 126 | return RTC_OK; |
ysuga | 2:cd91d780177c | 127 | } |
ysuga | 2:cd91d780177c | 128 | |
ysuga | 2:cd91d780177c | 129 | //////////////////////////////////////////// |
ysuga | 2:cd91d780177c | 130 | // on_activated |
ysuga | 2:cd91d780177c | 131 | // This function is called when the RTnoRTC |
ysuga | 2:cd91d780177c | 132 | // is activated. When the activation, the RTnoRTC |
ysuga | 2:cd91d780177c | 133 | // sends message to call this function remotely. |
ysuga | 2:cd91d780177c | 134 | // If this function is failed (return value |
ysuga | 2:cd91d780177c | 135 | // is RTC_ERROR), RTno will enter ERROR condition. |
ysuga | 2:cd91d780177c | 136 | //////////////////////////////////////////// |
ysuga | 2:cd91d780177c | 137 | int RTno::onActivated() { |
ysuga | 2:cd91d780177c | 138 | // Write here initialization code. |
ysuga | 2:cd91d780177c | 139 | led2 = 1; |
ysuga | 2:cd91d780177c | 140 | led3 = 0; |
ysuga | 2:cd91d780177c | 141 | led4 = 0; |
ysuga | 2:cd91d780177c | 142 | return RTC_OK; |
ysuga | 2:cd91d780177c | 143 | } |
ysuga | 2:cd91d780177c | 144 | |
ysuga | 2:cd91d780177c | 145 | ///////////////////////////////////////////// |
ysuga | 2:cd91d780177c | 146 | // on_deactivated |
ysuga | 2:cd91d780177c | 147 | // This function is called when the RTnoRTC |
ysuga | 2:cd91d780177c | 148 | // is deactivated. |
ysuga | 2:cd91d780177c | 149 | ///////////////////////////////////////////// |
ysuga | 2:cd91d780177c | 150 | int RTno::onDeactivated() |
ysuga | 2:cd91d780177c | 151 | { |
ysuga | 2:cd91d780177c | 152 | // Write here finalization code. |
ysuga | 2:cd91d780177c | 153 | led2 = 0; |
ysuga | 2:cd91d780177c | 154 | led3 = 0; |
ysuga | 2:cd91d780177c | 155 | led4 = 0; |
ysuga | 2:cd91d780177c | 156 | return RTC_OK; |
ysuga | 2:cd91d780177c | 157 | } |
ysuga | 2:cd91d780177c | 158 | |
ysuga | 2:cd91d780177c | 159 | ////////////////////////////////////////////// |
ysuga | 2:cd91d780177c | 160 | // This function is repeatedly called when the |
ysuga | 2:cd91d780177c | 161 | // RTno is in the ACTIVE condition. |
ysuga | 2:cd91d780177c | 162 | // If this function is failed (return value is |
ysuga | 2:cd91d780177c | 163 | // RTC_ERROR), RTno immediately enter into the |
ysuga | 2:cd91d780177c | 164 | // ERROR condition.r |
ysuga | 2:cd91d780177c | 165 | ////////////////////////////////////////////// |
ysuga | 2:cd91d780177c | 166 | int RTno::onExecute() { |
ysuga | 2:cd91d780177c | 167 | /** |
ysuga | 2:cd91d780177c | 168 | * Usage of InPort with premitive type. |
ysuga | 2:cd91d780177c | 169 | */ |
ysuga | 2:cd91d780177c | 170 | if(in0In.isNew()) { |
ysuga | 2:cd91d780177c | 171 | in0In.read(); |
ysuga | 2:cd91d780177c | 172 | led4 = in0.data > 0 ? 1 : 0; |
ysuga | 2:cd91d780177c | 173 | } |
ysuga | 2:cd91d780177c | 174 | |
ysuga | 2:cd91d780177c | 175 | //if(in1In.isNew()) { |
ysuga | 2:cd91d780177c | 176 | // in1In.read(); |
ysuga | 2:cd91d780177c | 177 | // led4 = in1.data; |
ysuga | 2:cd91d780177c | 178 | //} |
ysuga | 2:cd91d780177c | 179 | |
ysuga | 2:cd91d780177c | 180 | /** |
ysuga | 2:cd91d780177c | 181 | * Usage of InPort with sequence type |
ysuga | 2:cd91d780177c | 182 | if(in0In.isNew(&in1In)) { |
ysuga | 2:cd91d780177c | 183 | in0In.read(); |
ysuga | 2:cd91d780177c | 184 | for(int i = 0;i < in0.data.length;i++) { |
ysuga | 2:cd91d780177c | 185 | long data_buffer = in0.data[i]; |
ysuga | 2:cd91d780177c | 186 | } |
ysuga | 2:cd91d780177c | 187 | } |
ysuga | 2:cd91d780177c | 188 | */ |
ysuga | 2:cd91d780177c | 189 | |
ysuga | 2:cd91d780177c | 190 | /** |
ysuga | 2:cd91d780177c | 191 | * Usage of OutPort with primitive type. |
ysuga | 2:cd91d780177c | 192 | out0.data = 3.14159; |
ysuga | 2:cd91d780177c | 193 | out0Out.write(); |
ysuga | 2:cd91d780177c | 194 | */ |
ysuga | 2:cd91d780177c | 195 | out0.data = sw1; |
ysuga | 2:cd91d780177c | 196 | out0Out.write(); |
ysuga | 2:cd91d780177c | 197 | |
ysuga | 2:cd91d780177c | 198 | /** |
ysuga | 2:cd91d780177c | 199 | * Usage of OutPort with sequence type. |
ysuga | 2:cd91d780177c | 200 | out0.data.length(3); |
ysuga | 2:cd91d780177c | 201 | out0.data[0] = 1.1; |
ysuga | 2:cd91d780177c | 202 | out0.data[1] = 2.2; |
ysuga | 2:cd91d780177c | 203 | out0.data[2] = 3.3; |
ysuga | 2:cd91d780177c | 204 | out0Out.write(); |
ysuga | 2:cd91d780177c | 205 | */ |
ysuga | 2:cd91d780177c | 206 | |
ysuga | 2:cd91d780177c | 207 | return RTC_OK; |
ysuga | 2:cd91d780177c | 208 | } |
ysuga | 2:cd91d780177c | 209 | |
ysuga | 2:cd91d780177c | 210 | |
ysuga | 2:cd91d780177c | 211 | ////////////////////////////////////// |
ysuga | 2:cd91d780177c | 212 | // on_error |
ysuga | 2:cd91d780177c | 213 | // This function is repeatedly called when |
ysuga | 2:cd91d780177c | 214 | // the RTno is in the ERROR condition. |
ysuga | 2:cd91d780177c | 215 | // The ERROR condition can be recovered, |
ysuga | 2:cd91d780177c | 216 | // when the RTno is reset. |
ysuga | 2:cd91d780177c | 217 | /////////////////////////////////////// |
ysuga | 2:cd91d780177c | 218 | int RTno::onError() |
ysuga | 2:cd91d780177c | 219 | { |
ysuga | 2:cd91d780177c | 220 | return RTC_OK; |
ysuga | 2:cd91d780177c | 221 | } |
ysuga | 2:cd91d780177c | 222 | |
ysuga | 2:cd91d780177c | 223 | //////////////////////////////////////// |
ysuga | 2:cd91d780177c | 224 | // This function is called when |
ysuga | 2:cd91d780177c | 225 | // the RTno is reset. If on_reset is |
ysuga | 2:cd91d780177c | 226 | // succeeded, the RTno will enter into |
ysuga | 2:cd91d780177c | 227 | // the INACTIVE condition. If failed |
ysuga | 2:cd91d780177c | 228 | // (return value is RTC_ERROR), RTno |
ysuga | 2:cd91d780177c | 229 | // will stay in ERROR condition.ec |
ysuga | 2:cd91d780177c | 230 | /////////////////////////////////////// |
ysuga | 2:cd91d780177c | 231 | int RTno::onReset() |
ysuga | 2:cd91d780177c | 232 | { |
ysuga | 2:cd91d780177c | 233 | return RTC_OK; |
ysuga | 2:cd91d780177c | 234 | } |
ysuga | 2:cd91d780177c | 235 | |
ysuga | 2:cd91d780177c | 236 | |
ysuga | 2:cd91d780177c | 237 | #endif |