-
Notifications
You must be signed in to change notification settings - Fork 3
/
pwmd.c
89 lines (81 loc) · 2.34 KB
/
pwmd.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
hardware PWM server
*/
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include "pwm.h"
#define PORT 9876 // default port
#define _DEBUG_ 0
int main(int argc, char **argv){
int i;
int srcSocket; //自分
int dstSocket; //相手
// sockaddr_in 構造体
struct sockaddr_in srcAddr;
struct sockaddr_in dstAddr;
socklen_t dstAddrSize;
// 各種パラメータ
int numrcv;
uint32_t buf[32];
int port;
bool init = 0;
float period;
float active;
uint32_t freq;
port = PORT;
if (argc == 2) {
port = atoi(argv[1]);
}
if(_DEBUG_) printf("port=%d\n",port);
// sockaddr_in 構造体のセット
bzero((char *)&srcAddr, sizeof(srcAddr));
srcAddr.sin_port = htons(PORT);
srcAddr.sin_family = AF_INET;
srcAddr.sin_addr.s_addr = INADDR_ANY;
// ソケットの生成(ストリーム型)
srcSocket = socket(AF_INET, SOCK_STREAM, 0);
// ソケットのバインド
bind(srcSocket, (struct sockaddr *)&srcAddr, sizeof(srcAddr));
// 接続の許可
listen(srcSocket, 5);
while(1){
// 接続の受付け
if(_DEBUG_) printf("Wait from client request\n");
dstAddrSize = sizeof(dstAddr);
dstSocket = accept(srcSocket, (struct sockaddr *)&dstAddr, &dstAddrSize);
if(_DEBUG_) printf("accept from %s\n",inet_ntoa(dstAddr.sin_addr));
while(1) { // クライアントがSocketをクローズしてからこちらもクローズする
//パケットの受信
memset(buf,0,sizeof(buf));
numrcv = read(dstSocket, buf, 1024);
if(_DEBUG_) printf("numrcv=%d\n",numrcv);
if(numrcv ==0 || numrcv ==-1 ){ // client close socket
close(dstSocket); break;
}
if(_DEBUG_) printf("Recv=[%d,%d]\n",buf[0],buf[1]);
if (!init) {
period = buf[0];
period = period / 1000.0;
if(_DEBUG_) printf("period=%f\n",period);
freq = pwm_begin(period);
if(_DEBUG_) printf("freq=%d\n",freq);
init = 1;
}
active = buf[1];
active = active / 1000.0;
if(_DEBUG_) printf("active=%f\n",active);
pwm_active(active);
delay(500);
// パケットの送信
buf[0] = freq;
write(dstSocket, buf, numrcv);
if(_DEBUG_) printf("->Send=%d\n",buf[0]);
} // end while
} // end for
return(0);
}