diff --git a/darkwater/DW640.cpp b/darkwater/DW640.cpp index e69de29..b435b62 100644 --- a/darkwater/DW640.cpp +++ b/darkwater/DW640.cpp @@ -0,0 +1,54 @@ +/* +Dark Water 640 driver code is placed under the BSD license. +Written by Team Dark Water (team@darkwater.io) +Copyright (c) 2014, Dark Water +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * 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. + * Neither the name of the Emlid Limited 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 EMLID LIMITED 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. +*/ + +#include "DW640.h" + +/** PCA9685 constructor. + * @param address I2C address + * @see DW640_DEFAULT_ADDRESS + */ +DW640::DW640(uint8_t address) { + this->devAddr = address; +} + +/** Power on and prepare for general usage. + * This method reads prescale value stored in PCA9685 and calculate frequency based on it. + * Then it enables auto-increment of register address to allow for faster writes. + * And finally the restart is performed to enable clocking. + */ +void DW640::initialize() { + PCA9685 this->pwm; +} + +/** Verify the I2C connection. + * @return True if connection is valid, false otherwise + */ +bool DW640::testConnection() { + return this->pwm->testConnection(); +} \ No newline at end of file diff --git a/darkwater/DW640.h b/darkwater/DW640.h index b6f3196..c6da8f5 100644 --- a/darkwater/DW640.h +++ b/darkwater/DW640.h @@ -41,20 +41,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define DW640_DEFAULT_ADDRESS 0x60 // 640 default -#define DW_FORWARD 0x00 -#define DW_REVERSE 0x01 -#define DW_BRAKEFORWARD 0x06 -#define DW_BRAKEREVERSE 0x07 -#define DW_STOP 0x08 -#define DW_COAST 0x07 +#define DW_FORWARD 1 +#define DW_REVERSE 2 +#define DW_BRAKEFORWARD 3 +#define DW_BRAKEREVERSE 4 +#define DW_STOP 5 +#define DW_COAST 6 -#define DW_SINGLE 0x07 -#define DW_DOUBLE 0x07 -#define DW_INTERLEAVE 0x07 -#define DW_MICROSTEP 0x07 +#define DW_SINGLE 1 +#define DW_DOUBLE 2 +#define DW_INTERLEAVE 3 +#define DW_MICROSTEP 4 -#define DW_ININ 0x07 -#define DW_PHASE 0x07 +#define DW_ININ 5 +#define DW_PHASE 6 class DW640 { public: @@ -63,40 +63,44 @@ class DW640 { void initialize(); bool testConnection(); - float getMode(); - void setMode(float frequency); + // float getFrequency(); + // void setFrequency(float frequency); - void setPin(uint8_t channel, uint16_t value); - void setAllPin(uint16_t value); + // float getMode(); + // void setMode(float frequency); - void setPWM(uint8_t channel, uint16_t offset, uint16_t length); - void setPWM(uint8_t channel, uint16_t length); - void setPWMmS(uint8_t channel, float length_mS); - void setPWMuS(uint8_t channel, float length_uS); + // void setPin(uint8_t channel, uint16_t value); + // void setAllPin(uint16_t value); - void setAllPWM(uint16_t offset, uint16_t length); - void setAllPWM(uint16_t length); - void setAllPWMmS(float length_mS); - void setAllPWMuS(float length_uS); + // void setPWM(uint8_t channel, uint16_t offset, uint16_t length); + // void setPWM(uint8_t channel, uint16_t length); + // void setPWMmS(uint8_t channel, float length_mS); + // void setPWMuS(uint8_t channel, float length_uS); - void allOff(uint16_t value); + // void setAllPWM(uint16_t offset, uint16_t length); + // void setAllPWM(uint16_t length); + // void setAllPWMmS(float length_mS); + // void setAllPWMuS(float length_uS); - void setMotorSpeed(uint8_t motor, uint16_t speed); - void setMotorOff(uint8_t motor); + // void allOff(uint16_t value); - void setServoOff(uint8_t servo); - void setServoPWMmS(uint8_t servo, float length_mS); - void setServoPWMuS(uint8_t servo, float length_uS); + // void setMotorSpeed(uint8_t motor, uint16_t speed); + // void setMotorOff(uint8_t motor); - void setStepperOff(uint8_t stepper); - void setStepperSpeed(uint8_t stepper, uint16_t speed); - void oneStep(uint8_t stepper, uint8_t direction, uint8_t style); - void step(uint8_t stepper, uint16_t steps, uint8_t direction, uint8_t style); + // void setServoOff(uint8_t servo); + // void setServoPWMmS(uint8_t servo, float length_mS); + // void setServoPWMuS(uint8_t servo, float length_uS); + + // void setStepperOff(uint8_t stepper); + // void setStepperSpeed(uint8_t stepper, uint16_t speed); + // void oneStep(uint8_t stepper, uint8_t direction, uint8_t style); + // void step(uint8_t stepper, uint16_t steps, uint8_t direction, uint8_t style); private: uint8_t devAddr; float frequency; uint8_t mode; + PCA9685 pwm; }; #endif // DW640_H \ No newline at end of file