Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <sstream>
00013 #include <iostream>
00014 #include <stdint.h>
00015 #include <stdio.h>
00016 #include <stdlib.h>
00017 #include <fcntl.h>
00018 #include <unistd.h>
00019 #include <sys/ioctl.h>
00020 #include <sys/time.h>
00021 #include <sys/ipc.h>
00022 #include <sys/types.h>
00023 #include <sys/shm.h>
00024 #include <linux/spi/spidev.h>
00025 #include <ros/ros.h>
00026 #include <ros/time.h>
00027 #include <std_msgs/String.h>
00028 #include <gumstix_memread_bma180/bma180meas.h>
00029 #include <gumstix_memwrite_bma180/writermsg.h>
00030 #include <errno.h>
00031
00032 using namespace std;
00033
00034 #define SHMSZ 30720000
00035 #define xSHMSZ 0x1D4C000 //hex converted
00036 #define NUM_SENSORS 8
00037 bool readit=false;
00038
00039 void msgCallback(const gumstix_memwrite_bma180::writermsg::ConstPtr & msg){
00040 if(msg->written==true){
00041 readit=true;
00042 } else{
00043 readit=false;
00044 }
00045 }
00046
00047
00048
00049 int main(int argc, char** argv) {
00050
00051 ros::init(argc, argv, "gumstix_memread_bma180");
00052 ros::NodeHandle n;
00053 ros::Publisher pub = n.advertise<gumstix_memread_bma180::bma180meas> ("bma180meas", 1000);
00054 ros::Subscriber sub = n.subscribe("/writermsg", 100, msgCallback);
00055
00056
00057 gumstix_memread_bma180::bma180meas msg;
00058
00059
00060 double rate_Hz;
00061 if(n.getParam("/gumstix_memread_bma180/rate_Hz", rate_Hz)==false){
00062 rate_Hz = 50;
00063 }
00064 cout << "Publishing rate: " << rate_Hz << " Hz" << endl;
00065
00066 int16_t *shm, *s, shmid;
00067 key_t key = 42;
00068 if ((shmid = shmget(key, SHMSZ, 0666)) < 0) {
00069 cerr << "shmget did not work - " << errno << endl;
00070 if(errno == EINVAL)
00071 printf("Invalid segment size specified\n");
00072 else if(errno == EEXIST)
00073 printf("Segment exists, cannot create it\n");
00074 else if(errno == EIDRM)
00075 printf("Segment is marked for deletion or was removed\n");
00076 else if(errno == ENOENT)
00077 printf("Segment does not exist\n");
00078 else if(errno == EACCES)
00079 printf("Permission denied\n");
00080 else if(errno == ENOMEM)
00081 printf("Not enough memory to create segment\n");
00082 }
00083 if ((shm = (int16_t *)shmat(shmid, NULL, 0)) == (int16_t *) -1) {
00084 cerr << "shmat did not work!" << endl;
00085 }
00086
00087
00088 int16_t i=0, j=0, k=0, val=0;
00089 long m=0, l=0;
00090 s = shm;
00091 s++;
00092 cout << "Begin memory <reader> : " << s << endl;
00093 ros::Rate loop1(1);
00094 while(ros::ok()){
00095 if(readit==true){
00096 readit = false;
00097 break;
00098 }
00099 ros::spinOnce();
00100 loop1.sleep();
00101 }
00102 cout << "Publishing to topic /bma180meas... " << endl;
00103 ros::Rate loop_rate(rate_Hz);
00104
00105 while (ros::ok()) {
00106
00107 int num_msgs = 6*10*NUM_SENSORS;
00108 for (j=0; j<(num_msgs); j++) {
00109 i = (int16_t)*s;
00110 msg.vals.push_back(i);
00111
00112 s++; m++;
00113 if(s>=(shm+xSHMSZ)){
00114 s = shm;
00115 s++;
00116 }
00117 if(i==0) l++;
00118 if(l>=num_msgs){
00119 k=1;
00120 break;
00121 }
00122 }
00123 l=0;
00124 pub.publish(msg);
00125 msg.vals.clear();
00126 if(k==1){
00127 break;
00128 }
00129
00130 ros::spinOnce();
00131 loop_rate.sleep();
00132 }
00133 cout << "Done publishing..." << endl;
00134 cout << "Values published: " << m << endl;
00135
00136 cout << "End memory <reader>: " << s << endl;
00137 exit(0);
00138
00139 }