generated from TDD-Templates/cmake_cpputest_template_avr
Merge branch 'dev'
This commit is contained in:
commit
b64c306250
|
@ -32,8 +32,8 @@
|
||||||
|
|
||||||
//Addresses in the eeprom for the two switch states
|
//Addresses in the eeprom for the two switch states
|
||||||
#define ROM_SP_ADR 0x0
|
#define ROM_SP_ADR 0x0
|
||||||
#define ROM_SS1_ADR 0x1
|
#define POSITION1_ADR 0x1
|
||||||
#define ROM_SS2_ADR 0x2
|
#define POSITION2_ADR 0x2
|
||||||
#define ROM_EP_ADR 0x3
|
#define ROM_EP_ADR 0x3
|
||||||
|
|
||||||
//Debounce check number.
|
//Debounce check number.
|
||||||
|
@ -89,7 +89,6 @@ typedef struct {
|
||||||
uint8_t timer_enabled: 1;
|
uint8_t timer_enabled: 1;
|
||||||
uint8_t pressed_ticks;
|
uint8_t pressed_ticks;
|
||||||
uint8_t input_pin;
|
uint8_t input_pin;
|
||||||
uint8_t output_pin;
|
|
||||||
}btn_state;
|
}btn_state;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -16,22 +16,16 @@ int fake_index = 0;
|
||||||
static bool is_setup = false;
|
static bool is_setup = false;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ADC_SetPin(uint8_t pin_num)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ADC_Setup(void)
|
void ADC_Setup(void)
|
||||||
{
|
{
|
||||||
is_setup = true;
|
is_setup = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ADC_Init(uint8_t pin_num)
|
void ADC_Init(uint8_t adc_chan)
|
||||||
{
|
{
|
||||||
mock_c()->actualCall("ADC_Init")
|
mock_c()->actualCall("ADC_Init")
|
||||||
->withUnsignedIntParameters("pin_num", pin_num);
|
->withUnsignedIntParameters("adc_chan", adc_chan);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ADC_Enable(void)
|
void ADC_Enable(void)
|
||||||
|
@ -44,10 +38,10 @@ void ADC_Disable()
|
||||||
mock_c()->actualCall("ADC_Disable");
|
mock_c()->actualCall("ADC_Disable");
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t ADC_ReadValue_Impl(uint8_t pin_num)
|
uint16_t ADC_ReadValue_Impl(void)
|
||||||
{
|
{
|
||||||
mock_c()->actualCall("ADC_ReadValue_Impl")
|
mock_c()->actualCall("ADC_ReadValue_Impl");
|
||||||
->withUnsignedIntParameters("pin_num", pin_num);
|
|
||||||
|
|
||||||
if(fake_index == 0){
|
if(fake_index == 0){
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -55,7 +49,7 @@ uint16_t ADC_ReadValue_Impl(uint8_t pin_num)
|
||||||
return fake_data[--fake_index];
|
return fake_data[--fake_index];
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t (*ADC_ReadValue)(uint8_t pin_num) = ADC_ReadValue_Impl;
|
uint16_t (*ADC_ReadValue)(void) = ADC_ReadValue_Impl;
|
||||||
|
|
||||||
|
|
||||||
void MockADC_PushValue(uint16_t value){
|
void MockADC_PushValue(uint16_t value){
|
||||||
|
|
|
@ -15,12 +15,11 @@
|
||||||
|
|
||||||
|
|
||||||
void ADC_Setup(void);
|
void ADC_Setup(void);
|
||||||
void ADC_SetPin(uint8_t pin_num);
|
void ADC_Init(uint8_t adc_chan);
|
||||||
void ADC_Init(uint8_t pin_num);
|
|
||||||
void ADC_Enable(void);
|
void ADC_Enable(void);
|
||||||
void ADC_Disable(void);
|
void ADC_Disable(void);
|
||||||
|
|
||||||
extern uint16_t (*ADC_ReadValue)(uint8_t pin_num);
|
extern uint16_t (*ADC_ReadValue)(void);
|
||||||
|
|
||||||
void MockADC_PushValue(uint16_t value);
|
void MockADC_PushValue(uint16_t value);
|
||||||
void MockADC_ZeroIndex(void);
|
void MockADC_ZeroIndex(void);
|
||||||
|
|
11
otto.sh
11
otto.sh
|
@ -224,12 +224,19 @@ run_c_tests () {
|
||||||
make AllTests && ./tests/AllTests -c -v
|
make AllTests && ./tests/AllTests -c -v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
run_mock_tests () {
|
||||||
|
format_source_code
|
||||||
|
clear_cmake_cache
|
||||||
|
cmake -DUNIT_TESTING=ON -DCMAKE_VERBOSE_MAKEFILE=${CMAKE_VERBOSE} ../
|
||||||
|
make Mock_Tests && ./tests/Mock_Tests -c -v
|
||||||
|
}
|
||||||
|
|
||||||
print_menu () {
|
print_menu () {
|
||||||
echo "BUILD MENU:"
|
echo "BUILD MENU:"
|
||||||
echo "0. Add Mock Module"
|
echo "0. Add Mock Module"
|
||||||
echo "1. Run Tests"
|
echo "1. Run Tests"
|
||||||
echo "2. Build Project(hex)"
|
echo "2. Build Project(hex)"
|
||||||
echo "3. User Option"
|
echo "3. Run MockTests"
|
||||||
echo "4. Flash to AVR"
|
echo "4. Flash to AVR"
|
||||||
echo "5. Add new module to project"
|
echo "5. Add new module to project"
|
||||||
echo "6. Delete module from project"
|
echo "6. Delete module from project"
|
||||||
|
@ -264,7 +271,7 @@ main() {
|
||||||
3)
|
3)
|
||||||
echo "You selected Option 3"
|
echo "You selected Option 3"
|
||||||
valid_choice=true
|
valid_choice=true
|
||||||
build_hex_optimized
|
run_mock_tests
|
||||||
;;
|
;;
|
||||||
4)
|
4)
|
||||||
echo "You selected Option 4"
|
echo "You selected Option 4"
|
||||||
|
|
|
@ -13,15 +13,30 @@
|
||||||
#include "RegEdit.h"
|
#include "RegEdit.h"
|
||||||
#include "avr/io.h"
|
#include "avr/io.h"
|
||||||
|
|
||||||
#define MAX_PIN_NUM 7
|
#define MAX_CHANNEL_NUM 3
|
||||||
|
|
||||||
static bool IsInvalidPin(uint8_t pin_num) {
|
static bool IsInvalidChannel(uint8_t adc_chan) {
|
||||||
if (pin_num > MAX_PIN_NUM) {
|
if (adc_chan > MAX_CHANNEL_NUM) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t ADC_GetChannelPinNum(uint8_t adc_chan) {
|
||||||
|
switch (adc_chan) {
|
||||||
|
case 0:
|
||||||
|
return PB5;
|
||||||
|
case 1:
|
||||||
|
return PB2;
|
||||||
|
case 2:
|
||||||
|
return PB4;
|
||||||
|
case 3:
|
||||||
|
return PB3;
|
||||||
|
default:
|
||||||
|
return 255; /*return invalid pin num.*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ADC_Setup(void) {
|
void ADC_Setup(void) {
|
||||||
// Clear the register, set VCC as ref, ADC0 as channel and
|
// Clear the register, set VCC as ref, ADC0 as channel and
|
||||||
// leave result right adjusted.
|
// leave result right adjusted.
|
||||||
|
@ -36,62 +51,61 @@ void ADC_Setup(void) {
|
||||||
RegEdit_AND_Num((void *)&ADCSRB, (1 << ADTS2) | (0 << ADTS1) | (1 << ADTS0));
|
RegEdit_AND_Num((void *)&ADCSRB, (1 << ADTS2) | (0 << ADTS1) | (1 << ADTS0));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ADC_Init(uint8_t pin_num) {
|
void ADC_Init(uint8_t adc_chan) {
|
||||||
|
|
||||||
if (IsInvalidPin(pin_num)) {
|
if (IsInvalidChannel(adc_chan)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get the associated pin number.
|
||||||
|
uint8_t pin_num = ADC_GetChannelPinNum(adc_chan);
|
||||||
|
|
||||||
// set the direction to input
|
// set the direction to input
|
||||||
// RegEdit_ClearBit((void *)&PORTA.DIR, pin_num);
|
RegEdit_ClearBit((void *)&DDRB, pin_num);
|
||||||
|
|
||||||
// Disable the pull-up resistor
|
// Disable the pull-up resistor
|
||||||
// RegEdit_ClearBit((void *)&PORTA.OUT, pin_num);
|
RegEdit_ClearBit((void *)&PORTB, pin_num);
|
||||||
|
|
||||||
// Disable input buffer
|
// Set the adc mux reg for our channel.
|
||||||
// We do some kinda nasty address addition but it saves
|
|
||||||
// memory and means we don't need a switch statment.
|
// Clear the existing mux bits.
|
||||||
// RegEdit_SetBit((void *)(&PORTA.PIN0CTRL) + pin_num,
|
RegEdit_AND_Num((void *)&ADMUX, 0xFC);
|
||||||
// PORT_ISC_INPUT_DISABLE_gc);
|
|
||||||
|
// Set the correct bits
|
||||||
|
RegEdit_OR_Num((void *)&ADMUX, adc_chan);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ADC_Enable(void) {
|
void ADC_Enable(void) {
|
||||||
// Set the enable bit in the CTRLA register
|
// Set the enable bit in the CTRLA register
|
||||||
// RegEdit_SetBit((void *)&ADC0.CTRLA, 0);
|
RegEdit_SetBit((void *)&ADCSRA, ADEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ADC_Disable() {
|
void ADC_Disable() {
|
||||||
// Clear the enable ADC flag
|
// Clear the enable ADC flag
|
||||||
// RegEdit_ClearBit((void *)&ADC0.CTRLA, 0);
|
RegEdit_ClearBit((void *)&ADCSRA, ADEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ADC_SetPin(uint8_t pin_num) {
|
uint16_t ADC_ReadValue_Impl(void) {
|
||||||
if (IsInvalidPin(pin_num)) {
|
|
||||||
return;
|
// start conversion.
|
||||||
|
RegEdit_SetBit((void *)&ADCSRA, ADSC);
|
||||||
|
|
||||||
|
/* Wait until ADC conversion done or it times out. */
|
||||||
|
uint8_t cycles = 1;
|
||||||
|
while (1) {
|
||||||
|
if (!RegEdit_IsBitSet((void *)&ADCSRA, ADSC)) {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
// RegEdit_ClearRegister((void *)&ADC0.MUXPOS);
|
// if It times out return an invalid value for a 12bit ADC.
|
||||||
// RegEdit_SetNum((void *)&ADC0.MUXPOS, pin_num);
|
else if (cycles >= ADC_WAIT_TIMEOUT) {
|
||||||
|
return UINT16_MAX;
|
||||||
|
}
|
||||||
|
cycles++;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t ADC_ReadValue_Impl(uint8_t pin_num) {
|
uint16_t val = ADC;
|
||||||
// RegEdit_SetNum((void *)&ADC0.COMMAND, ADC_STCONV_bm);
|
return val;
|
||||||
|
|
||||||
/* Wait until ADC conversion done */
|
|
||||||
|
|
||||||
/*
|
|
||||||
while (!(ADC0.INTFLAGS & ADC_RESRDY_bm)) {
|
|
||||||
;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Clear the interrupt flag by writing 1: */
|
|
||||||
// ADC0.INTFLAGS = ADC_RESRDY_bm;
|
|
||||||
|
|
||||||
// uint16_t adc_val = (uint16_t)ADC0.RES;
|
|
||||||
uint16_t adc_val = 0;
|
|
||||||
adc_val = adc_val >> 5;
|
|
||||||
return adc_val;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the default for the function pointer.
|
// Set the default for the function pointer.
|
||||||
uint16_t (*ADC_ReadValue)(uint8_t pin_num) = ADC_ReadValue_Impl;
|
uint16_t (*ADC_ReadValue)(void) = ADC_ReadValue_Impl;
|
||||||
|
|
|
@ -13,10 +13,16 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The number of loop cycles it waits for ADC conversion before
|
||||||
|
* timing out.
|
||||||
|
*/
|
||||||
|
#define ADC_WAIT_TIMEOUT 16
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initializes the AVR hardware in order to accept
|
* @brief Initializes the AVR hardware in order to accept
|
||||||
* Input for ADC usage.
|
* Input for ADC usage.
|
||||||
* @param pin_num The number of the pin 0-7 you are initializing.
|
* @param adc_chan The channel of the pin 0-7 you are initializing.
|
||||||
*
|
*
|
||||||
* This function only makes use of PORTA by default. It sets the direction
|
* This function only makes use of PORTA by default. It sets the direction
|
||||||
* register to input, disables the pull-up resistor and also diables interrupts
|
* register to input, disables the pull-up resistor and also diables interrupts
|
||||||
|
@ -25,7 +31,13 @@
|
||||||
* This in turn helps reduce noise when using the ADC.
|
* This in turn helps reduce noise when using the ADC.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void ADC_Init(uint8_t pin_num);
|
void ADC_Init(uint8_t adc_chan);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the pin number for the adc channel or 255 on an error.
|
||||||
|
* @param The ADC channel.
|
||||||
|
*/
|
||||||
|
uint8_t ADC_GetChannelPinNum(uint8_t adc_chan);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Enables the ADC
|
* @brief Enables the ADC
|
||||||
|
@ -40,12 +52,11 @@ void ADC_Disable();
|
||||||
/**
|
/**
|
||||||
* @brief Reads ADC value into variable
|
* @brief Reads ADC value into variable
|
||||||
*
|
*
|
||||||
* @param pin_num The bin number of the ADC pin being read.
|
|
||||||
*
|
*
|
||||||
* This function depends on the ADC already being initialized and enabled
|
* This function depends on the ADC already being initialized and enabled
|
||||||
* before being called.
|
* before being called.
|
||||||
*/
|
*/
|
||||||
extern uint16_t (*ADC_ReadValue)(uint8_t pin_num);
|
extern uint16_t (*ADC_ReadValue)();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Sets up the ADC
|
* @brief Sets up the ADC
|
||||||
|
@ -58,11 +69,4 @@ extern uint16_t (*ADC_ReadValue)(uint8_t pin_num);
|
||||||
*/
|
*/
|
||||||
void ADC_Setup(void);
|
void ADC_Setup(void);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Sets the pin used in the MUX for ADC0.
|
|
||||||
*
|
|
||||||
* @param pin_num The number of the pin in Port A.
|
|
||||||
*/
|
|
||||||
void ADC_SetPin(uint8_t pin_num);
|
|
||||||
|
|
||||||
#endif // ADC_H
|
#endif // ADC_H
|
||||||
|
|
|
@ -3,7 +3,8 @@ add_executable(${PROJECT_NAME}
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(${PROJECT_NAME}
|
target_link_libraries(${PROJECT_NAME}
|
||||||
RegEdit
|
#RegEdit
|
||||||
|
#ADC
|
||||||
#timer
|
#timer
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
48
src/main.c
48
src/main.c
|
@ -1,5 +1,4 @@
|
||||||
#ifndef F_CPU
|
#ifndef F_CPU
|
||||||
#error "F_CPU not defined: defaulting to 9.6MHz"
|
|
||||||
#define F_CPU 1200000UL
|
#define F_CPU 1200000UL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -34,7 +33,7 @@ volatile uint16_t tick_count;
|
||||||
// #############################
|
// #############################
|
||||||
|
|
||||||
static inline void InitTimer0(void);
|
static inline void InitTimer0(void);
|
||||||
static void InitBtn(btn_state *b, uint8_t input_pin, uint8_t output_pin);
|
static void InitBtn(btn_state *b, uint8_t input_pin);
|
||||||
static void ClearButtonTimer(btn_state *b);
|
static void ClearButtonTimer(btn_state *b);
|
||||||
static void StartButtonTimer(btn_state *b);
|
static void StartButtonTimer(btn_state *b);
|
||||||
static void CheckButtonLongpress(btn_state *b);
|
static void CheckButtonLongpress(btn_state *b);
|
||||||
|
@ -51,7 +50,6 @@ int main() {
|
||||||
while (1) {
|
while (1) {
|
||||||
UpdateButtonOutput(&btn1);
|
UpdateButtonOutput(&btn1);
|
||||||
UpdateButtonInput(&btn1);
|
UpdateButtonInput(&btn1);
|
||||||
//MotorMoveTo(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -65,7 +63,7 @@ void InitProg(void) {
|
||||||
/*Set the debounced state to all high*/
|
/*Set the debounced state to all high*/
|
||||||
debounced_state = 0xFF;
|
debounced_state = 0xFF;
|
||||||
|
|
||||||
InitBtn(&btn1, BUTTON_PIN, PIN_ACTIVE1);
|
InitBtn(&btn1, BUTTON_PIN);
|
||||||
|
|
||||||
/*Wait 5ms for pull-up resistors voltage to become stable.*/
|
/*Wait 5ms for pull-up resistors voltage to become stable.*/
|
||||||
_delay_ms(5);
|
_delay_ms(5);
|
||||||
|
@ -76,11 +74,11 @@ void InitProg(void) {
|
||||||
|
|
||||||
// Checks against a bit pattern we defined to represent the start of data.
|
// Checks against a bit pattern we defined to represent the start of data.
|
||||||
if (eeprom_read_byte((uint8_t *)ROM_SP_ADR) == START_PATTERN) {
|
if (eeprom_read_byte((uint8_t *)ROM_SP_ADR) == START_PATTERN) {
|
||||||
MotorMoveTo(eeprom_read_byte((uint8_t *)ROM_SS1_ADR));
|
MotorMoveTo(eeprom_read_byte((uint8_t *)POSITION1_ADR));
|
||||||
} else {
|
} else {
|
||||||
// otherwise we write the init values for the start pattern and states.
|
// otherwise we write the init values for the start pattern and states.
|
||||||
eeprom_write_byte((uint8_t *)ROM_SP_ADR, START_PATTERN);
|
eeprom_write_byte((uint8_t *)ROM_SP_ADR, START_PATTERN);
|
||||||
eeprom_write_byte((uint8_t *)ROM_SS1_ADR, 0x7F);
|
eeprom_write_byte((uint8_t *)POSITION1_ADR, 0x7F);
|
||||||
}
|
}
|
||||||
|
|
||||||
InitTimer0();
|
InitTimer0();
|
||||||
|
@ -96,10 +94,11 @@ uint8_t ReadSpeed(void) {
|
||||||
while (ADCSRA & (1 << ADSC)) {
|
while (ADCSRA & (1 << ADSC)) {
|
||||||
} // Wait for conversion to finish
|
} // Wait for conversion to finish
|
||||||
|
|
||||||
uint8_t val = (uint8_t)(ADC >> 2);
|
//Normally a bitshift of 2 is done for 8bit ADC values,
|
||||||
|
//however we want to divide by two after this as well so we
|
||||||
//Map the speed value to the 100%-50% duty cycle range.
|
//do a third shift followed by an addition of 127 to yield a mapping of
|
||||||
//val = (uint8_t)( (float)val / 255.0 ) * 100;
|
//approximatly 50%-96.6% duty cycle range.
|
||||||
|
uint8_t val = (uint8_t)(ADC >> 3) + 127;
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
@ -129,14 +128,15 @@ static inline uint8_t diff(uint8_t a, uint8_t b) {
|
||||||
return b - a;
|
return b - a;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MotorSetSavePos() {
|
void MotorSetSavePos(uint8_t *ADR) {
|
||||||
uint8_t pos = (uint8_t)(ReadFader() >> 2);
|
uint8_t pos = (uint8_t)(ReadFader() >> 2);
|
||||||
eeprom_write_byte((uint8_t *)ROM_SS1_ADR, pos);
|
//eeprom_write_byte((uint8_t *)ADR, pos);
|
||||||
|
eeprom_update_byte((uint8_t *)ADR, pos);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t MotorGetSavedPos(void) {
|
uint8_t MotorGetSavedPos(uint8_t *ADR) {
|
||||||
return (uint8_t)eeprom_read_byte((uint8_t *)ROM_SS1_ADR);
|
return (uint8_t)eeprom_read_byte((uint8_t *)POSITION1_ADR);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MotorMoveTo(uint8_t target) {
|
void MotorMoveTo(uint8_t target) {
|
||||||
|
@ -191,21 +191,17 @@ void MotorCoast(void) {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*This is kinda like our button constructor*/
|
/*This is kinda like our button constructor*/
|
||||||
static void InitBtn(btn_state *b, uint8_t input_pin, uint8_t output_pin) {
|
static void InitBtn(btn_state *b, uint8_t input_pin) {
|
||||||
b->is_long_pressed = 0;
|
b->is_long_pressed = 0;
|
||||||
b->is_pressed = 0;
|
b->is_pressed = 0;
|
||||||
b->is_active = 0;
|
b->is_active = 0;
|
||||||
b->pressed_ticks = 0;
|
b->pressed_ticks = 0;
|
||||||
b->timer_enabled = 0;
|
b->timer_enabled = 0;
|
||||||
b->input_pin = input_pin;
|
b->input_pin = input_pin;
|
||||||
b->output_pin = output_pin;
|
|
||||||
|
|
||||||
/*Configure the buttons inputs and outputs*/
|
/*Configure the buttons inputs and outputs*/
|
||||||
DDRB &= ~(1 << b->input_pin);
|
DDRB &= ~(1 << b->input_pin);
|
||||||
PORTB |= (1 << b->input_pin);
|
PORTB |= (1 << b->input_pin);
|
||||||
|
|
||||||
DDRB |= (1 << b->output_pin);
|
|
||||||
PORTB &= ~(1 << b->output_pin);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ClearButtonTimer(btn_state *b) {
|
static void ClearButtonTimer(btn_state *b) {
|
||||||
|
@ -249,6 +245,7 @@ static void UpdateButtonOutput(btn_state *b) {
|
||||||
/*Then start the timer and update the output*/
|
/*Then start the timer and update the output*/
|
||||||
// ToggleOutput(b);
|
// ToggleOutput(b);
|
||||||
StartButtonTimer(b);
|
StartButtonTimer(b);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,12 +265,21 @@ static void UpdateButtonOutput(btn_state *b) {
|
||||||
else if (!b->is_pressed) {
|
else if (!b->is_pressed) {
|
||||||
/*If the button was released on a long press.*/
|
/*If the button was released on a long press.*/
|
||||||
if (b->is_long_pressed) {
|
if (b->is_long_pressed) {
|
||||||
MotorSetSavePos();
|
MotorSetSavePos((uint8_t *)POSITION1_ADR);
|
||||||
}
|
}
|
||||||
/*If the button pres was a short one.*/
|
/*If the button pres was a short one.*/
|
||||||
else if (!b->is_long_pressed) {
|
else if (!b->is_long_pressed) {
|
||||||
if (b->is_active) {
|
if (b->is_active) {
|
||||||
MotorMoveTo(MotorGetSavedPos());
|
/*Save the current position into position 2 EEPROM*/
|
||||||
|
MotorSetSavePos((uint8_t *)POSITION2_ADR);
|
||||||
|
|
||||||
|
/*If already in saved position then go back to original pos.*/
|
||||||
|
if(diff(MotorGetSavedPos((uint8_t *)POSITION1_ADR), ReadFader()) > 8){
|
||||||
|
MotorMoveTo(MotorGetSavedPos((uint8_t *)POSITION1_ADR));
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
MotorMoveTo(MotorGetSavedPos((uint8_t *)POSITION1_ADR));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
MotorCoast();
|
MotorCoast();
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,116 +73,100 @@ TEST(test_ADC, ADC_SetupSetsRegisters)
|
||||||
ADC_Setup();
|
ADC_Setup();
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(test_ADC, ADC_InitPortbADC3UsesCorrectRegisters)
|
TEST(test_ADC, ADC_InitRejectsInvalidChannels)
|
||||||
{
|
{
|
||||||
//PB3/ADC3
|
for(uint8_t i = 4; i < 255; i++){
|
||||||
|
ADC_Init(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST(test_ADC, ADC_InitPortbWorksWithValidChannels)
|
||||||
|
{
|
||||||
|
uint8_t pin_num;
|
||||||
|
|
||||||
|
for(uint8_t adc_channel = 0; adc_channel <= 3; adc_channel++)
|
||||||
|
{
|
||||||
|
pin_num = ADC_GetChannelPinNum(adc_channel);
|
||||||
|
|
||||||
//Check it disables the pin's digital circuitry
|
//Check it disables the pin's digital circuitry
|
||||||
|
|
||||||
|
//Check it sets the pin for input
|
||||||
|
mock().expectOneCall("RegEdit_ClearBit")
|
||||||
|
.withPointerParameter("reg", (void *) &DDRB)
|
||||||
|
.withUnsignedIntParameter("bit_num", pin_num);
|
||||||
|
|
||||||
|
|
||||||
|
//Check that the pull-up resistor is disabled.
|
||||||
|
mock().expectOneCall("RegEdit_ClearBit")
|
||||||
|
.withPointerParameter("reg", (void *) &PORTB)
|
||||||
|
.withUnsignedIntParameter("bit_num", pin_num);
|
||||||
|
|
||||||
|
|
||||||
//Check that the ADC pin is selected in ADMUX
|
//Check that the ADC pin is selected in ADMUX
|
||||||
|
|
||||||
|
//Clears the last two bits first.
|
||||||
|
mock().expectOneCall("RegEdit_AND_Num")
|
||||||
|
.withPointerParameter("reg", (void *) &ADMUX)
|
||||||
|
.withUnsignedIntParameter("num", 0xFC);
|
||||||
|
|
||||||
//
|
//Selects the ADC pin/channel
|
||||||
|
mock().expectOneCall("RegEdit_OR_Num")
|
||||||
|
.withPointerParameter("reg", (void *) &ADMUX)
|
||||||
|
.withUnsignedIntParameter("num", adc_channel);
|
||||||
|
|
||||||
/*
|
ADC_Init(adc_channel);
|
||||||
//Check for setting the direction to input.
|
}
|
||||||
mock().expectOneCall("RegEdit_ClearBit")
|
|
||||||
.withPointerParameter("reg", (void *) &PORTA.DIR)
|
|
||||||
.withUnsignedIntParameter("bit_num", 7);
|
|
||||||
|
|
||||||
//Check that the pullup is off
|
|
||||||
mock().expectOneCall("RegEdit_ClearBit")
|
|
||||||
.withPointerParameter("reg", (void *) &PORTA.OUT)
|
|
||||||
.withUnsignedIntParameter("bit_num", 7);
|
|
||||||
|
|
||||||
//Set the ISC(input sense config) to disable digital input
|
|
||||||
//buffering and reduce the noise on ADC usage.
|
|
||||||
mock().expectOneCall("RegEdit_SetBit")
|
|
||||||
.withPointerParameter("reg", (void *) &PORTA.PIN7CTRL)
|
|
||||||
.withUnsignedIntParameter("bit_num", PORT_ISC_INPUT_DISABLE_gc);
|
|
||||||
|
|
||||||
*/
|
|
||||||
ADC_Init(7);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(test_ADC, ADC_InitPortAPin0UsesCorrectRegisters)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
//Check for setting the direction to input.
|
|
||||||
mock().expectOneCall("RegEdit_ClearBit")
|
|
||||||
.withPointerParameter("reg", (void *) &PORTA.DIR)
|
|
||||||
.withUnsignedIntParameter("bit_num", 0);
|
|
||||||
|
|
||||||
//Check that the pullup is off
|
|
||||||
mock().expectOneCall("RegEdit_ClearBit")
|
|
||||||
.withPointerParameter("reg", (void *) &PORTA.OUT)
|
|
||||||
.withUnsignedIntParameter("bit_num", 0);
|
|
||||||
|
|
||||||
//Set the ISC(input sense config) to disable digital input
|
|
||||||
//buffering and reduce the noise on ADC usage.
|
|
||||||
mock().expectOneCall("RegEdit_SetBit")
|
|
||||||
.withPointerParameter("reg", (void *) &PORTA.PIN0CTRL)
|
|
||||||
.withUnsignedIntParameter("bit_num", PORT_ISC_INPUT_DISABLE_gc);
|
|
||||||
|
|
||||||
*/
|
|
||||||
//ADC_Init(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(test_ADC, ADC_InitDoesNothingOnHighPinNumbers)
|
|
||||||
{
|
|
||||||
//mock().expectNoCall("RegEdit_SetBit");
|
|
||||||
//ADC_Init(8);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(test_ADC, ADC_EnablePasses)
|
TEST(test_ADC, ADC_EnablePasses)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
mock().expectOneCall("RegEdit_SetBit")
|
|
||||||
.withPointerParameter("reg", (void *) &ADC0.CTRLA)
|
|
||||||
.withUnsignedIntParameter("bit_num", 0);
|
|
||||||
|
|
||||||
*/
|
mock().expectOneCall("RegEdit_SetBit")
|
||||||
//ADC_Enable();
|
.withPointerParameter("reg", (void *) &ADCSRA)
|
||||||
|
.withUnsignedIntParameter("bit_num", ADEN);
|
||||||
|
|
||||||
|
ADC_Enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST(test_ADC, ADC_DisablePasses)
|
TEST(test_ADC, ADC_DisablePasses)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
mock().expectOneCall("RegEdit_ClearBit")
|
mock().expectOneCall("RegEdit_ClearBit")
|
||||||
.withPointerParameter("reg", (void *) &ADC0.CTRLA)
|
.withPointerParameter("reg", (void *) &ADCSRA)
|
||||||
.withUnsignedIntParameter("bit_num", 0);
|
.withUnsignedIntParameter("bit_num", ADEN);
|
||||||
*/
|
|
||||||
//ADC_Disable();
|
ADC_Disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(test_ADC, ADC_SetPinSetsRightRegisters)
|
TEST(test_ADC, ADC_ReadValueImplimentationTimesOut)
|
||||||
{
|
{
|
||||||
/*
|
//Expect the start conversion bit to be set.
|
||||||
//It clears existing MUXPOS register values.
|
mock().expectOneCall("RegEdit_SetBit")
|
||||||
mock().expectOneCall("RegEdit_ClearRegister")
|
.withPointerParameter("reg", (void *) &ADCSRA)
|
||||||
.withPointerParameter("reg", (void *) &ADC0.MUXPOS);
|
.withUnsignedIntParameter("bit_num", ADSC);
|
||||||
|
|
||||||
//It Correctly sets the pin number.
|
//Check that it can time out.
|
||||||
mock().expectOneCall("RegEdit_SetNum")
|
|
||||||
.withPointerParameter("reg", (void *) &ADC0.MUXPOS)
|
//Expect it to read the start bit
|
||||||
.withUnsignedIntParameter("num", 4);
|
mock().expectNCalls(ADC_WAIT_TIMEOUT, "RegEdit_IsBitSet")
|
||||||
*/
|
.withPointerParameter("reg", (void *) &ADCSRA)
|
||||||
//ADC_SetPin(4);
|
.withUnsignedIntParameter("bit_num", ADSC);
|
||||||
|
|
||||||
|
//Check that it return the "error" value
|
||||||
|
|
||||||
|
uint16_t value = ADC_ReadValue();
|
||||||
|
CHECK_EQUAL_TEXT(UINT16_MAX, value, "ERROR: Should return UINT16_MAX!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST(test_ADC, ADC_SetPinFailsOnInvalidPin)
|
static uint16_t ADC_ReadValueFake()
|
||||||
{
|
|
||||||
//ADC_SetPin(8);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static uint16_t ADC_ReadValueFake(uint8_t pin_num)
|
|
||||||
{
|
{
|
||||||
return 512;
|
return 512;
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_GROUP(test_ADCRead)
|
TEST_GROUP(test_ADCReadPtrSwap)
|
||||||
{
|
{
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
|
@ -195,9 +179,9 @@ TEST_GROUP(test_ADCRead)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
TEST(test_ADCRead, FunctionPointerSwapWorks)
|
TEST(test_ADCReadPtrSwap, FunctionPointerSwapWorks)
|
||||||
{
|
{
|
||||||
uint16_t value = ADC_ReadValue(0);
|
uint16_t value = ADC_ReadValue();
|
||||||
|
|
||||||
LONGS_EQUAL(512, value);
|
LONGS_EQUAL(512, value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,9 +30,9 @@ TEST_GROUP(test_MockADC)
|
||||||
TEST(test_MockADC, ADC_InitExpects)
|
TEST(test_MockADC, ADC_InitExpects)
|
||||||
{
|
{
|
||||||
mock().expectOneCall("ADC_Init")
|
mock().expectOneCall("ADC_Init")
|
||||||
.withUnsignedIntParameter("pin_num", 7);
|
.withUnsignedIntParameter("adc_chan", 0);
|
||||||
|
|
||||||
ADC_Init(7);
|
ADC_Init(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(test_MockADC, ADC_EnableExpects)
|
TEST(test_MockADC, ADC_EnableExpects)
|
||||||
|
@ -55,10 +55,9 @@ TEST(test_MockADC, ADC_ReadValue)
|
||||||
MockADC_ZeroIndex();
|
MockADC_ZeroIndex();
|
||||||
MockADC_PushValue(512);
|
MockADC_PushValue(512);
|
||||||
|
|
||||||
mock().expectOneCall("ADC_ReadValue_Impl")
|
mock().expectOneCall("ADC_ReadValue_Impl");
|
||||||
.withUnsignedIntParameter("pin_num", 0x2);
|
|
||||||
|
|
||||||
uint16_t val = ADC_ReadValue(0x2);
|
uint16_t val = ADC_ReadValue();
|
||||||
LONGS_EQUAL(512, val);
|
LONGS_EQUAL(512, val);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -68,10 +67,9 @@ TEST(test_MockADC, ADC_ReadValueReturnsZeroOnEmptyBuffer)
|
||||||
MockADC_ZeroIndex();
|
MockADC_ZeroIndex();
|
||||||
|
|
||||||
mock().expectOneCall("ADC_ReadValue_Impl")
|
mock().expectOneCall("ADC_ReadValue_Impl")
|
||||||
.withUnsignedIntParameter("pin_num", 0x2)
|
|
||||||
.andReturnValue(0x0000);
|
.andReturnValue(0x0000);
|
||||||
|
|
||||||
uint16_t val = ADC_ReadValue(0x2);
|
uint16_t val = ADC_ReadValue();
|
||||||
LONGS_EQUAL(0, val);
|
LONGS_EQUAL(0, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue