00001
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <unistd.h>
00036 #include <string.h>
00037 #include <sys/types.h>
00038 #include <sys/socket.h>
00039 #include <netinet/in.h>
00040 #include <arpa/inet.h>
00041 #include <fcntl.h>
00042 #include <inttypes.h>
00043
00044
00045 #define ASF_PORT 9001
00046
00047 static unsigned int initialized = 0;
00048 static int s_fd;
00049
00050
00051
00052 int seismic_init(void)
00053 {
00054 struct sockaddr_in asf_addr;
00055 char buffer[6];
00056 int fd, error;
00057
00058 fd = socket(AF_INET, SOCK_STREAM,0);
00059 if (fd < 0)
00060 return fd;
00061
00062 memset(&asf_addr, '\0', sizeof(asf_addr));
00063 asf_addr.sin_family = AF_INET;
00064 asf_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
00065 asf_addr.sin_port = htons(ASF_PORT);
00066
00067 if ((error = connect(fd, (struct sockaddr*)&asf_addr,
00068 sizeof(asf_addr))) < 0)
00069 return error;
00070
00071
00072 buffer[0]='T';
00073 buffer[1]=' ';
00074 buffer[2]='0';
00075 buffer[3]='0';
00076 buffer[4]='0';
00077 buffer[5]='0';
00078 error = write(fd, buffer, 6);
00079
00080 if ((error = fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK)) == -1)
00081 return error;
00082
00083 return fd;
00084 }
00085
00086
00087 int consume_seismic(void)
00088 {
00089 uint8_t buf[256];
00090 int error = 0;
00091 uint8_t len;
00092 int detect = 0;
00093 int intensity = 0;
00094
00095 while (!initialized) {
00096 s_fd = seismic_init();
00097 if (s_fd > 0)
00098 initialized++;
00099 }
00100 memset(buf, '\0', 256);
00101
00102 if ((error = read(s_fd, &len, 1)) < 0)
00103 return error;
00104
00105 if ((error = read(s_fd, buf, len)) < 0)
00106 return error;
00107
00108 if (len == 11) {
00109 detect = buf[5];
00110 intensity = buf[6] + 256 * buf[7] +
00111 256 * 256 * buf[8] + 256 * 256 * 256 * buf[9];
00112 }
00113
00114 return intensity;
00115 }