7 #include <sys/socket.h>
21 short int convertShortInt(short int x)
34 if ((sock_motor = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {
35 perror("create motor socket");
39 addr_motor.can_family = AF_CAN;
41 strcpy(ifr_motor.ifr_name, "can0");
42 if (ioctl(sock_motor, SIOCGIFINDEX, &ifr_motor) < 0)
43 perror("SIOCGIFINDEX");
44 addr_motor.can_ifindex = ifr_motor.ifr_ifindex;
46 if (!addr_motor.can_ifindex) {
47 perror("invalid motor socket interface");
51 if (bind(sock_motor, (struct sockaddr *)&addr_motor, sizeof(addr_motor)) < 0) {
52 perror("motor socket bind");
59 int set_motor_speed(struct orte_data *orte_data)
61 unsigned char data[4];
62 data[0] = orte_data->motion_speed.left>>8;
63 data[1] = orte_data->motion_speed.left & 0xff;
64 data[2] = orte_data->motion_speed.right >> 8;
65 data[3] = orte_data->motion_speed.right & 0xff;
67 // for (int i=0; i< 4; i++) {
68 // printf("%02x ",data[i]);
71 can_send(CAN_MOTION_CMD, 4, data);
75 int set_serva(struct orte_data *orte_data)
77 unsigned char data[6];
78 data[5] = orte_data->servos.backDoor;
79 data[1] = orte_data->servos.frontDoor;
80 data[2] = orte_data->servos.transporterFront;
81 data[3] = orte_data->servos.transporterInner;
82 data[4] = orte_data->servos.innerDoor;
83 data[0] = orte_data->servos.release;
84 // for(int i=0;i<6;i++) printf("data %d = 0x%x\n",i,data[i]);
85 can_send(CAN_SERVO, 6, data);
89 bool moveServo(int servoNr, int value) {
93 int can_send(canid_t id, unsigned char length, unsigned char *data)
95 struct can_frame frame;
99 frame.can_dlc = length;
100 for(int i=0; i<length; i++) {
101 frame.data[i] = data[i];
103 if ((nbytes = write(sock_motor, &frame, sizeof(struct can_frame))) < 0) {
107 else if (nbytes < sizeof(struct can_frame)) {
108 // printf("write: incomplete CAN frame\n");
111 // printf("write returned %d\n",nbytes);
112 // printf("finnished can send\n");
116 int main(int argc, char *argv[])
118 struct orte_data orte;
122 struct timeval timeval;
125 int las_mi, las_di, las_bcnt;
126 unsigned short *las_meas;
139 if(init_can()) printf("init can failed\n");
140 else printf("init can OK\n");
142 ortelib_init(NULL, &orte, ORTE_SUB_MOTOR | ORTE_SUB_SERVA,
143 ORTE_PUB_IR | ORTE_PUB_FD | ORTE_PUB_DI | ORTE_PUB_SHARPLONG |
144 ORTE_PUB_ADCS | ORTE_PUB_SHARPSHORT | ORTE_PUB_POSITION |
145 ORTE_PUB_MOTSTAT | ORTE_PUB_LASER);
148 FD_ZERO(&read_fd_set);
149 FD_SET(sock_motor, &read_fd_set);
151 timeval.tv_usec = 10000;
153 ret = select(FD_SETSIZE, &read_fd_set, NULL, NULL, &timeval);
158 // else if(ret==0) perror("no message received in 10000 usec");
160 nbytes = read(sock_motor, &frame, sizeof(struct can_frame));
161 switch(frame.can_id) {
162 case CAN_MOTION_ODOMETRY_SIMPLE: {
163 orte.motion_position.left = (frame.data[0]<<24)|(frame.data[1]<<16)|(frame.data[2]<<8)|(frame.data[3]);
164 orte.motion_position.right = (frame.data[4]<<24)|(frame.data[5]<<16)|(frame.data[6]<<8)|(frame.data[7]);
165 ORTEPublicationSend(orte.publicationMotionPos);
168 case CAN_MOTION_STATUS: {
169 orte.motion_status.err_left = (frame.data[0]<<8)|(frame.data[1]);
170 orte.motion_status.err_right = (frame.data[2]<<8)|(frame.data[3]);
171 if(++status_cnt==5) {
172 ORTEPublicationSend(orte.publicationMotionStatus);
175 // if(ms.err_left || ms.err_right) printf("MOTOR STATUS: left 0x%x, right 0x%x\n",ms.err_left,ms.err_right);
179 /* TODO: zkontrolovat, zda hodnoty jsou spravne v mm !! */
180 orte.sharps_oponent.longSharpDist1 = s_ir2mmLong((frame.data[0]<<8)|(frame.data[1]))/1000.0;
181 orte.sharps_oponent.longSharpDist2 = s_ir2mmLong((frame.data[2]<<8)|(frame.data[3]))/1000.0;
182 orte.sharps_oponent.longSharpDist3 = s_ir2mmLong((frame.data[4]<<8)|(frame.data[5]))/1000.0;
183 orte.front_door.state = (frame.data[6]<<8)|frame.data[7];
185 if(++adc1_cnt == 5) {
186 ORTEPublicationSend(orte.publicationSharp1);
191 orte.sharps_waste.short1 = (frame.data[0]<<8)|(frame.data[1]);
192 orte.sharps_waste.short2 = (frame.data[2]<<8)|(frame.data[3]);
193 orte.sharps_waste.short3 = (frame.data[4]<<8)|(frame.data[5]);
194 orte.sharps_waste.short4 = (frame.data[6]<<8)|(frame.data[7]);
196 if(++adc2_cnt == 5) {
197 ORTEPublicationSend(orte.publicationSharp2);
202 orte.adcs.sharpLong1 = (frame.data[0]);
203 orte.adcs.sharpLong2 = (frame.data[1]);
204 orte.adcs.sharpLong3 = (frame.data[2]);
205 orte.adcs.sharpShort1 = (frame.data[3]);
206 orte.adcs.sharpShort2 = (frame.data[4]);
207 orte.adcs.sharpShort3 = (frame.data[5]);
208 orte.adcs.sharpShort4 = (frame.data[6]);
209 orte.adcs.frontDoor = (frame.data[7]);
211 if(++adc3_cnt == 5) {
212 ORTEPublicationSend(orte.publicationAdcs);
217 orte.inner_ir.front = frame.data[1];
218 orte.inner_ir.back = frame.data[0];
219 // printf("IR: 0x%04x\n",stateIR);
220 ORTEPublicationSend(orte.publicationIR);
221 orte.dig_in.state = frame.data[2];
223 ORTEPublicationSend(orte.publicationDI);
230 for (i=0; i<frame.can_dlc; i++) {
231 printf("0x%02x ", frame.data[i]);
233 printf("can_dlc=%d\n", frame.can_dlc);
234 orte.laser.cnt = frame.data[1];
235 las_bcnt = orte.laser.cnt;
236 last_id = frame.data[0];
238 orte.laser.period = (frame.data[2]<<8)|(frame.data[3]); //perioda
239 printf("CAN ID=0x%02x: cnt=%d period=%d measures: ", frame.can_id, orte.laser.cnt, orte.laser.period);
240 for (las_mi=0; las_mi<(frame.can_dlc-4)/2; las_mi++) {
242 case 0: las_meas = &orte.laser.measures0; break;
243 case 1: las_meas = &orte.laser.measures1; break;
247 (frame.data[las_di++]<<8)|(frame.data[las_di++]);
248 printf("0x%02x 0x%02x %u ", frame.data[las_di-2], frame.data[las_di-1], *las_meas);
256 for (i=0; i<frame.can_dlc; i++) {
257 printf("0x%02x ", frame.data[i]);
259 printf("can_dlc=%d\n", frame.can_dlc);
260 printf("CAN ID=0x%02x: cnt=%d period=%d measures: ", frame.can_id, orte.laser.cnt, orte.laser.period);
261 if (frame.data[0] != (last_id+(frame.can_id-CAN_LAS1)))
264 while (las_di < 8 && las_bcnt > 0) {
266 case 2: las_meas = &orte.laser.measures2; break;
267 case 3: las_meas = &orte.laser.measures3; break;
268 case 4: las_meas = &orte.laser.measures4; break;
269 case 5: las_meas = &orte.laser.measures5; break;
270 case 6: las_meas = &orte.laser.measures6; break;
271 case 7: las_meas = &orte.laser.measures7; break;
272 case 8: las_meas = &orte.laser.measures8; break;
273 case 9: las_meas = &orte.laser.measures9; break;
277 (frame.data[las_di++]<<8)|(frame.data[las_di++]);
278 printf("0x%02x 0x%02x %u ", frame.data[las_di-2], frame.data[las_di-1], *las_meas);
284 printf("ORTEPublicationSend()\n");
285 ORTEPublicationSend(orte.publicationLaser);
289 // printf("received CAN msg with unknown id: %x\n",frame.can_id);