Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: EthernetInterface mbed-rtos mbed
Fork of mbed_driver_ver_0_3_0 by
Diff: main.cpp
- Revision:
- 1:b1c3d31236f8
- Parent:
- 0:c490b05d753e
- Child:
- 2:233951f9354d
--- a/main.cpp Fri Sep 28 00:04:25 2018 +0000
+++ b/main.cpp Mon Oct 22 15:47:42 2018 +0000
@@ -14,7 +14,7 @@
@author Wada Suisei Copyright (C) 2018 - All rights reserved
@author modified by yukimakura
- @date LastModified:2018 July 2
+ @date LastModified:2018 Oct 23
*/
/*** Including Libraries ***/
@@ -33,23 +33,21 @@
* @brief 接続のタイムアウト(ミリ秒)
*
*/
-#define TIMEOUT_MS 3000
+#define TIMEOUT_MS 1000
/*** Network Information ***/
///myIpAddrこのモータドライバのIPアドレスを入力
-const char myIpAddr[] = "192.168.39.10";
+#define myIpAddr "10.42.0.98"
/// myPortこのプログラムで使用するポートを入力
-const uint16_t myPort = 50000;
+#define myPort 50000
/// NetMask このモータドライバ用のネットマスクを入力
-const char NetMask[] = "255.255.255.0";
+#define NetMask "255.255.255.0"
/// Gateway このモータドライバ用のゲートウェイを入力
-const char Gateway[] = "192.168.39.1";
+#define Gateway "10.42.0.1"
/*** Instantiation ***/
-//Interruption
-Timeout linkdown_catcher;
Timer Timeout_timer;
//! PWM信号の差動出力ピンを指定
@@ -57,8 +55,11 @@
//! PWM信号の差動出力ピンを指定
PwmOut motor_N(p25);
+Thread *(eth_pri);
+
double pipe_pwmduty;
+Mutex g_mtx;
//Network
DigitalOut EthRecv_LED(LED1);
@@ -82,11 +83,12 @@
*
*
*/
-void INT_TIMER_LINKDOWN_CATCHER(void){
+void timeout(void){
+ g_mtx.lock();
pipe_pwmduty = 0.0;
+ g_mtx.unlock();
motor_P = 0.5;
motor_N = 0.5;
- exit(-1);
}
@@ -103,94 +105,52 @@
* \endhtmlonly
*/
void ethernet_thread(void){
- //Declaration of Local Variables
- char in_buf[8];
- char out_buf[10];
+ char in_buf[64];
- //Initializing Network
- SocketAddress SockAddr_Receive;
- eth.set_network(myIpAddr, NetMask, Gateway);
- if(0 != eth.connect()){
- exit(-1);
- }
- TCPServer srv;
- TCPSocket sock;
- srv.open(ð);
- srv.bind(eth.get_ip_address(), myPort);
+ EthernetInterface eth;
+ //eth.init();
+ eth.init(myIpAddr,NetMask,Gateway);
+ eth.connect();
+ printf("\nServer IP Address is %s\n", eth.getIPAddress());
+
+ TCPSocketServer server;
+ server.bind(myPort);
+ server.listen();
+
while (true) {
-
- printf("waiting for client\r\n");
- /* Can handle 5 simultaneous connections */
- int err= srv.listen(1);
- printf("server listening error : %d\r\n",err);
-
- Timeout_timer.start();
- while(1){
- /* Initialize variables */
- memset(in_buf, '\0', sizeof(in_buf));
- memset(out_buf, '\0', sizeof(out_buf));
- printf("waiting for client connection\r\n");
- err = srv.accept(&sock, &SockAddr_Receive);
- Timeout_timer.reset();
+ printf("\nWait for new connection...\n");
+ TCPSocketConnection client;
+ server.accept(client);
+ //client.set_blocking(false, TIMEOUT_MS); // Timeout after (TIMEOUT_MS)ms
+
+ printf("Connection from: %s\n", client.get_address());
+
+ while (client.is_connected()) {
+
Ethconnect_LED = 1;
- //https://docs.mbed.com/docs/vignesh/en/latest/api/group__netsocket.html#ga67a8f07758d2ee2a1809293fa52bdf14
- switch(err){
- case NSAPI_ERROR_OK:
- printf("client connected :%s:%d\r\n", SockAddr_Receive.get_ip_address(), SockAddr_Receive.get_port());
- while(1){
- int len = sock.recv(in_buf, sizeof(in_buf));
- if(Timeout_timer.read_ms() < TIMEOUT_MS){
-
- if(len > 0){
- Timeout_timer.reset();
- in_buf[len] = '\0';
- //Get data
- EthRecv_LED = !EthRecv_LED;
- memcpy(&pipe_pwmduty, &in_buf[0], 8);
-
-
- /* Send Data */
- //sock.send(out_buf, sizeof(out_buf));
- EthSend_LED = !EthSend_LED;
- }
- }
- else{//TIMEOUT
- printf("Time_out (over %d ms)\n",TIMEOUT_MS);
- memset(in_buf, '\0', sizeof(in_buf));
- pipe_pwmduty = 0.0;
- motor_P = 0.5;
- motor_N = 0.5;
- Ethconnect_LED = 0;
- sock.close();
- break;
- }
- }
- break;
- case NSAPI_ERROR_WOULD_BLOCK :
- printf("NSAPI_ERROR_WOULD_BLOCK\n");
- memset(in_buf, '\0', sizeof(in_buf));
- INT_TIMER_LINKDOWN_CATCHER();
- break;
- case NSAPI_ERROR_NO_CONNECTION :
- printf("NSAPI_ERROR_NO_CONNECTION\n");
- memset(in_buf, '\0', sizeof(in_buf));
- INT_TIMER_LINKDOWN_CATCHER();
- break;
- case NSAPI_ERROR_NO_SOCKET :
- printf("NSAPI_ERROR_NO_SOCKET\n");
- memset(in_buf, '\0', sizeof(in_buf));
- INT_TIMER_LINKDOWN_CATCHER();
- break;
- case NSAPI_ERROR_NO_ADDRESS :
- printf("NSAPI_ERROR_NO_ADDRESS\n");
- memset(in_buf, '\0', sizeof(in_buf));
- INT_TIMER_LINKDOWN_CATCHER();
- break;
- default:
- printf("other error");
- break;
+ int len = client.receive(in_buf, sizeof(in_buf));
+ EthRecv_LED = !EthRecv_LED;
+ // print received message to terminal
+ in_buf[len] = '\0';
+ if(len > 0){
+ // Timeout_timer.reset();
+ in_buf[len] = '\0';
+ //Get data
+ EthRecv_LED = !EthRecv_LED;
+ g_mtx.lock();
+ memcpy(&pipe_pwmduty, &in_buf[0], 8);
+ //printf("Received message from Client :'%f'\n",pipe_pwmduty);
+ g_mtx.unlock();
+ Timeout_timer.reset();
+ }
+ if(Timeout_timer.read_ms() > TIMEOUT_MS){
+ break;
}
}
+ printf("\nclient closed\n");
+ Ethconnect_LED = 0;
+ timeout();
+ client.close();
}
}
@@ -200,6 +160,7 @@
* @return OSに返します。
*/
int main(){
+ Timeout_timer.start();
/* Declaration of Local Variables */
float pwmduty;
@@ -219,21 +180,29 @@
/* Start Thread */
Thread thread_get(ethernet_thread);
-
+ eth_pri = &thread_get;
+ eth_pri -> set_priority(osPriorityHigh);
/* Main Routine */
while(true){
//disconnect timeout
if(Timeout_timer.read_ms() > TIMEOUT_MS){
- pipe_pwmduty = 0.0;
+ g_mtx.lock();
+ pipe_pwmduty = 0.0;
+ g_mtx.unlock();
+ timeout();
EthRecv_LED = 0;
EthSend_LED = 0;
Ethconnect_LED = 0;
+ printf("%d\n",Timeout_timer.read_ms());
+ Timeout_timer.reset();
//return -1;
}
/* Calculate PWM Duty */
+ g_mtx.lock();
pwmduty = pipe_pwmduty / 2.0;
+ g_mtx.unlock();
/* Output PWM */
motor_P = (0.5 + pwmduty);
