From 05945bc90cb58597c22d6407acf4eecb71cc361f Mon Sep 17 00:00:00 2001 From: Martin Mueller Date: Tue, 25 Aug 2009 19:27:20 +0000 Subject: [PATCH] stand alone xbee message example code --- sw/in_progress/turbine/Makefile | 12 ++ sw/in_progress/turbine/turb_simu.c | 305 +++++++++++++++++++++++++++++ 2 files changed, 317 insertions(+) create mode 100644 sw/in_progress/turbine/Makefile create mode 100644 sw/in_progress/turbine/turb_simu.c diff --git a/sw/in_progress/turbine/Makefile b/sw/in_progress/turbine/Makefile new file mode 100644 index 0000000000..38b7855486 --- /dev/null +++ b/sw/in_progress/turbine/Makefile @@ -0,0 +1,12 @@ + +CC=gcc +MODCFLAGS=-Wall + +all: turb_simu + +clean: + rm -f core *.o turb_simu + +ublox_conf: ublox_conf.c Makefile + $(CC) $(MODCFLAGS) turb_simu.c -o turb_simu + diff --git a/sw/in_progress/turbine/turb_simu.c b/sw/in_progress/turbine/turb_simu.c new file mode 100644 index 0000000000..a4b4e5c55b --- /dev/null +++ b/sw/in_progress/turbine/turb_simu.c @@ -0,0 +1,305 @@ +/* + * turbine message simulator $Id: turb_simu.c 2145 2007-12-16 00:10:07Z mmm $ + * + * Copyright (C) 2009 Martin Mueller + * + * This file is part of paparazzi. + * + * paparazzi is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * paparazzi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with paparazzi; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + + +/* *********************** change this to your needs *********************** */ + +/* serial speed */ +#define DEFAULT_BAUDRATE 57600 +/* serial port (ttyS0, ttyACM0, ttyUSB0) */ +#define SERIAL_DEVICE "/dev/ttyUSB0" + + +struct speed_map +{ + speed_t speed; + unsigned int speed_value; +}; + +static const struct speed_map speeds[] = { + {B0, 0}, + {B50, 50}, + {B75, 75}, + {B110, 110}, + {B134, 134}, + {B150, 150}, + {B200, 200}, + {B300, 300}, + {B600, 600}, + {B1200, 1200}, + {B1800, 1800}, + {B2400, 2400}, + {B4800, 4800}, + {B9600, 9600}, + {B19200, 19200}, + {B38400, 38400}, + {B57600, 57600}, + {B115200, 115200}, + {B230400, 230400}, +}; + +static const int NUM_SPEEDS = (sizeof(speeds) / sizeof(struct speed_map)); + + +static speed_t int_to_baud(unsigned int value) +{ + int i; + + for (i = 0; i < NUM_SPEEDS; ++i) + { + if (value == speeds[i].speed_value) + { + return speeds[i].speed; + } + } + return (speed_t) - 1; +} + +int main (void) +{ + char out_file_name[80] = SERIAL_DEVICE; + fd_set read_fd_set; + int max_fd; + struct termios orig_termios, cur_termios; + struct timeval select_tv; + unsigned char data[256]; + unsigned char data_temp; + int serial_fd; + int count, i; + int br; + int baud; + + if ((br = int_to_baud(DEFAULT_BAUDRATE)) < 0 ) + { + printf("invalid baudrate %d\n", DEFAULT_BAUDRATE); + return( -1 ); + } + + if ( (serial_fd = open( out_file_name, O_RDWR )) == 0 ) + { + perror("could not open serial port"); + return( -1 ); + } + + if (tcgetattr(serial_fd, &orig_termios)) + { + perror("getting modem serial device attr"); + return( -1 ); + } + + cur_termios = orig_termios; + + /* input modes */ + cur_termios.c_iflag &= ~(IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK|ISTRIP|INLCR|IGNCR + |ICRNL |IXON|IXANY|IXOFF|IMAXBEL); + + /* IGNCR does not pass 0x0D */ + cur_termios.c_iflag |= BRKINT; + + /* output_flags */ + cur_termios.c_oflag &=~(OPOST|ONLCR|OCRNL|ONOCR|ONLRET); + + /* control modes */ + cur_termios.c_cflag &= ~(CSIZE|CSTOPB|CREAD|PARENB|PARODD|HUPCL|CLOCAL|CRTSCTS); + cur_termios.c_cflag |= CREAD|CS8|CLOCAL; + + /* local modes */ + cur_termios.c_lflag &= ~(ISIG|ICANON|IEXTEN|ECHO|FLUSHO|PENDIN); + cur_termios.c_lflag |= NOFLSH; + + if (cfsetispeed(&cur_termios, B0)) + { + perror("setting input modem serial device speed"); + return( -1 ); + } + + if (cfsetospeed(&cur_termios, br)) + { + perror("setting modem serial device speed"); + return( -1 ); + } + + if (tcsetattr(serial_fd, TCSADRAIN, &cur_termios)) + { + perror("setting modem serial device attr"); + return( -1 ); + } + + +/* enable this to record data */ +#if 0 + printf("receiving\n"); + while (1) + { + FD_ZERO( &read_fd_set ); + FD_SET( 0, &read_fd_set ); + FD_SET( serial_fd, &read_fd_set ); + max_fd = serial_fd; + i = select( max_fd + 1, + &read_fd_set, + NULL, + NULL, + &select_tv ); + + if ( FD_ISSET(serial_fd, &read_fd_set) ) + { + read(serial_fd, &data_temp, 1); +printf(" 0x%02X %c\n", data_temp, data_temp); +// if (data_temp == 0x7E) printf("\n"); +// printf("0x%02X, ", data_temp); + } + else + { + } + } +#endif + + + /* this is the interesting part */ + { + /* + + XBee-message: ABCDxxxxxxxE + A XBEE_START (0x7E) + B LENGTH_MSB (D->D) + C LENGTH_LSB + D XBEE_PAYLOAD + 0 XBEE_TX16 (0x01) / XBEE_RX16 (0x81) + 1 FRAME_ID (0) / SRC_ID_MSB + 2 DEST_ID_MSB / SRC_ID_LSB + 3 DEST_ID_LSB / XBEE_RSSI + 4 TX16_OPTIONS (0) / RX16_OPTIONS + 5 PPRZ_DATA + 0 SENDER_ID + 1 MSG_ID + 2 MSG_PAYLOAD + . DATA (messages.xml) + E XBEE_CHECKSUM (sum[D->D]) + + + + + + + + + */ + + /* valid example data */ + unsigned char data[] = { 0x7E, // XBEE_START + 0x00, 0x11, // PAYLOAD LENGTH (0x0011) + 0x01, // XBEE TX_16 + 0x37, // FRAME_ID (incremented) + 0xFF, 0xFF, // DESTINATION ID 0xFFFF (broadcast) + 0x00, // TX16_OPTIONS (none) + // Paparazzi message + 0x00, // SENDER_ID (0) + 0x32, // MSG_ID 0x32 = 50 (WINDTURBINE_STATUS) + 0x2A, // ac_id 42 (target aircraft id) + 0x01, // tb_id 01 (source turbine id) + 0x39, 0x30, 0x00, 0x00, // sync_itow + 0x32, 0x09, 0x01, 0x00, // cycle_time + 0xC7 }; // CHECKSUM + + /* this should be possible to set by defines in script */ + unsigned char ac_id = 23; + unsigned char tb_id = 1; + + /* this is the data estimated */ + unsigned int sync_itow; + unsigned int cycle_time; + + /* this is calculated in the routine*/ + unsigned char frame_id = 0; + unsigned char checksum = 0; + + #define AT_COMMAND_SEQUENCE "+++" + #define AT_SET_MY "ATMY0101\r" + #define AT_AP_MODE "ATAP1\r" + #define AT_EXIT "ATCN\r" + + /* switching to AT mode */ + write(serial_fd, AT_COMMAND_SEQUENCE, 3); + + /* busy wait 1.25s */ + usleep(1250000); + + /* setting my address to 0x0101 */ + write(serial_fd, AT_SET_MY, 9); + + /* start API */ + write(serial_fd, AT_AP_MODE, 6); + + /* switching back to normal mode */ + write(serial_fd, AT_EXIT, 5); + + while(1) + { + /* increase for each message*/ + frame_id++; + + /* should be calculated - dummy values here */ + sync_itow = 12345678; + cycle_time = 87654321; + + /* set values in message */ + data[4] = frame_id; + data[10] = ac_id; + data[11] = tb_id; + data[12] = sync_itow & 0xFF; + data[13] = (sync_itow >> 8) & 0xFF; + data[14] = (sync_itow >> 16) & 0xFF; + data[15] = (sync_itow >> 24) & 0xFF; + data[16] = cycle_time & 0xFF; + data[17] = (cycle_time >> 8) & 0xFF; + data[18] = (cycle_time >> 16) & 0xFF; + data[19] = (cycle_time >> 24) & 0xFF; + + /* calculate checksum */ + checksum = 0; + for (i=3; i<20; i++) checksum += data[i]; + checksum = 0xFF - checksum; + + /* set checksum */ + data[20] = checksum; + + /* send data */ + write(serial_fd, data, 21); + sleep(1); + } + } + + close(serial_fd); + + return(0); +}