msdd6000 source upgraded and enabled
[debian/gnuradio] / gr-msdd6000 / src / msdd6000.cc
1 #include "msdd6000.h"
2
3 #include <stdio.h>
4 #include <netinet/in.h>
5 #include <sys/socket.h>
6 #include <string.h>
7 #include <unistd.h>
8
9 void optimize_socket(int socket);
10
11 MSDD6000::MSDD6000(char* addr){
12         d_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
13         
14         optimize_socket(d_sock);
15         
16         
17         // set up remote sockaddr
18 //      int s = inet_aton(addr, &d_adx); 
19         d_sockaddr.sin_family = AF_INET;
20         d_sockaddr.sin_port = htons(10000);
21         int s = inet_aton(addr, &d_sockaddr.sin_addr);
22         
23         // set up local sockaddr
24         short int port = 10010;
25         d_myadx.s_addr = INADDR_ANY;
26         d_mysockaddr.sin_family = AF_INET;
27         d_mysockaddr.sin_port = htons(port);
28         memcpy(&d_mysockaddr.sin_addr.s_addr, &d_myadx.s_addr, sizeof(in_addr));
29         //d_sockaddr.sin_addr = INADDR_ANY;
30         s = bind(d_sock, (const sockaddr*) &d_mysockaddr, sizeof(d_mysockaddr));
31         
32         // set default values
33         d_decim = 2;
34         d_ddc_gain = 2;
35         d_rf_attn = 0;
36         d_state = STATE_STOPPED;
37 }
38
39
40 void optimize_socket(int socket){
41 #define BANDWIDTH       1000000000/8
42 #define DELAY           0.5
43         int ret;
44
45         int sock_buf_size = 2*BANDWIDTH*DELAY;
46         char textbuf[512];
47         sprintf(textbuf, "%d", sock_buf_size);
48         printf("sock_buf_size = %d\n", sock_buf_size);
49         
50         ret = setsockopt( socket, SOL_SOCKET, SO_SNDBUF,
51                    (char *)&sock_buf_size, sizeof(sock_buf_size) );
52
53         ret = setsockopt( socket, SOL_SOCKET, SO_RCVBUF,
54                    (char *)&sock_buf_size, sizeof(sock_buf_size) );
55         
56         int uid = getuid();
57         if(uid!=0){
58                 printf(" ****** COULD NOT OPTIMIZE SYSTEM NETWORK PARAMETERS BECAUSE YOU ARE NOT RUNNING AS ROOT *******\n ****** YOUR MSDD6000 RECIEVER PERFORMANCE IS GOING TO BE TERRIBLE *******\n");
59                 return;
60         }
61
62
63         // SET UP SOME SYSTEM WIDE TCP SOCKET PARAMETERS
64         FILE* fd = fopen("/proc/sys/net/core/netdev_max_backlog", "w");
65         fwrite("10000", 1, strlen("10000"), fd);
66         fclose(fd);
67
68         fd = fopen("/proc/sys/net/core/rmem_max", "w");
69         fwrite(textbuf, 1, strlen(textbuf), fd);
70         fclose(fd);
71
72         fd = fopen("/proc/sys/net/core/wmem_max", "w");
73         fwrite(textbuf, 1, strlen(textbuf), fd);
74         fclose(fd);
75
76         // just incase these were rejected before because of max sizes...
77
78         ret = setsockopt( socket, SOL_SOCKET, SO_SNDBUF,
79                    (char *)&sock_buf_size, sizeof(sock_buf_size) );
80
81         ret = setsockopt( socket, SOL_SOCKET, SO_RCVBUF,
82                    (char *)&sock_buf_size, sizeof(sock_buf_size) );
83         
84 }
85
86
87 void MSDD6000::set_decim(int decim_pow2){
88         DEBUG("SETTING NEW DECIM");
89         d_decim = decim_pow2;
90
91         if(d_state==STATE_STARTED)
92                 send_request(d_fc_mhz, d_rf_attn, d_ddc_gain, d_decim, d_offset_hz);
93 }
94
95 void MSDD6000::set_rf_attn(int attn){
96         DEBUG("SETTING NEW RF ATTN");
97         d_rf_attn = attn;
98         if(d_state==STATE_STARTED)
99                 send_request(d_fc_mhz, d_rf_attn, d_ddc_gain, d_decim, d_offset_hz);
100 }
101
102 void MSDD6000::set_ddc_gain(int gain){
103         DEBUG("SETTING NEW DDC GAIN");
104         d_ddc_gain = gain;
105         if(d_state==STATE_STARTED)
106                 send_request(d_fc_mhz, d_rf_attn, d_ddc_gain, d_decim, d_offset_hz);
107 }
108
109 void MSDD6000::set_fc(int center_mhz, int offset_hz){
110         DEBUG("SETTING NEW FC");
111         d_fc_mhz = center_mhz;
112         d_offset_hz = offset_hz;
113         
114         if(d_state==STATE_STARTED)
115                 send_request(d_fc_mhz, d_rf_attn, d_ddc_gain, d_decim, d_offset_hz);
116 }
117
118
119 void MSDD6000::start(){
120         send_request(d_fc_mhz, d_rf_attn, d_ddc_gain, d_decim, d_offset_hz);
121         d_state = STATE_STARTED;
122         }
123
124
125 void MSDD6000::stop(){
126         // new request with 0 decim tells it to halt
127         send_request(d_fc_mhz, d_rf_attn, d_ddc_gain, 0, d_offset_hz);
128         d_state = STATE_STOPPED;
129         }
130
131
132 void MSDD6000::send_request(float freq_mhz, float rf_attn, float ddc_gain, float ddc_dec, float ddc_offset_hz){
133         static char buff[512];
134         sprintf(buff, "%f %f %f %f %f\n",freq_mhz, rf_attn, ddc_gain, ddc_dec, ddc_offset_hz);
135         printf("sending: %s\n", buff);
136         int flags = 0;
137         sendto( d_sock, buff, strlen(buff)+1, flags, (const sockaddr*)&d_sockaddr, sizeof(d_sockaddr));
138         }
139
140
141 int  MSDD6000::read(char* buf, int size){
142         int flags = 0;
143         return recv(d_sock, buf, size, flags);
144         }
145
146