diff --git a/src/drivers/rpi_pca9685_pwm_out/PCA9685.cpp b/src/drivers/rpi_pca9685_pwm_out/PCA9685.cpp index 60c91687ae..2457877092 100644 --- a/src/drivers/rpi_pca9685_pwm_out/PCA9685.cpp +++ b/src/drivers/rpi_pca9685_pwm_out/PCA9685.cpp @@ -1,26 +1,41 @@ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. +/**************************************************************************** * - * This library 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 - * Lesser General Public License for more details. + * Copyright (c) 2015-2017 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - * Name : PCA9685.cpp * Original Author : Georgi Todorov * Edited by : Tord Wessman - * Version : - * Created on : Dec 9, 2012 - * - * Copyright © 2012 Georgi Todorov - */ + * Created on : Nov 22, 2013 + * Rewrite : Fan.zhang 421395590@qq.com + * Updated on : Mar 2, 2017 + ****************************************************************************/ #include #include @@ -53,15 +68,25 @@ void PCA9685::init(int bus, int address) //usleep(10*1000); } + PCA9685::PCA9685() : - _i2caddr(0x40), - _i2cbus(1), - busfile {}, + _i2caddr(PCA9685_DEFAULT_I2C_ADDR), + _i2cbus(PCA9685_DEFAULT_I2C_BUS), dataBuffer {} { } +PCA9685::PCA9685(int bus, int address) : + busfile {}, + dataBuffer {} +{ + _i2cbus = bus; + _i2caddr = address; + snprintf(busfile, sizeof(busfile), "/dev/i2c-%d", bus); + reset(); +} + PCA9685::~PCA9685() { reset(); diff --git a/src/drivers/rpi_pca9685_pwm_out/PCA9685.h b/src/drivers/rpi_pca9685_pwm_out/PCA9685.h index c6070a79e5..a11e3483e2 100644 --- a/src/drivers/rpi_pca9685_pwm_out/PCA9685.h +++ b/src/drivers/rpi_pca9685_pwm_out/PCA9685.h @@ -1,33 +1,48 @@ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. +/**************************************************************************** * - * This library 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 - * Lesser General Public License for more details. + * Copyright (c) 2015-2017 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - * Name : PCA9685.h * Original Author : Georgi Todorov * Edited by : Tord Wessman - * Version : * Created on : Nov 22, 2013 - * - * Copyright © 2012 Georgi Todorov - */ + * Rewrite : Fan.zhang 421395590@qq.com + * Updated on : Mar 2, 2017 + ****************************************************************************/ #ifndef _PCA9685_H #define _PCA9685_H #include // Register Definitions - +// 寄存器定义 #define MODE1 0x00 //Mode register 1 #define MODE2 0x01 //Mode register 2 #define SUBADR1 0x02 //I2C-bus subaddress 1 @@ -45,15 +60,18 @@ #define ALLLED_OFF_L 0xFC //load all the LEDn_OFF registers, byte 0 (turn 0-7 channels off) #define ALLLED_OFF_H 0xFD //load all the LEDn_OFF registers, byte 1 (turn 8-15 channels off) #define PRE_SCALE 0xFE //prescaler for output frequency -#define MAX_PWM_RES 4096 //10bit精度 +#define MAX_PWM_RES 4096 //Resolution 4096=12bit 分辨率,按2的阶乘计算,12bit为4096 #define CLOCK_FREQ 25000000.0 //25MHz default osc clock #define BUFFER_SIZE 0x08 //1 byte buffer +#define PCA9685_DEFAULT_I2C_ADDR 0x40 // default i2c address for pca9685 默认i2c地址为0x40 +#define PCA9685_DEFAULT_I2C_BUS 1 // default i2c bus for pca9685 默认为1 //! Main class that exports features for PCA9685 chip class PCA9685 { public: PCA9685(); + PCA9685(int, int); void init(int, int); virtual ~PCA9685(); void reset(void); @@ -68,7 +86,5 @@ private: uint8_t read_byte(int, uint8_t); void write_byte(int, uint8_t, uint8_t); int openfd(); - - }; #endif diff --git a/src/drivers/rpi_pca9685_pwm_out/rpi_pca9685_pwm_out.cpp b/src/drivers/rpi_pca9685_pwm_out/rpi_pca9685_pwm_out.cpp index 79d9a11048..e44dff548b 100644 --- a/src/drivers/rpi_pca9685_pwm_out/rpi_pca9685_pwm_out.cpp +++ b/src/drivers/rpi_pca9685_pwm_out/rpi_pca9685_pwm_out.cpp @@ -80,11 +80,15 @@ int rpi_pca9685_pwm_out::initialize_mixer(const char *mixer_filename) int rpi_pca9685_pwm_out::pwm_initialize() { /**************初始化PCA9685开始*************/ + /**************PCA965 initializing********/ pwm.init(1, 0x40); usleep(1000 * 100); - pwm.setPWMFreq(200); //12BIT 精度输出下,好赢电调可以到200HZ刷新 + /****12BIT 精度输出下,好赢电调可以到200HZ刷新***/ + /****200HZ for 12bit Resolution, support most of the esc***/ + pwm.setPWMFreq(200); usleep(1000 * 1000); /**************初始化PCA9685结束************/ + /**************PCA965 initialized********/ return 0; } //----------------------------------------------------------------------------// @@ -95,7 +99,8 @@ void rpi_pca9685_pwm_out::pwm_deinitialize() //----------------------------------------------------------------------------// void rpi_pca9685_pwm_out::send_outputs_pwm(const uint16_t *pwm) { - //向PCA9685发送数据 + /*************向PCA9685发送数据*************/ + /*************send pwm signal to pca9685 initializing*************/ int i; for (i = 0; i < NUM_PWM; ++i) { @@ -141,11 +146,12 @@ void rpi_pca9685_pwm_out::task_main(int argc, char *argv[]) _is_running = true; /***************初始化PCA9685************/ + /***************rpc_pca9685_pwm_out*************/ rpi_pca9685_pwm_out::pwm_initialize(); // Set up mixer if (initialize_mixer(_mixer_filename) < 0) { - PX4_ERR("无法初始化通道混合配置文件"); + PX4_ERR("无法初始化通道混合配置文件 Can't loading mixer file"); return; } diff --git a/src/drivers/rpi_rc_in/rpi_rc_in.cpp b/src/drivers/rpi_rc_in/rpi_rc_in.cpp index 5b7fa3439b..c8f41632e1 100644 --- a/src/drivers/rpi_rc_in/rpi_rc_in.cpp +++ b/src/drivers/rpi_rc_in/rpi_rc_in.cpp @@ -43,12 +43,12 @@ int RcInput::rpi_rc_init() //--------------初始化共享内存映射----------------------------// if ((this->shmid = shmget(this->key, sizeof(int) * this->_channels, 0666)) < 0) { - PX4_WARN("无法访问共享内存"); + PX4_WARN("无法访问共享内存。Faild to access shared memory"); return -1; } if ((this->mem = (int *) shmat(this->shmid, NULL, 0)) == (void *) - 1) { - PX4_WARN("无法映射共享内存"); + PX4_WARN("无法映射共享内存。Faild to mapping shared memory"); return -1; } @@ -113,11 +113,12 @@ void RcInput::_cycle() void RcInput::_measure(void) { uint64_t ts; - // PWM 数据发布 + // PWM数据发布 + // read pwm value from shared memory int i = 0; for (i = 0; i < _channels; ++i) { - _data.values[i] = *(this->mem + i); + _data.values[i] = (*(this->mem + i) <= 0) ? UINT16_MAX : *(this->mem + i); } ts = hrt_absolute_time(); @@ -158,7 +159,7 @@ int rpi_rc_in_main(int argc, char **argv) if (!strcmp(argv[1], "start")) { if (rc_input != nullptr && rc_input->isRunning()) { - PX4_WARN("运行中。"); + PX4_WARN("运行中。running"); /* this is not an error */ return 0; } @@ -167,14 +168,14 @@ int rpi_rc_in_main(int argc, char **argv) // Check if alloc worked. if (nullptr == rc_input) { - PX4_ERR("遥控输入模块初始化错误。"); + PX4_ERR("遥控输入模块初始化错误。Rc input moduel initialization faild"); return -1; } int ret = rc_input->start(); if (ret != 0) { - PX4_ERR("遥控输入模块未能启动"); + PX4_ERR("遥控输入模块未能启动。 Rc input module failure"); } return 0; @@ -183,7 +184,7 @@ int rpi_rc_in_main(int argc, char **argv) if (!strcmp(argv[1], "stop")) { if (rc_input == nullptr || !rc_input->isRunning()) { - PX4_WARN("模块未运行"); + PX4_WARN("模块未运行。 Not runing"); /* this is not an error */ return 0; } @@ -207,16 +208,16 @@ int rpi_rc_in_main(int argc, char **argv) if (!strcmp(argv[1], "status")) { if (rc_input != nullptr && rc_input->isRunning()) { - PX4_INFO("运行中"); + PX4_INFO("运行中。 running"); } else { - PX4_INFO("未运行\n"); + PX4_INFO("未运行。 Not runing\n"); } return 0; } - usage("不知道你要做什么"); + usage("不知道你要做什么。 rpi_rc_in start|stop|status"); return 1; }