yuki makura / Mbed 2 deprecated mbed_driver_ver_0_3_5

Dependencies:   EthernetInterface mbed-rtos mbed

Fork of mbed_driver_ver_0_3_0 by yuki makura

Committer:
yukisega
Date:
Fri Sep 28 00:04:25 2018 +0000
Revision:
0:c490b05d753e
Child:
1:b1c3d31236f8
init commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yukisega 0:c490b05d753e 1
yukisega 0:c490b05d753e 2 /**
yukisega 0:c490b05d753e 3
yukisega 0:c490b05d753e 4 @file main.cpp
yukisega 0:c490b05d753e 5 @brief Thrust Motor Controller 2018 edition ver. 0.2.0
yukisega 0:c490b05d753e 6 \mainpage Thrust Motor Controller 2018 edition
yukisega 0:c490b05d753e 7 TCPSocket経由でスラスターを制御するプログラムです。
yukisega 0:c490b05d753e 8 DHCPサーバとしては機能しません。
yukisega 0:c490b05d753e 9 固定IPを割り振る必要があります。
yukisega 0:c490b05d753e 10 \htmlonly
yukisega 0:c490b05d753e 11 <font color="red">mbedの電源を投入する前に,あらかじめクライアントのコンピュータを接続しておく必要があります。</font>
yukisega 0:c490b05d753e 12 \endhtmlonly
yukisega 0:c490b05d753e 13 @sa ethernet_thread
yukisega 0:c490b05d753e 14 @author Wada Suisei Copyright (C) 2018 - All rights reserved
yukisega 0:c490b05d753e 15 @author modified by yukimakura
yukisega 0:c490b05d753e 16
yukisega 0:c490b05d753e 17 @date LastModified:2018 July 2
yukisega 0:c490b05d753e 18 */
yukisega 0:c490b05d753e 19
yukisega 0:c490b05d753e 20 /*** Including Libraries ***/
yukisega 0:c490b05d753e 21 #include "mbed.h"
yukisega 0:c490b05d753e 22 #include "EthernetInterface.h"
yukisega 0:c490b05d753e 23 #include "rtos.h"
yukisega 0:c490b05d753e 24
yukisega 0:c490b05d753e 25
yukisega 0:c490b05d753e 26 /**
yukisega 0:c490b05d753e 27 * @brief PWMの周期(秒)
yukisega 0:c490b05d753e 28 *
yukisega 0:c490b05d753e 29 */
yukisega 0:c490b05d753e 30 #define PWM_FREQ 0.01
yukisega 0:c490b05d753e 31
yukisega 0:c490b05d753e 32 /**
yukisega 0:c490b05d753e 33 * @brief 接続のタイムアウト(ミリ秒)
yukisega 0:c490b05d753e 34 *
yukisega 0:c490b05d753e 35 */
yukisega 0:c490b05d753e 36 #define TIMEOUT_MS 3000
yukisega 0:c490b05d753e 37
yukisega 0:c490b05d753e 38
yukisega 0:c490b05d753e 39 /*** Network Information ***/
yukisega 0:c490b05d753e 40 ///myIpAddrこのモータドライバのIPアドレスを入力
yukisega 0:c490b05d753e 41 const char myIpAddr[] = "192.168.39.10";
yukisega 0:c490b05d753e 42 /// myPortこのプログラムで使用するポートを入力
yukisega 0:c490b05d753e 43 const uint16_t myPort = 50000;
yukisega 0:c490b05d753e 44 /// NetMask このモータドライバ用のネットマスクを入力
yukisega 0:c490b05d753e 45 const char NetMask[] = "255.255.255.0";
yukisega 0:c490b05d753e 46 /// Gateway このモータドライバ用のゲートウェイを入力
yukisega 0:c490b05d753e 47 const char Gateway[] = "192.168.39.1";
yukisega 0:c490b05d753e 48
yukisega 0:c490b05d753e 49
yukisega 0:c490b05d753e 50 /*** Instantiation ***/
yukisega 0:c490b05d753e 51 //Interruption
yukisega 0:c490b05d753e 52 Timeout linkdown_catcher;
yukisega 0:c490b05d753e 53 Timer Timeout_timer;
yukisega 0:c490b05d753e 54
yukisega 0:c490b05d753e 55 //! PWM信号の差動出力ピンを指定
yukisega 0:c490b05d753e 56 PwmOut motor_P(p26);
yukisega 0:c490b05d753e 57 //! PWM信号の差動出力ピンを指定
yukisega 0:c490b05d753e 58 PwmOut motor_N(p25);
yukisega 0:c490b05d753e 59
yukisega 0:c490b05d753e 60 double pipe_pwmduty;
yukisega 0:c490b05d753e 61
yukisega 0:c490b05d753e 62
yukisega 0:c490b05d753e 63 //Network
yukisega 0:c490b05d753e 64 DigitalOut EthRecv_LED(LED1);
yukisega 0:c490b05d753e 65 DigitalOut EthSend_LED(LED2);
yukisega 0:c490b05d753e 66 DigitalOut Ethconnect_LED(LED4);
yukisega 0:c490b05d753e 67 EthernetInterface eth;
yukisega 0:c490b05d753e 68
yukisega 0:c490b05d753e 69
yukisega 0:c490b05d753e 70
yukisega 0:c490b05d753e 71
yukisega 0:c490b05d753e 72
yukisega 0:c490b05d753e 73 /**
yukisega 0:c490b05d753e 74 *
yukisega 0:c490b05d753e 75 * @brief コネクション時に重大なエラーが発生した時に呼び出されます
yukisega 0:c490b05d753e 76 *
yukisega 0:c490b05d753e 77 * pwmをduty比それぞれ50%にしてから、
yukisega 0:c490b05d753e 78 * mbedOSに−1を返します。
yukisega 0:c490b05d753e 79 * \htmlonly
yukisega 0:c490b05d753e 80 * <font color="red">こうなった場合は再起動が必要です。</font>
yukisega 0:c490b05d753e 81 * \endhtmlonly
yukisega 0:c490b05d753e 82 *
yukisega 0:c490b05d753e 83 *
yukisega 0:c490b05d753e 84 */
yukisega 0:c490b05d753e 85 void INT_TIMER_LINKDOWN_CATCHER(void){
yukisega 0:c490b05d753e 86 pipe_pwmduty = 0.0;
yukisega 0:c490b05d753e 87 motor_P = 0.5;
yukisega 0:c490b05d753e 88 motor_N = 0.5;
yukisega 0:c490b05d753e 89 exit(-1);
yukisega 0:c490b05d753e 90 }
yukisega 0:c490b05d753e 91
yukisega 0:c490b05d753e 92
yukisega 0:c490b05d753e 93
yukisega 0:c490b05d753e 94 /**
yukisega 0:c490b05d753e 95 *
yukisega 0:c490b05d753e 96 * @brief TCP/IPソケットでコミュニケーションかつデータ受信を行います
yukisega 0:c490b05d753e 97 *
yukisega 0:c490b05d753e 98 * RTOSによって管理されているスレッドで,
yukisega 0:c490b05d753e 99 * TCPSocketの確立前にデータリンク層あたりでコネクションされていないと
yukisega 0:c490b05d753e 100 * mbedOSに−1を返します。
yukisega 0:c490b05d753e 101 * \htmlonly
yukisega 0:c490b05d753e 102 * <font color="red">mbedの電源を投入する前に,あらかじめクライアントのコンピュータを接続しておく必要があります。</font>
yukisega 0:c490b05d753e 103 * \endhtmlonly
yukisega 0:c490b05d753e 104 */
yukisega 0:c490b05d753e 105 void ethernet_thread(void){
yukisega 0:c490b05d753e 106 //Declaration of Local Variables
yukisega 0:c490b05d753e 107 char in_buf[8];
yukisega 0:c490b05d753e 108 char out_buf[10];
yukisega 0:c490b05d753e 109
yukisega 0:c490b05d753e 110 //Initializing Network
yukisega 0:c490b05d753e 111 SocketAddress SockAddr_Receive;
yukisega 0:c490b05d753e 112 eth.set_network(myIpAddr, NetMask, Gateway);
yukisega 0:c490b05d753e 113 if(0 != eth.connect()){
yukisega 0:c490b05d753e 114 exit(-1);
yukisega 0:c490b05d753e 115 }
yukisega 0:c490b05d753e 116 TCPServer srv;
yukisega 0:c490b05d753e 117 TCPSocket sock;
yukisega 0:c490b05d753e 118 srv.open(&eth);
yukisega 0:c490b05d753e 119 srv.bind(eth.get_ip_address(), myPort);
yukisega 0:c490b05d753e 120 while (true) {
yukisega 0:c490b05d753e 121
yukisega 0:c490b05d753e 122 printf("waiting for client\r\n");
yukisega 0:c490b05d753e 123 /* Can handle 5 simultaneous connections */
yukisega 0:c490b05d753e 124 int err= srv.listen(1);
yukisega 0:c490b05d753e 125 printf("server listening error : %d\r\n",err);
yukisega 0:c490b05d753e 126
yukisega 0:c490b05d753e 127 Timeout_timer.start();
yukisega 0:c490b05d753e 128 while(1){
yukisega 0:c490b05d753e 129 /* Initialize variables */
yukisega 0:c490b05d753e 130 memset(in_buf, '\0', sizeof(in_buf));
yukisega 0:c490b05d753e 131 memset(out_buf, '\0', sizeof(out_buf));
yukisega 0:c490b05d753e 132 printf("waiting for client connection\r\n");
yukisega 0:c490b05d753e 133 err = srv.accept(&sock, &SockAddr_Receive);
yukisega 0:c490b05d753e 134 Timeout_timer.reset();
yukisega 0:c490b05d753e 135 Ethconnect_LED = 1;
yukisega 0:c490b05d753e 136 //https://docs.mbed.com/docs/vignesh/en/latest/api/group__netsocket.html#ga67a8f07758d2ee2a1809293fa52bdf14
yukisega 0:c490b05d753e 137 switch(err){
yukisega 0:c490b05d753e 138 case NSAPI_ERROR_OK:
yukisega 0:c490b05d753e 139 printf("client connected :%s:%d\r\n", SockAddr_Receive.get_ip_address(), SockAddr_Receive.get_port());
yukisega 0:c490b05d753e 140 while(1){
yukisega 0:c490b05d753e 141 int len = sock.recv(in_buf, sizeof(in_buf));
yukisega 0:c490b05d753e 142 if(Timeout_timer.read_ms() < TIMEOUT_MS){
yukisega 0:c490b05d753e 143
yukisega 0:c490b05d753e 144 if(len > 0){
yukisega 0:c490b05d753e 145 Timeout_timer.reset();
yukisega 0:c490b05d753e 146 in_buf[len] = '\0';
yukisega 0:c490b05d753e 147 //Get data
yukisega 0:c490b05d753e 148 EthRecv_LED = !EthRecv_LED;
yukisega 0:c490b05d753e 149 memcpy(&pipe_pwmduty, &in_buf[0], 8);
yukisega 0:c490b05d753e 150
yukisega 0:c490b05d753e 151
yukisega 0:c490b05d753e 152 /* Send Data */
yukisega 0:c490b05d753e 153 //sock.send(out_buf, sizeof(out_buf));
yukisega 0:c490b05d753e 154 EthSend_LED = !EthSend_LED;
yukisega 0:c490b05d753e 155 }
yukisega 0:c490b05d753e 156 }
yukisega 0:c490b05d753e 157 else{//TIMEOUT
yukisega 0:c490b05d753e 158 printf("Time_out (over %d ms)\n",TIMEOUT_MS);
yukisega 0:c490b05d753e 159 memset(in_buf, '\0', sizeof(in_buf));
yukisega 0:c490b05d753e 160 pipe_pwmduty = 0.0;
yukisega 0:c490b05d753e 161 motor_P = 0.5;
yukisega 0:c490b05d753e 162 motor_N = 0.5;
yukisega 0:c490b05d753e 163 Ethconnect_LED = 0;
yukisega 0:c490b05d753e 164 sock.close();
yukisega 0:c490b05d753e 165 break;
yukisega 0:c490b05d753e 166 }
yukisega 0:c490b05d753e 167 }
yukisega 0:c490b05d753e 168 break;
yukisega 0:c490b05d753e 169 case NSAPI_ERROR_WOULD_BLOCK :
yukisega 0:c490b05d753e 170 printf("NSAPI_ERROR_WOULD_BLOCK\n");
yukisega 0:c490b05d753e 171 memset(in_buf, '\0', sizeof(in_buf));
yukisega 0:c490b05d753e 172 INT_TIMER_LINKDOWN_CATCHER();
yukisega 0:c490b05d753e 173 break;
yukisega 0:c490b05d753e 174 case NSAPI_ERROR_NO_CONNECTION :
yukisega 0:c490b05d753e 175 printf("NSAPI_ERROR_NO_CONNECTION\n");
yukisega 0:c490b05d753e 176 memset(in_buf, '\0', sizeof(in_buf));
yukisega 0:c490b05d753e 177 INT_TIMER_LINKDOWN_CATCHER();
yukisega 0:c490b05d753e 178 break;
yukisega 0:c490b05d753e 179 case NSAPI_ERROR_NO_SOCKET :
yukisega 0:c490b05d753e 180 printf("NSAPI_ERROR_NO_SOCKET\n");
yukisega 0:c490b05d753e 181 memset(in_buf, '\0', sizeof(in_buf));
yukisega 0:c490b05d753e 182 INT_TIMER_LINKDOWN_CATCHER();
yukisega 0:c490b05d753e 183 break;
yukisega 0:c490b05d753e 184 case NSAPI_ERROR_NO_ADDRESS :
yukisega 0:c490b05d753e 185 printf("NSAPI_ERROR_NO_ADDRESS\n");
yukisega 0:c490b05d753e 186 memset(in_buf, '\0', sizeof(in_buf));
yukisega 0:c490b05d753e 187 INT_TIMER_LINKDOWN_CATCHER();
yukisega 0:c490b05d753e 188 break;
yukisega 0:c490b05d753e 189 default:
yukisega 0:c490b05d753e 190 printf("other error");
yukisega 0:c490b05d753e 191 break;
yukisega 0:c490b05d753e 192 }
yukisega 0:c490b05d753e 193 }
yukisega 0:c490b05d753e 194 }
yukisega 0:c490b05d753e 195 }
yukisega 0:c490b05d753e 196
yukisega 0:c490b05d753e 197 /**
yukisega 0:c490b05d753e 198 * @brief エントリーポイント
yukisega 0:c490b05d753e 199 *
yukisega 0:c490b05d753e 200 * @return OSに返します。
yukisega 0:c490b05d753e 201 */
yukisega 0:c490b05d753e 202 int main(){
yukisega 0:c490b05d753e 203 /* Declaration of Local Variables */
yukisega 0:c490b05d753e 204 float pwmduty;
yukisega 0:c490b05d753e 205
yukisega 0:c490b05d753e 206 /* Initializing Variables */
yukisega 0:c490b05d753e 207 EthRecv_LED = 0;
yukisega 0:c490b05d753e 208 EthSend_LED = 0;
yukisega 0:c490b05d753e 209
yukisega 0:c490b05d753e 210 /* Initializing Interruption */
yukisega 0:c490b05d753e 211
yukisega 0:c490b05d753e 212
yukisega 0:c490b05d753e 213
yukisega 0:c490b05d753e 214 /* Initializing PWM Out */
yukisega 0:c490b05d753e 215 motor_P.period (PWM_FREQ);
yukisega 0:c490b05d753e 216 motor_N.period (PWM_FREQ);
yukisega 0:c490b05d753e 217 motor_P = 0.5;
yukisega 0:c490b05d753e 218 motor_N = 0.5;
yukisega 0:c490b05d753e 219
yukisega 0:c490b05d753e 220 /* Start Thread */
yukisega 0:c490b05d753e 221 Thread thread_get(ethernet_thread);
yukisega 0:c490b05d753e 222
yukisega 0:c490b05d753e 223
yukisega 0:c490b05d753e 224 /* Main Routine */
yukisega 0:c490b05d753e 225 while(true){
yukisega 0:c490b05d753e 226 //disconnect timeout
yukisega 0:c490b05d753e 227 if(Timeout_timer.read_ms() > TIMEOUT_MS){
yukisega 0:c490b05d753e 228 pipe_pwmduty = 0.0;
yukisega 0:c490b05d753e 229 EthRecv_LED = 0;
yukisega 0:c490b05d753e 230 EthSend_LED = 0;
yukisega 0:c490b05d753e 231 Ethconnect_LED = 0;
yukisega 0:c490b05d753e 232 //return -1;
yukisega 0:c490b05d753e 233 }
yukisega 0:c490b05d753e 234
yukisega 0:c490b05d753e 235 /* Calculate PWM Duty */
yukisega 0:c490b05d753e 236 pwmduty = pipe_pwmduty / 2.0;
yukisega 0:c490b05d753e 237
yukisega 0:c490b05d753e 238 /* Output PWM */
yukisega 0:c490b05d753e 239 motor_P = (0.5 + pwmduty);
yukisega 0:c490b05d753e 240 motor_N = (0.5 - pwmduty);
yukisega 0:c490b05d753e 241
yukisega 0:c490b05d753e 242
yukisega 0:c490b05d753e 243 }//while(1) END
yukisega 0:c490b05d753e 244
yukisega 0:c490b05d753e 245 }//main() END
yukisega 0:c490b05d753e 246
yukisega 0:c490b05d753e 247