Merge branch 'master' into arduimu

This commit is contained in:
Gautier Hattenberger
2011-03-15 15:20:27 +01:00
35 changed files with 1942 additions and 607 deletions
+18 -5
View File
@@ -99,12 +99,13 @@ LDSCRIPT = $($(TARGET).LDSCRIPT)
endif endif
endif endif
UNAME = $(shell uname -s) #UNAME = $(shell uname -s)
MULTILIB = $(shell if $(CC) --print-multi-lib | grep thumb2 > /dev/null ; then echo "yes"; else echo "no"; fi)
CFLAGS = -I. -I./$(ARCH) $(INCLUDES) -D__thumb2__ -Wall -msoft-float -O$(OPT) CFLAGS = -I. -I./$(ARCH) $(INCLUDES) -D__thumb2__ -Wall -msoft-float -O$(OPT)
CFLAGS += -Wl,gc-sections CFLAGS += -Wl,gc-sections
CFLAGS += -mcpu=$(MCU) -mthumb -ansi CFLAGS += -mcpu=$(MCU) -mthumb -ansi
ifeq ("$(UNAME)","Darwin") ifeq ("$(MULTILIB)","yes")
CFLAGS += -mfix-cortex-m3-ldrd CFLAGS += -mfix-cortex-m3-ldrd
endif endif
CFLAGS += -std=gnu99 CFLAGS += -std=gnu99
@@ -126,12 +127,12 @@ CFLAGS += -Wswitch-default
CFLAGS += $($(TARGET).CFLAGS) CFLAGS += $($(TARGET).CFLAGS)
AFLAGS = -ahls -mapcs-32 AFLAGS = -ahls -mapcs-32
ifeq ("$(UNAME)","Darwin") ifeq ("$(MULTILIB)","yes")
AFLAGS += -mcpu=$(MCU) -mthumb AFLAGS += -mcpu=$(MCU) -mthumb
endif endif
AFLAGS += -x assembler-with-cpp -Wa,-adhlns=$(OBJDIR)/$(<:.S=.lst),--g$(DEBUG) AFLAGS += -x assembler-with-cpp -Wa,-adhlns=$(OBJDIR)/$(<:.S=.lst),--g$(DEBUG)
ifeq ("$(UNAME)","Darwin") ifeq ("$(MULTILIB)","yes")
LDFLAGS = -T$(LDSCRIPT) -nostartfiles -O$(OPT) --gc-sections -mthumb -march=armv7 -mfix-cortex-m3-ldrd -msoft-float LDFLAGS = -T$(LDSCRIPT) -nostartfiles -O$(OPT) --gc-sections -mthumb -march=armv7 -mfix-cortex-m3-ldrd -msoft-float
else else
LDFLAGS = -D__thumb2__ -T$(LDSCRIPT) -nostartfiles -L$(GCC_LIB_DIR) -O$(OPT) --gc-sections LDFLAGS = -D__thumb2__ -T$(LDSCRIPT) -nostartfiles -L$(GCC_LIB_DIR) -O$(OPT) --gc-sections
@@ -148,7 +149,7 @@ ODFLAGS = -S
# Default target. # Default target.
all: printcommands sizebefore build sizeafter all: printcommands printmultilib sizebefore build sizeafter
printcommands: printcommands:
@echo "Using CC = $(CC)" @echo "Using CC = $(CC)"
@@ -158,6 +159,18 @@ printcommands:
@echo "Using NM = $(NM)" @echo "Using NM = $(NM)"
@echo "Using SIZE = $(SIZE)" @echo "Using SIZE = $(SIZE)"
@echo "Using OOCD = $(OOCD)" @echo "Using OOCD = $(OOCD)"
@echo "GCC version:"
@$(CC) --version
@echo "OOCD version:"
@$(OOCD) --version
ifeq ("$(MULTILIB)","yes")
printmultilib:
@echo "*** Using multilib ***"
else
printmultilib:
@echo "*** NOT using multilib ***"
endif
build: elf bin hex build: elf bin hex
# lss sym # lss sym
+244
View File
@@ -0,0 +1,244 @@
<!-- this is an asctec frame equiped with Lisa/M and generic china pwm motor controllers -->
<airframe name="lisa_asctec">
<servos min="0" neutral="0" max="0xff">
<servo name="FRONT" no="0" min="1000" neutral="1000" max="2000"/>
<servo name="BACK" no="1" min="1000" neutral="1000" max="2000"/>
<servo name="LEFT" no="2" min="1000" neutral="1000" max="2000"/>
<servo name="RIGHT" no="3" min="1000" neutral="1000" max="2000"/>
</servos>
<commands>
<axis name="PITCH" failsafe_value="0"/>
<axis name="ROLL" failsafe_value="0"/>
<axis name="YAW" failsafe_value="0"/>
<axis name="THRUST" failsafe_value="0"/>
</commands>
<command_laws>
<!--<let var="aileron" value="@ROLL * AILEVON_AILERON_RATE"/>
<let var="elevator" value="@PITCH * AILEVON_ELEVATOR_RATE"/>
<set servo="MOTOR" value="@THROTTLE"/>
<set servo="AILEVON_LEFT" value="$elevator + $aileron"/>
<set servo="AILEVON_RIGHT" value="$elevator - $aileron"/>
-->
<set servo="FRONT" value="0"/>
<set servo="BACK" value="1"/>
<set servo="LEFT" value="2"/>
<set servo="RIGHT" value="3"/>
</command_laws>
<!-- for the sim -->
<section name="ACTUATORS_MKK" prefix="ACTUATORS_MKK_">
<define name="NB" value="4"/>
<define name="ADDR" value="{ 0x52, 0x54, 0x56, 0x58 }"/>
</section>
<section name="SUPERVISION" prefix="SUPERVISION_">
<define name="MIN_MOTOR" value="1090"/>
<define name="MAX_MOTOR" value="2000"/>
<define name="TRIM_A" value="0"/>
<define name="TRIM_E" value="0"/>
<define name="TRIM_R" value="0"/>
<define name="NB_MOTOR" value="4"/>
<define name="SCALE" value="256"/>
<define name="ROLL_COEF" value="{ 0 , 0, 256, -256 }"/>
<define name="PITCH_COEF" value="{ 256, -256, 0, 0 }"/>
<define name="YAW_COEF" value="{ -256, -256, 256, 256 }"/>
<define name="THRUST_COEF" value="{ 256, 256, 256, 256 }"/>
</section>
<section name="IMU" prefix="IMU_">
<define name="GYRO_P_NEUTRAL" value="27"/>
<define name="GYRO_Q_NEUTRAL" value="-10"/>
<define name="GYRO_R_NEUTRAL" value="20"/>
<define name="GYRO_P_SENS" value="5.0" integer="16"/>
<define name="GYRO_Q_SENS" value="5.0" integer="16"/>
<define name="GYRO_R_SENS" value="5.0" integer="16"/>
<define name="GYRO_PQ_SENS" value="0.0" integer="16"/>
<define name="GYRO_PR_SENS" value="0.0" integer="16"/>
<define name="GYRO_QR_SENS" value="0.0" integer="16"/>
<define name="ACCEL_X_NEUTRAL" value="4"/>
<define name="ACCEL_Y_NEUTRAL" value="-14"/>
<define name="ACCEL_Z_NEUTRAL" value="-5"/>
<define name="ACCEL_X_SENS" value="39" integer="16"/>
<define name="ACCEL_Y_SENS" value="39" integer="16"/>
<define name="ACCEL_Z_SENS" value="39" integer="16"/>
<define name="ACCEL_XY_SENS" value="0.0" integer="16"/>
<define name="ACCEL_XZ_SENS" value="0.0" integer="16"/>
<define name="ACCEL_YZ_SENS" value="0.0" integer="16"/>
<define name="MAG_X_NEUTRAL" value="0"/>
<define name="MAG_Y_NEUTRAL" value="0"/>
<define name="MAG_Z_NEUTRAL" value="0"/>
<define name="MAG_X_SENS" value="1." integer="16"/>
<define name="MAG_Y_SENS" value="1." integer="16"/>
<define name="MAG_Z_SENS" value="1." integer="16"/>
<define name="MAG_XY_SENS" value="0.0" integer="16"/>
<define name="MAG_XZ_SENS" value="0.0" integer="16"/>
<define name="MAG_YZ_SENS" value="0.0" integer="16"/>
<define name="BODY_TO_IMU_PHI" value="RadOfDeg( 0. )"/>
<define name="BODY_TO_IMU_THETA" value="RadOfDeg( 0. )"/>
<define name="BODY_TO_IMU_PSI" value="RadOfDeg( 45. )"/>
</section>
<section name="AUTOPILOT">
<define name="MODE_MANUAL" value="AP_MODE_ATTITUDE_DIRECT"/>
<define name="MODE_AUTO1" value="AP_MODE_ATTITUDE_Z_HOLD"/>
<define name="MODE_AUTO2" value="AP_MODE_HOVER_Z_HOLD"/>
</section>
<section name="BAT">
<define name="MILLIAMP_PER_PERCENT" value="0.86"/>
<define name="CATASTROPHIC_BAT_LEVEL" value="9.3" unit="V"/>
<define name="BATTERY_SENS" value="0.48" integer="16"/>
</section>
<section name="STABILIZATION_RATE" prefix="STABILIZATION_RATE_">
<define name="SP_MAX_P" value="10000"/>
<define name="SP_MAX_Q" value="10000"/>
<define name="SP_MAX_R" value="10000"/>
<define name="GAIN_P" value="-400"/>
<define name="GAIN_Q" value="-400"/>
<define name="GAIN_R" value="-350"/>
</section>
<section name="STABILIZATION_ATTITUDE" prefix="STABILIZATION_ATTITUDE_">
<!-- setpoints -->
<define name="SP_MAX_PHI" value="RadOfDeg(45.)"/>
<define name="SP_MAX_THETA" value="RadOfDeg(45.)"/>
<define name="SP_MAX_R" value="RadOfDeg(90.)"/>
<define name="DEADBAND_R" value="250"/>
<!-- reference -->
<define name="REF_OMEGA_P" value="RadOfDeg(600)"/>
<define name="REF_ZETA_P" value="0.85"/>
<define name="REF_MAX_P" value="RadOfDeg(400.)"/>
<define name="REF_MAX_PDOT" value="RadOfDeg(8000.)"/>
<define name="REF_OMEGA_Q" value="RadOfDeg(600)"/>
<define name="REF_ZETA_Q" value="0.85"/>
<define name="REF_MAX_Q" value="RadOfDeg(400.)"/>
<define name="REF_MAX_QDOT" value="RadOfDeg(8000.)"/>
<define name="REF_OMEGA_R" value="RadOfDeg(500)"/>
<define name="REF_ZETA_R" value="0.85"/>
<define name="REF_MAX_R" value="RadOfDeg(180.)"/>
<define name="REF_MAX_RDOT" value="RadOfDeg(1800.)"/>
<!-- feedback -->
<define name="PHI_PGAIN" value="-550"/>
<define name="PHI_DGAIN" value="-210"/>
<define name="PHI_IGAIN" value="-200"/>
<define name="THETA_PGAIN" value="-550"/>
<define name="THETA_DGAIN" value="-210"/>
<define name="THETA_IGAIN" value="-200"/>
<define name="PSI_PGAIN" value="-600"/>
<define name="PSI_DGAIN" value="-200"/>
<define name="PSI_IGAIN" value="-10"/>
<!-- feedforward -->
<define name="PHI_DDGAIN" value=" 200"/>
<define name="THETA_DDGAIN" value=" 200"/>
<define name="PSI_DDGAIN" value=" 200"/>
</section>
<section name="INS" prefix="INS_">
<define name="BARO_SENS" value="10." integer="16"/>
</section>
<section name="GUIDANCE_V" prefix="GUIDANCE_V_">
<define name="MIN_ERR_Z" value="POS_BFP_OF_REAL(-10.)"/>
<define name="MAX_ERR_Z" value="POS_BFP_OF_REAL( 10.)"/>
<define name="MIN_ERR_ZD" value="SPEED_BFP_OF_REAL(-10.)"/>
<define name="MAX_ERR_ZD" value="SPEED_BFP_OF_REAL( 10.)"/>
<define name="MAX_SUM_ERR" value="2000000"/>
<define name="HOVER_KP" value="-500"/>
<define name="HOVER_KD" value="-200"/>
<define name="HOVER_KI" value="-100"/>
<!-- 1.5m/s for full stick : BOOZ_SPEED_I_OF_F(1.5) / (MAX_PPRZ/2) -->
<define name="RC_CLIMB_COEF" value ="163"/>
<!-- BOOZ_SPEED_I_OF_F(1.5) * 20% -->
<define name="RC_CLIMB_DEAD_BAND" value ="160000"/>
<define name="INV_M" value ="0.2"/>
</section>
<section name="GUIDANCE_H" prefix="GUIDANCE_H_">
<define name="PGAIN" value="-100"/>
<define name="DGAIN" value="-100"/>
<define name="IGAIN" value="-0"/>
</section>
<section name="MISC">
<define name="FACE_REINJ_1" value="1024"/>
</section>
<section name="SIMULATOR" prefix="NPS_">
<define name="ACTUATOR_NAMES" value="{&quot;front_motor&quot;, &quot;back_motor&quot;, &quot;right_motor&quot;, &quot;left_motor&quot;}"/>
<define name="INITIAL_CONDITITONS" value="&quot;reset00&quot;"/>
<define name="SENSORS_PARAMS" value="&quot;nps_sensors_params_booz2_a1.h&quot;"/>
</section>
<!--
<modules main_freq="512">
<load name="vehicle_interface_overo_link.xml"/>
</modules>
-->
<firmware name="rotorcraft">
<target name="ap" board="lisa_m_1.0">
<!-- <define name="BOOZ_START_DELAY" value="1"/> -->
<subsystem name="radio_control" type="spektrum"/>
<subsystem name="actuators" type="pwm_supervision"/>
<subsystem name="telemetry" type="transparent"/>
<define name="SERVO_HZ" value="400"/>
<define name="RADIO_MODE" value="RADIO_AUX2"/>
<define name="RADIO_KILL_SWITCH" value="RADIO_GEAR"/>
<define name="RADIO_CONTROL_SPEKTRUM_SIGNS" value="\{1,1,-1,1,-1,-1,-1,1,1,1,1,1\}"/>
</target>
<target name="sim" board="pc">
<subsystem name="fdm" type="nps"/>
<subsystem name="radio_control" type="ppm"/>
<subsystem name="actuators" type="mkk"/>
</target>
<subsystem name="imu" type="aspirin"/>
<subsystem name="gps" type="ublox"/>
<subsystem name="ahrs" type="cmpl"/>
</firmware>
<firmware name="lisa_m_test_progs">
<target name="test_led" board="lisa_m_1.0"/>
<target name="test_uart_lisam" board="lisa_m_1.0"/>
<!--target name="test_servos" board="lisa_m_1.0"/>
<target name="test_telemetry" board="lisa_m_1.0"/>
<target name="test_baro" board="lisa_m_1.0"/>
<target name="test_imu" board="lisa_m_1.0"/>
<target name="test_rc_spektrum" board="lisa_m_1.0"/>
<target name="test_rc_ppm" board="lisa_m_1.0"/>
<target name="test_adc" board="lisa_m_1.0"/>
<target name="test_hmc5843" board="lisa_m_1.0"/>
<target name="test_itg3200" board="lisa_m_1.0"/>
<target name="test_adxl345" board="lisa_m_1.0"/>
<target name="test_esc_mkk_simple" board="lisa_m_1.0"/>
<target name="test_esc_asctecv1_simple" board="lisa_m_1.0"/>
<target name="test_actuators_mkk" board="lisa_m_1.0"/>
<target name="test_actuators_asctecv1" board="lisa_m_1.0"/-->
</firmware>
</airframe>
@@ -210,6 +210,8 @@
<define name="RADIO_MODE" value="RADIO_AUX2"/> <define name="RADIO_MODE" value="RADIO_AUX2"/>
<define name="RADIO_KILL_SWITCH" value="RADIO_GEAR"/> <define name="RADIO_KILL_SWITCH" value="RADIO_GEAR"/>
<define name="RADIO_CONTROL_SPEKTRUM_SIGNS" value="\{1,1,-1,1,-1,-1,-1,1,1,1,1,1\}"/> <define name="RADIO_CONTROL_SPEKTRUM_SIGNS" value="\{1,1,-1,1,-1,-1,-1,1,1,1,1,1\}"/>
<define name = "RADIO_CONTROL_SPEKTRUM_SECONDARY_PORT" value = "UART5"/>
<define name = "OVERRIDE_UART5_IRQ_HANDLER"/>
</target> </target>
<target name="sim" board="pc"> <target name="sim" board="pc">
<subsystem name="fdm" type="nps"/> <subsystem name="fdm" type="nps"/>
File diff suppressed because it is too large Load Diff
+25
View File
@@ -0,0 +1,25 @@
<firmware name="lisa_m_test_progs" boards="lisa_m_1.0"
description="test programs for lisa_m boards">
<!--target name="test telemetry" description="Sends ALIVE telemetry messages">
<param name="MODEM_PORT" values="UART1,UART2,UART3" default="UART2"/>
<param name="MODEM_BAUD" values="B9600,B57600,B115200" default="B57600"/>
</target>
<target name="test baro" description="reads barometers and sends values over telemetry">
<param name="MODEM_PORT" values="UART1,UART2,UART3" default="UART2"/>
<param name="MODEM_BAUD" values="B9600,B57600,B115200" default="B57600"/>
</target>
<target name="test imu b2" description="reads imu values over telemetry">
<param name="MODEM_PORT" values="UART1,UART2,UART3" default="UART2"/>
<param name="MODEM_BAUD" values="B9600,B57600,B115200" default="B57600"/>
</target>
<target name="test spektrum" description="sends RADIO_CONTROL messages on telemetry">
<param name="MODEM_PORT" values="UART1,UART2,UART3" default="UART2"/>
<param name="MODEM_BAUD" values="B9600,B57600,B115200" default="B57600"/>
<param name="RADIO_CONTROL_LINK" values="UART1,UART2,UART3|UART5" default="UART3"/>
</target-->
</firmware>
@@ -2,7 +2,11 @@
# Fixed point complementary filter using euler angles for attitude estimation # Fixed point complementary filter using euler angles for attitude estimation
# #
ifdef AHRS_ALIGNER_LED
ap.CFLAGS += -DUSE_AHRS_CMPL -DAHRS_ALIGNER_LED=$(AHRS_ALIGNER_LED) -DAHRS_FIXED_POINT ap.CFLAGS += -DUSE_AHRS_CMPL -DAHRS_ALIGNER_LED=$(AHRS_ALIGNER_LED) -DAHRS_FIXED_POINT
else
ap.CFLAGS += -DUSE_AHRS_CMPL -DAHRS_FIXED_POINT
endif
ap.srcs += $(SRC_SUBSYSTEMS)/ahrs.c ap.srcs += $(SRC_SUBSYSTEMS)/ahrs.c
ap.srcs += $(SRC_SUBSYSTEMS)/ahrs/ahrs_aligner.c ap.srcs += $(SRC_SUBSYSTEMS)/ahrs/ahrs_aligner.c
ap.srcs += $(SRC_SUBSYSTEMS)/ahrs/ahrs_int_cmpl_euler.c ap.srcs += $(SRC_SUBSYSTEMS)/ahrs/ahrs_int_cmpl_euler.c
+1 -1
View File
@@ -27,7 +27,7 @@ endif
# #
# #
SYS_TIME_LED = 2 SYS_TIME_LED = 1
RADIO_CONTROL_SPEKTRUM_PRIMARY_PORT = UART3 RADIO_CONTROL_SPEKTRUM_PRIMARY_PORT = UART3
RADIO_CONTROL_SPEKTRUM_SECONDARY_PORT = UART5 RADIO_CONTROL_SPEKTRUM_SECONDARY_PORT = UART5
+3 -3
View File
@@ -11,8 +11,8 @@
<makefile target="ap"> <makefile target="ap">
<file name="ins_arduimu_modified.c"/> <file name="ins_arduimu_modified.c"/>
</makefile> </makefile>
<!--makefile target="sim"> <makefile target="sim">
<file name="sim_MPPT.c"/> <file_arch name="ins_arduimu.c"/>
</makefile--> </makefile>
</module> </module>
+12
View File
@@ -41,6 +41,18 @@ SECTIONS
} > ROM } > ROM
*****/ *****/
. = ALIGN (4);
.ARM.exidx :
{
__exidx_start = .;
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
__exidx_end = .;
} >ROM
. = ALIGN(4); . = ALIGN(4);
/* .ctors .dtors are used for c++ constructors/destructors */ /* .ctors .dtors are used for c++ constructors/destructors */
+31 -40
View File
@@ -28,7 +28,6 @@
#include "interrupt_hw.h" #include "interrupt_hw.h"
#include BOARD_CONFIG #include BOARD_CONFIG
/////////////////// ///////////////////
// I2C Automaton // // I2C Automaton //
/////////////////// ///////////////////
@@ -56,22 +55,18 @@ __attribute__ ((always_inline)) static inline void I2cEndOfTransaction(struct i2
} }
} }
__attribute__ ((always_inline)) static inline void I2cFinished(struct i2c_periph* p, struct i2c_transaction* t) { __attribute__ ((always_inline)) static inline void I2cSendStop(struct i2c_periph* p, struct i2c_transaction* t) {
((i2cRegs_t *)(p->reg_addr))->conset = _BV(STO);
// transaction finished with success // transaction finished with success
t->status = I2CTransSuccess; t->status = I2CTransSuccess;
I2cEndOfTransaction(p); I2cEndOfTransaction(p);
} }
__attribute__ ((always_inline)) static inline void I2cSendStop(struct i2c_periph* p, struct i2c_transaction* t) {
((i2cRegs_t *)(p->reg_addr))->conset = _BV(STO);
I2cFinished(p,t);
}
__attribute__ ((always_inline)) static inline void I2cFail(struct i2c_periph* p, struct i2c_transaction* t) { __attribute__ ((always_inline)) static inline void I2cFail(struct i2c_periph* p, struct i2c_transaction* t) {
((i2cRegs_t *)(p->reg_addr))->conset = _BV(STO); ((i2cRegs_t *)(p->reg_addr))->conset = _BV(STO);
// transaction failed
t->status = I2CTransFailed; t->status = I2CTransFailed;
p->status = I2CFailed; // FIXME I2C should be reseted here ?
// FIXME I2C should be reseted here
I2cEndOfTransaction(p); I2cEndOfTransaction(p);
} }
@@ -119,35 +114,7 @@ __attribute__ ((always_inline)) static inline void I2cAutomaton(int32_t state, s
} }
else { else {
/* error , we should have got NACK */ /* error , we should have got NACK */
I2cSendStop(p,trans); I2cFail(p,trans);
}
break;
case I2C_MR_SLA_ACK: /* At least one char */
/* Wait and reply with ACK or NACK */
I2cReceive(p->reg_addr,p->idx_buf < trans->len_r - 1);
break;
case I2C_MR_SLA_NACK:
case I2C_MT_SLA_NACK:
I2cSendStart(p);
break;
case I2C_MT_SLA_ACK:
case I2C_MT_DATA_ACK:
if (p->idx_buf < trans->len_w) {
I2cSendByte(p->reg_addr,trans->buf[p->idx_buf]);
p->idx_buf++;
} else {
if (trans->type == I2CTransTxRx) {
trans->type = I2CTransRx; /* FIXME should not change type */
p->idx_buf = 0;
trans->slave_addr |= 1;
I2cSendStart(p);
} else {
if (trans->stop_after_transmit) {
I2cSendStop(p,trans);
} else {
I2cFinished(p,trans);
}
}
} }
break; break;
case I2C_MR_DATA_NACK: case I2C_MR_DATA_NACK:
@@ -156,9 +123,33 @@ __attribute__ ((always_inline)) static inline void I2cAutomaton(int32_t state, s
} }
I2cSendStop(p,trans); I2cSendStop(p,trans);
break; break;
case I2C_MR_SLA_ACK: /* At least one char */
/* Wait and reply with ACK or NACK */
I2cReceive(p->reg_addr,p->idx_buf < trans->len_r - 1);
break;
case I2C_MR_SLA_NACK:
case I2C_MT_SLA_NACK:
/* Slave is not responding, transaction is failed */
I2cFail(p,trans);
break;
case I2C_MT_SLA_ACK:
case I2C_MT_DATA_ACK:
if (p->idx_buf < trans->len_w) {
I2cSendByte(p->reg_addr,trans->buf[p->idx_buf]);
p->idx_buf++;
} else {
if (trans->type == I2CTransTxRx) {
//trans->type = I2CTransRx; /* FIXME should not change type */
p->idx_buf = 0;
trans->slave_addr |= 1;
I2cSendStart(p);
} else {
I2cSendStop(p,trans);
}
}
break;
default: default:
I2cSendStop(p,trans); I2cFail(p,trans);
//I2cFail(p,trans);
/* FIXME log error */ /* FIXME log error */
break; break;
} }
@@ -0,0 +1,49 @@
/** ArduIMU simulation. OCaml binding.
* Sim provides IR sensor reading and airspeed
*/
#include <inttypes.h>
#include "generated/airframe.h"
#include <caml/mlvalues.h>
#include "estimator.h"
// Prevent undefined reference (from estimator.c)
#include "subsystems/sensors/infrared.h"
struct Infrared infrared;
// Arduimu empty implementation
#include "modules/ins/ins_arduimu.h"
float ArduIMU_data[NB_DATA];
float ins_roll_neutral;
float ins_pitch_neutral;
//mixer
float pitch_of_throttle_gain;
float throttle_slew;
void ArduIMU_init( void ) {}
void ArduIMU_periodic( void ) {}
void ArduIMU_periodicGPS( void ) {}
void IMU_Daten_verarbeiten( void ) {}
// Updates from Ocaml sim
float sim_air_speed;
value set_ir_and_airspeed(
value roll __attribute__ ((unused)),
value front __attribute__ ((unused)),
value top __attribute__ ((unused)),
value air_speed
) {
// Feed directly the estimator
estimator_phi = atan2(Int_val(roll), Int_val(top)) - ins_roll_neutral;
estimator_theta = atan2(Int_val(front), Int_val(top)) - ins_pitch_neutral;
sim_air_speed = Double_val(air_speed);
return Val_unit;
}
+6
View File
@@ -117,3 +117,9 @@ value set_datalink_message(value s) {
dl_parse_msg(); dl_parse_msg();
return Val_unit; return Val_unit;
} }
/** Required by electrical */
void adc_buf_channel(void* a __attribute__ ((unused)),
void* b __attribute__ ((unused)),
void* c __attribute__ ((unused))) {
}
+8 -12
View File
@@ -16,23 +16,19 @@ float sim_air_speed;
void ir_gain_calib(void) { void ir_gain_calib(void) {
} }
value set_ir(value roll __attribute__ ((unused)), value set_ir_and_airspeed(
value front __attribute__ ((unused)), value roll __attribute__ ((unused)),
value top __attribute__ ((unused)), value front __attribute__ ((unused)),
value air_speed value top __attribute__ ((unused)),
) { value air_speed
) {
// INFRARED_TELEMETRY : Stupid hack to use with modules // INFRARED_TELEMETRY : Stupid hack to use with modules
#if defined USE_INFRARED || USE_INFRARED_TELEMETRY //#if defined USE_INFRARED || USE_INFRARED_TELEMETRY
infrared.roll = Int_val(roll); infrared.roll = Int_val(roll);
infrared.pitch = Int_val(front); infrared.pitch = Int_val(front);
infrared.top = Int_val(top); infrared.top = Int_val(top);
#endif //#endif
sim_air_speed = Double_val(air_speed); sim_air_speed = Double_val(air_speed);
return Val_unit; return Val_unit;
} }
/** Required by infrared.c:ir_init() */
void adc_buf_channel(void* a __attribute__ ((unused)),
void* b __attribute__ ((unused)),
void* c __attribute__ ((unused))) {
}
+5 -2
View File
@@ -42,10 +42,12 @@
#define _LED_GPIO_CLK(i) i #define _LED_GPIO_CLK(i) i
#define _LED_GPIO(i) i #define _LED_GPIO(i) i
#define _LED_GPIO_PIN(i) i #define _LED_GPIO_PIN(i) i
#define _LED_AFIO_REMAP(i) i
#define LED_GPIO_CLK(i) _LED_GPIO_CLK(LED_ ## i ## _GPIO_CLK) #define LED_GPIO_CLK(i) _LED_GPIO_CLK(LED_ ## i ## _GPIO_CLK)
#define LED_GPIO(i) _LED_GPIO(LED_ ## i ## _GPIO) #define LED_GPIO(i) _LED_GPIO(LED_ ## i ## _GPIO)
#define LED_GPIO_PIN(i) _LED_GPIO_PIN(LED_ ## i ## _GPIO_PIN) #define LED_GPIO_PIN(i) _LED_GPIO_PIN(LED_ ## i ## _GPIO_PIN)
#define LED_AFIO_REMAP(i) _LED_AFIO_REMAP(LED_ ## i ## _AFIO_REMAP)
/* set pin as output */ /* set pin as output */
#define LED_INIT(i) { \ #define LED_INIT(i) { \
@@ -55,10 +57,11 @@
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; \ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; \
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; \ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; \
GPIO_Init(LED_GPIO(i), &GPIO_InitStructure); \ GPIO_Init(LED_GPIO(i), &GPIO_InitStructure); \
LED_AFIO_REMAP(i); \
} }
#define LED_ON(i) { LED_GPIO(i)->BRR = LED_GPIO_PIN(i);} #define LED_ON(i) {LED_GPIO(i)->BSRR = LED_GPIO_PIN(i);}
#define LED_OFF(i) {LED_GPIO(i)->BSRR = LED_GPIO_PIN(i);} #define LED_OFF(i) { LED_GPIO(i)->BRR = LED_GPIO_PIN(i);}
#define LED_TOGGLE(i) { LED_GPIO(i)->ODR ^= LED_GPIO_PIN(i);} #define LED_TOGGLE(i) { LED_GPIO(i)->ODR ^= LED_GPIO_PIN(i);}
#define LED_PERIODIC() {} #define LED_PERIODIC() {}
+4 -2
View File
@@ -36,6 +36,7 @@
void mcu_arch_init(void) { void mcu_arch_init(void) {
#ifdef HSE_TYPE_EXT_CLK #ifdef HSE_TYPE_EXT_CLK
#warning Using external clock
/* Setup the microcontroller system. /* Setup the microcontroller system.
* Initialize the Embedded Flash Interface, * Initialize the Embedded Flash Interface,
* initialize the PLL and update the SystemFrequency variable. * initialize the PLL and update the SystemFrequency variable.
@@ -43,7 +44,7 @@ void mcu_arch_init(void) {
/* RCC system reset(for debug purpose) */ /* RCC system reset(for debug purpose) */
RCC_DeInit(); RCC_DeInit();
/* Enable HSE with external clock ( HSE_Bypass ) */ /* Enable HSE with external clock ( HSE_Bypass ) */
RCC_HSEConfig( RCC_HSE_Bypass ); RCC_HSEConfig( STM32_RCC_MODE );
/* Wait till HSE is ready */ /* Wait till HSE is ready */
ErrorStatus HSEStartUpStatus = RCC_WaitForHSEStartUp(); ErrorStatus HSEStartUpStatus = RCC_WaitForHSEStartUp();
if (HSEStartUpStatus != SUCCESS) { if (HSEStartUpStatus != SUCCESS) {
@@ -62,7 +63,7 @@ void mcu_arch_init(void) {
/* PCLK1 = HCLK/2 */ /* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2); RCC_PCLK1Config(RCC_HCLK_Div2);
/* PLLCLK = 8MHz * 9 = 72 MHz */ /* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); RCC_PLLConfig(RCC_PLLSource_HSE_Div1, STM32_PLL_MULT);
/* Enable PLL */ /* Enable PLL */
RCC_PLLCmd(ENABLE); RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready */ /* Wait till PLL is ready */
@@ -73,6 +74,7 @@ void mcu_arch_init(void) {
while(RCC_GetSYSCLKSource() != 0x08) {} while(RCC_GetSYSCLKSource() != 0x08) {}
} }
#else /* HSE_TYPE_EXT_CLK */ #else /* HSE_TYPE_EXT_CLK */
#warning Using normal system clock setup
SystemInit(); SystemInit();
#endif /* HSE_TYPE_EXT_CLK */ #endif /* HSE_TYPE_EXT_CLK */
/* Set the Vector Table base location at 0x08000000 */ /* Set the Vector Table base location at 0x08000000 */
@@ -25,6 +25,7 @@
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include "mcu_periph/can_arch.h"
#include "mcu_periph/can.h" #include "mcu_periph/can.h"
#include <stm32/rcc.h> #include <stm32/rcc.h>
File diff suppressed because it is too large Load Diff
@@ -85,7 +85,10 @@ typedef struct SpektrumStateStruct SpektrumStateType;
SpektrumStateType PrimarySpektrumState = {1,0,0,0,0,0,0,0,0}; SpektrumStateType PrimarySpektrumState = {1,0,0,0,0,0,0,0,0};
#ifdef RADIO_CONTROL_SPEKTRUM_SECONDARY_PORT #ifdef RADIO_CONTROL_SPEKTRUM_SECONDARY_PORT
#warning "Using secondary spektrum receiver."
SpektrumStateType SecondarySpektrumState = {1,0,0,0,0,0,0,0,0}; SpektrumStateType SecondarySpektrumState = {1,0,0,0,0,0,0,0,0};
#else
#warning "NOT using secondary spektrum receiver."
#endif #endif
int16_t SpektrumBuf[SPEKTRUM_CHANNELS_PER_FRAME*MAX_SPEKTRUM_FRAMES]; int16_t SpektrumBuf[SPEKTRUM_CHANNELS_PER_FRAME*MAX_SPEKTRUM_FRAMES];
+3
View File
@@ -1,11 +1,14 @@
#ifndef CONFIG_LISA_V1_0_H #ifndef CONFIG_LISA_V1_0_H
#define CONFIG_LISA_V1_0_H #define CONFIG_LISA_V1_0_H
#define BOARD_LISA_L
#define AHB_CLK 72000000 #define AHB_CLK 72000000
/* Lisa uses an external clock instead of a crystal */ /* Lisa uses an external clock instead of a crystal */
#define HSE_TYPE_EXT_CLK #define HSE_TYPE_EXT_CLK
#define STM32_RCC_MODE RCC_HSE_Bypass
#define STM32_PLL_MULT RCC_PLLMul_9
/* Onboard LEDs */ /* Onboard LEDs */
#define LED_1_BANK #define LED_1_BANK
+122
View File
@@ -0,0 +1,122 @@
#include "subsystems/sensors/baro.h"
struct Baro baro;
struct BaroBoard baro_board;
struct i2c_transaction baro_trans;
static inline void baro_board_write_to_register(uint8_t baro_addr, uint8_t reg_addr, uint8_t val_msb, uint8_t val_lsb);
static inline void baro_board_read_from_register(uint8_t baro_addr, uint8_t reg_addr);
static inline void baro_board_set_current_register(uint8_t baro_addr, uint8_t reg_addr);
static inline void baro_board_read_from_current_register(uint8_t baro_addr);
// absolute
#define BARO_ABS_ADDR 0x90
// differential
#define BARO_DIFF_ADDR 0x92
void baro_init(void) {
baro.status = BS_UNINITIALIZED;
baro.absolute = 0;
baro.differential = 0;
baro_board.status = LBS_UNINITIALIZED;
}
void baro_periodic(void) {
// check i2c_done
if (!i2c_idle(&i2c2)) return;
switch (baro_board.status) {
case LBS_UNINITIALIZED:
baro_board_send_reset();
baro_board.status = LBS_RESETED;
break;
case LBS_RESETED:
baro_board_send_config_abs();
baro_board.status = LBS_INITIALIZING_ABS;
break;
case LBS_INITIALIZING_ABS:
baro_board_set_current_register(BARO_ABS_ADDR, 0x00);
baro_board.status = LBS_INITIALIZING_ABS_1;
break;
case LBS_INITIALIZING_ABS_1:
baro_board_send_config_diff();
baro_board.status = LBS_INITIALIZING_DIFF;
break;
case LBS_INITIALIZING_DIFF:
baro_board_set_current_register(BARO_DIFF_ADDR, 0x00);
baro_board.status = LBS_INITIALIZING_DIFF_1;
// baro_board.status = LBS_UNINITIALIZED;
break;
case LBS_INITIALIZING_DIFF_1:
baro.status = BS_RUNNING;
case LBS_READ_DIFF:
baro_board_read_from_current_register(BARO_ABS_ADDR);
baro_board.status = LBS_READING_ABS;
break;
case LBS_READ_ABS:
baro_board_read_from_current_register(BARO_DIFF_ADDR);
baro_board.status = LBS_READING_DIFF;
break;
default:
break;
}
}
void baro_board_send_config_abs(void) {
baro_board_write_to_register(BARO_ABS_ADDR, 0x01, 0x86, 0x83);
}
void baro_board_send_config_diff(void) {
baro_board_write_to_register(BARO_DIFF_ADDR, 0x01, 0x84, 0x83);
}
void baro_board_send_reset(void) {
baro_trans.type = I2CTransTx;
baro_trans.slave_addr = 0x00;
baro_trans.len_w = 1;
baro_trans.buf[0] = 0x06;
i2c_submit(&i2c2,&baro_trans);
}
static inline void baro_board_write_to_register(uint8_t baro_addr, uint8_t reg_addr, uint8_t val_msb, uint8_t val_lsb) {
baro_trans.type = I2CTransTx;
baro_trans.slave_addr = baro_addr;
baro_trans.len_w = 3;
baro_trans.buf[0] = reg_addr;
baro_trans.buf[1] = val_msb;
baro_trans.buf[2] = val_lsb;
i2c_submit(&i2c2,&baro_trans);
}
static inline void baro_board_read_from_register(uint8_t baro_addr, uint8_t reg_addr) {
baro_trans.type = I2CTransTxRx;
baro_trans.slave_addr = baro_addr;
baro_trans.len_w = 1;
baro_trans.len_r = 2;
baro_trans.buf[0] = reg_addr;
i2c_submit(&i2c2,&baro_trans);
// i2c2.buf[0] = reg_addr;
// i2c2_transceive(baro_addr, 1, 2, &baro_board.i2c_done);
}
static inline void baro_board_set_current_register(uint8_t baro_addr, uint8_t reg_addr) {
baro_trans.type = I2CTransTx;
baro_trans.slave_addr = baro_addr;
baro_trans.len_w = 1;
baro_trans.buf[0] = reg_addr;
i2c_submit(&i2c2,&baro_trans);
// i2c2.buf[0] = reg_addr;
// i2c2_transmit(baro_addr, 1, &baro_board.i2c_done);
}
static inline void baro_board_read_from_current_register(uint8_t baro_addr) {
baro_trans.type = I2CTransRx;
baro_trans.slave_addr = baro_addr;
baro_trans.len_r = 2;
i2c_submit(&i2c2,&baro_trans);
// i2c2_receive(baro_addr, 2, &baro_board.i2c_done);
}
+62
View File
@@ -0,0 +1,62 @@
/*
* board specific fonctions for the lisa_m board
*
*/
#ifndef BOARDS_LISA_L_BARO_H
#define BOARDS_LISA_L_BARO_H
#include "std.h"
#include "mcu_periph/i2c.h"
enum LisaBaroStatus {
LBS_UNINITIALIZED,
LBS_RESETED,
LBS_INITIALIZING_ABS,
LBS_INITIALIZING_ABS_1,
LBS_INITIALIZING_DIFF,
LBS_INITIALIZING_DIFF_1,
LBS_IDLE,
LBS_READING_ABS,
LBS_READ_ABS,
LBS_READING_DIFF,
LBS_READ_DIFF
};
struct BaroBoard {
enum LisaBaroStatus status;
};
extern struct BaroBoard baro_board;
extern struct i2c_transaction baro_trans;
extern void baro_board_send_reset(void);
extern void baro_board_send_config_abs(void);
extern void baro_board_send_config_diff(void);
#define BaroEvent(_b_abs_handler, _b_diff_handler) { \
if (baro_board.status == LBS_READING_ABS && \
baro_trans.status != I2CTransPending) { \
baro_board.status = LBS_READ_ABS; \
if (baro_trans.status == I2CTransSuccess) { \
int16_t tmp = baro_trans.buf[0]<<8 | baro_trans.buf[1]; \
baro.absolute = tmp; \
_b_abs_handler(); \
} \
} \
else if (baro_board.status == LBS_READING_DIFF && \
baro_trans.status != I2CTransPending) { \
baro_board.status = LBS_READ_DIFF; \
if (baro_trans.status == I2CTransSuccess) { \
int16_t tmp = baro_trans.buf[0]<<8 | baro_trans.buf[1]; \
baro.differential = tmp; \
_b_diff_handler(); \
} \
} \
}
#endif /* BOARDS_LISA_L_BARO_H */
+9 -1
View File
@@ -1,19 +1,22 @@
#ifndef CONFIG_LISA_M_1_0_H #ifndef CONFIG_LISA_M_1_0_H
#define CONFIG_LISA_M_1_0_H #define CONFIG_LISA_M_1_0_H
#define BOARD_LISA_M
#define AHB_CLK 72000000 #define AHB_CLK 72000000
/* Onboard LEDs */ /* Onboard LEDs */
#define LED_1_BANK #define LED_1_BANK
#define LED_1_GPIO GPIOB #define LED_1_GPIO GPIOB
#define LED_1_GPIO_CLK RCC_APB2Periph_GPIOB #define LED_1_GPIO_CLK RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO
#define LED_1_GPIO_PIN GPIO_Pin_4 #define LED_1_GPIO_PIN GPIO_Pin_4
#define LED_1_AFIO_REMAP GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE)
#define LED_2_BANK #define LED_2_BANK
#define LED_2_GPIO GPIOC #define LED_2_GPIO GPIOC
#define LED_2_GPIO_CLK RCC_APB2Periph_GPIOC #define LED_2_GPIO_CLK RCC_APB2Periph_GPIOC
#define LED_2_GPIO_PIN GPIO_Pin_13 #define LED_2_GPIO_PIN GPIO_Pin_13
#define LED_2_AFIO_REMAP ((void)0)
/* configuration for aspirin - and more generaly IMUs */ /* configuration for aspirin - and more generaly IMUs */
#define IMU_ACC_DRDY_RCC_GPIO RCC_APB2Periph_GPIOB #define IMU_ACC_DRDY_RCC_GPIO RCC_APB2Periph_GPIOB
@@ -23,5 +26,10 @@
#define ADC_CHANNEL_VSUPPLY 4 #define ADC_CHANNEL_VSUPPLY 4
#define DefaultVoltageOfAdc(adc) (0.01787109375*adc) #define DefaultVoltageOfAdc(adc) (0.01787109375*adc)
#define BOARD_HAS_BARO
#define HSE_TYPE_EXT_CLK
#define STM32_RCC_MODE RCC_HSE_ON
#define STM32_PLL_MULT RCC_PLLMul_6
#endif /* CONFIG_LISA_M_1_0_H */ #endif /* CONFIG_LISA_M_1_0_H */
@@ -43,7 +43,6 @@ void actuators_init(void) {
actuators_mkk.trans[i].type = I2CTransTx; actuators_mkk.trans[i].type = I2CTransTx;
actuators_mkk.trans[i].len_w = 1; actuators_mkk.trans[i].len_w = 1;
actuators_mkk.trans[i].slave_addr = actuators_addr[i]; actuators_mkk.trans[i].slave_addr = actuators_addr[i];
actuators_mkk.trans[i].stop_after_transmit = TRUE;
actuators_mkk.trans[i].status = I2CTransSuccess; actuators_mkk.trans[i].status = I2CTransSuccess;
} }
@@ -65,7 +65,9 @@ void autopilot_init(void) {
autopilot_flight_time = 0; autopilot_flight_time = 0;
autopilot_rc = TRUE; autopilot_rc = TRUE;
autopilot_power_switch = FALSE; autopilot_power_switch = FALSE;
#ifdef POWER_SWITCH_LED
LED_ON(POWER_SWITCH_LED); // POWER OFF LED_ON(POWER_SWITCH_LED); // POWER OFF
#endif
} }
@@ -95,11 +95,17 @@ extern uint16_t autopilot_flight_time;
else autopilot_motors_on = TRUE; \ else autopilot_motors_on = TRUE; \
} }
#ifdef POWER_SWITCH_LED
#define autopilot_SetPowerSwitch(_v) { \ #define autopilot_SetPowerSwitch(_v) { \
autopilot_power_switch = _v; \ autopilot_power_switch = _v; \
if (_v) { LED_OFF(POWER_SWITCH_LED); } \ if (_v) { LED_OFF(POWER_SWITCH_LED); } \
else { LED_ON(POWER_SWITCH_LED); } \ else { LED_ON(POWER_SWITCH_LED); } \
} }
#else
#define autopilot_SetPowerSwitch(_v) { \
autopilot_power_switch = _v; \
}
#endif
#ifndef TRESHOLD_GROUND_DETECT #ifndef TRESHOLD_GROUND_DETECT
#define TRESHOLD_GROUND_DETECT ACCEL_BFP_OF_REAL(15.) #define TRESHOLD_GROUND_DETECT ACCEL_BFP_OF_REAL(15.)
+52 -2
View File
@@ -29,12 +29,62 @@
#include "led.h" #include "led.h"
void Delay(__IO uint32_t nCount); void Delay(__IO uint32_t nCount);
void led_on(int i);
void led_off(int i);
#ifdef BOARD_LISA_L
#define LED_PROGRAM_SIZE 26 #define LED_PROGRAM_SIZE 26
const int LED_PROG_ON[LED_PROGRAM_SIZE] = { 3, 5, 7, 1, -1, -1, -1, -1, 2, 4, 6, 0, 3, 5, 7, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }; const int LED_PROG_ON[LED_PROGRAM_SIZE] = { 3, 5, 7, 1, -1, -1, -1, -1, 2, 4, 6, 0, 3, 5, 7, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
const int LED_PROG_OFF[LED_PROGRAM_SIZE] = {-1, -1, -1, -1, 3, 5, 7, 1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 5, 7, 1, 2, 4, 6, 0, -1, -1 }; const int LED_PROG_OFF[LED_PROGRAM_SIZE] = {-1, -1, -1, -1, 3, 5, 7, 1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 5, 7, 1, 2, 4, 6, 0, -1, -1 };
#endif
#ifdef BOARD_LISA_M
#define LED_PROGRAM_SIZE 10
const int LED_PROG_ON[LED_PROGRAM_SIZE] = { 1, 2, -1, -1, -1, 2, 1, -1, -1, -1 };
const int LED_PROG_OFF[LED_PROGRAM_SIZE] = { -1, -1, 1, 2, -1, -1, -1, 2, 1, -1 };
#endif
void led_on(int i) {
#ifdef BOARD_LISA_L
LED_ON(i);
#endif
#ifdef BOARD_LISA_M
switch (i) {
case 1:
LED_ON(1);
break;
case 2:
LED_ON(2);
break;
default:
/* ignore as we only have 2 led's for now on lisa/m */
break;
}
#endif
}
void led_off(int i) {
#ifdef BOARD_LISA_L
LED_OFF(i);
#endif
#ifdef BOARD_LISA_M
switch (i) {
case 1:
LED_OFF(1);
break;
case 2:
LED_OFF(2);
break;
default:
/* ignore as we only have 2 led's for now on lisa/m */
break;
}
#endif
}
int main(void) { int main(void) {
int i = 0; int i = 0;
@@ -43,11 +93,11 @@ int main(void) {
for (i=0; i< LED_PROGRAM_SIZE; i++) for (i=0; i< LED_PROGRAM_SIZE; i++)
{ {
if (LED_PROG_ON[i] >= 0) if (LED_PROG_ON[i] >= 0)
LED_ON(LED_PROG_ON[i]); led_on(LED_PROG_ON[i]);
LED_PERIODIC(); LED_PERIODIC();
Delay(2000000); Delay(2000000);
if (LED_PROG_OFF[i] >= 0) if (LED_PROG_OFF[i] >= 0)
LED_OFF(LED_PROG_OFF[i]); led_off(LED_PROG_OFF[i]);
} }
}; };
return 0; return 0;
+90
View File
@@ -0,0 +1,90 @@
/*
* $Id$
*
* Copyright (C) 2009 Antoine Drouin <poinix@gmail.com>
*
* 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 <stm32/rcc.h>
#include <stm32/gpio.h>
#include <stm32/flash.h>
#include <stm32/misc.h>
#include BOARD_CONFIG
#include "mcu.h"
#include "mcu_periph/uart.h"
#include "sys_time.h"
static inline void main_init( void );
static inline void main_periodic( void );
int main(void) {
main_init();
while (1) {
if (sys_time_periodic())
main_periodic();
}
return 0;
}
static inline void main_init( void ) {
mcu_init();
sys_time_init();
}
static inline void main_periodic( void ) {
char ch;
Uart1Transmit('a');
Uart2Transmit('b');
Uart3Transmit('c');
LED_OFF(1);
LED_OFF(2);
if (Uart1ChAvailable()) {
ch = Uart1Getch();
if (ch == 'a') {
LED_ON(1);
} else {
LED_ON(2);
}
}
if (Uart2ChAvailable()) {
ch = Uart2Getch();
if (ch == 'b') {
LED_ON(1);
} else {
LED_ON(2);
}
}
if (Uart3ChAvailable()) {
ch = Uart3Getch();
if (ch == 'c') {
LED_ON(1);
} else {
LED_ON(2);
}
}
}
+23 -32
View File
@@ -43,7 +43,6 @@ struct i2c_transaction {
uint8_t slave_addr; uint8_t slave_addr;
uint16_t len_r; uint16_t len_r;
uint8_t len_w; uint8_t len_w;
bool_t stop_after_transmit;
volatile uint8_t buf[I2C_BUF_LEN]; volatile uint8_t buf[I2C_BUF_LEN];
volatile enum I2CTransactionStatus status; volatile enum I2CTransactionStatus status;
}; };
@@ -61,6 +60,10 @@ struct i2c_periph {
volatile enum I2CStatus status; volatile enum I2CStatus status;
volatile uint8_t idx_buf; volatile uint8_t idx_buf;
void* reg_addr; void* reg_addr;
void *init_struct;
uint16_t scl_pin;
uint16_t sda_pin;
struct i2c_errors *errors;
}; };
@@ -132,40 +135,28 @@ extern bool_t i2c_idle(struct i2c_periph* p);
extern bool_t i2c_submit(struct i2c_periph* p, struct i2c_transaction* t); extern bool_t i2c_submit(struct i2c_periph* p, struct i2c_transaction* t);
#define I2CReceive(_p, _t, _s_addr, _len) { \ #define I2CReceive(_p, _t, _s_addr, _len) { \
_t.type = I2CTransRx; \ _t.type = I2CTransRx; \
_t.slave_addr = _s_addr; \ _t.slave_addr = _s_addr; \
_t.len_r = _len; \ _t.len_r = _len; \
_t.len_w = 0; \ _t.len_w = 0; \
_t.stop_after_transmit = TRUE; \ i2c_submit(&(_p),&(_t)); \
i2c_submit(&(_p),&(_t)); \ }
}
#define I2CTransmit(_p, _t, _s_addr, _len) { \ #define I2CTransmit(_p, _t, _s_addr, _len) { \
_t.type = I2CTransTx; \ _t.type = I2CTransTx; \
_t.slave_addr = _s_addr; \ _t.slave_addr = _s_addr; \
_t.len_r = 0; \ _t.len_r = 0; \
_t.len_w = _len; \ _t.len_w = _len; \
_t.stop_after_transmit = TRUE; \ i2c_submit(&(_p),&(_t)); \
i2c_submit(&(_p),&(_t)); \ }
}
#define I2CTransmitNoStop(_p, _t, _s_addr, _len) { \ #define I2CTransceive(_p, _t, _s_addr, _len_w, _len_r) { \
_t.type = I2CTransTx; \ _t.type = I2CTransTxRx; \
_t.slave_addr = _s_addr; \ _t.slave_addr = _s_addr; \
_t.len_r = 0; \ _t.len_r = _len_r; \
_t.len_w = _len; \ _t.len_w = _len_w; \
_t.stop_after_transmit = FALSE; \ i2c_submit(&(_p),&(_t)); \
i2c_submit(&(_p),&(_t)); \ }
}
#define I2CTransceive(_p, _t, _s_addr, _len_w, _len_r) { \
_t.type = I2CTransTxRx; \
_t.slave_addr = _s_addr; \
_t.len_r = _len_r; \
_t.len_w = _len_w; \
_t.stop_after_transmit = TRUE; \
i2c_submit(&(_p),&(_t)); \
}
#endif /* I2C_H */ #endif /* I2C_H */
+1 -2
View File
@@ -17,7 +17,6 @@ void ami601_init( void ) {
} }
ami601_i2c_trans.status = I2CTransSuccess; ami601_i2c_trans.status = I2CTransSuccess;
ami601_i2c_trans.slave_addr = AMI601_SLAVE_ADDR; ami601_i2c_trans.slave_addr = AMI601_SLAVE_ADDR;
ami601_i2c_trans.stop_after_transmit = TRUE;
ami601_nb_err = 0; ami601_nb_err = 0;
ami601_status = AMI601_IDLE; ami601_status = AMI601_IDLE;
@@ -26,7 +25,7 @@ void ami601_init( void ) {
void ami601_read( void ) { void ami601_read( void ) {
if (ami601_status != AMI601_IDLE) { if (ami601_status != AMI601_IDLE) {
ami601_nb_err++; ami601_nb_err++;
ami601_status == AMI601_IDLE; ami601_status = AMI601_IDLE;
} }
else { else {
ami601_status = AMI601_SENDING_REQ; ami601_status = AMI601_SENDING_REQ;
-1
View File
@@ -11,7 +11,6 @@ void hmc5843_init(void)
{ {
hmc5843.i2c_trans.status = I2CTransSuccess; hmc5843.i2c_trans.status = I2CTransSuccess;
hmc5843.i2c_trans.slave_addr = HMC5843_ADDR; hmc5843.i2c_trans.slave_addr = HMC5843_ADDR;
hmc5843.i2c_trans.stop_after_transmit = TRUE;
hmc5843_arch_init(); hmc5843_arch_init();
} }
-1
View File
@@ -59,7 +59,6 @@ static inline void main_periodic_task( void ) {
trans.buf[0] = 0x04; trans.buf[0] = 0x04;
trans.len_w = 1; trans.len_w = 1;
trans.slave_addr = 0x58; trans.slave_addr = 0x58;
trans.stop_after_transmit = TRUE;
i2c_submit(&ACTUATORS_MKK_DEV,&trans); i2c_submit(&ACTUATORS_MKK_DEV,&trans);
LED_PERIODIC(); LED_PERIODIC();
+1 -1
View File
@@ -87,7 +87,7 @@ module Make (A:Data.MISSION) (FM: FlightModel.SIG) = struct
"GSpeed", scale gps.gspeed 1e2; "GSpeed", scale gps.gspeed 1e2;
"Heading", scale (deg_of_rad gps.course) 1e5] "Heading", scale (deg_of_rad gps.course) 1e5]
let infrared = fun ir_left ir_front ir_top _air_speed -> let infrared_and_airspeed = fun ir_left ir_front ir_top _air_speed ->
try try
DatalinkPprz.message_send "hitl" "HITL_INFRARED" DatalinkPprz.message_send "hitl" "HITL_INFRARED"
["ac_id",Pprz.Int !my_id; ["ac_id",Pprz.Int !my_id;
+2 -2
View File
@@ -61,7 +61,7 @@ module type AIRCRAFT =
val commands : pprz_t array -> unit val commands : pprz_t array -> unit
(** Called once at init *) (** Called once at init *)
val infrared : float -> float -> float -> float -> unit val infrared_and_airspeed : float -> float -> float -> float -> unit
(** [infrared ir_left ir_front ir_top air_speed] Called on timer *) (** [infrared ir_left ir_front ir_top air_speed] Called on timer *)
val gps : Gps.state -> unit val gps : Gps.state -> unit
@@ -207,7 +207,7 @@ module Make(AircraftItl : AIRCRAFT_ITL) = struct
let ir_left = sin phi_sensor *. !infrared_contrast let ir_left = sin phi_sensor *. !infrared_contrast
and ir_front = sin theta_sensor *. !infrared_contrast and ir_front = sin theta_sensor *. !infrared_contrast
and ir_top = cos phi_sensor *. cos theta_sensor *. !infrared_contrast in and ir_top = cos phi_sensor *. cos theta_sensor *. !infrared_contrast in
Aircraft.infrared ir_left ir_front ir_top (FlightModel.get_air_speed !state) Aircraft.infrared_and_airspeed ir_left ir_front ir_top (FlightModel.get_air_speed !state)
and gps_task = fun () -> and gps_task = fun () ->
let (x,y,z) = FlightModel.get_xyz !state in let (x,y,z) = FlightModel.get_xyz !state in
+1 -1
View File
@@ -9,7 +9,7 @@ module type AIRCRAFT =
val init : int -> GPack.box -> unit val init : int -> GPack.box -> unit
val boot : Stdlib.value -> unit val boot : Stdlib.value -> unit
val commands : Stdlib.pprz_t array -> unit val commands : Stdlib.pprz_t array -> unit
val infrared : float -> float -> float -> float -> unit val infrared_and_airspeed : float -> float -> float -> float -> unit
val gps : Gps.state -> unit val gps : Gps.state -> unit
end end
+3 -3
View File
@@ -189,10 +189,10 @@ module Make (A:Data.MISSION) (FM: FlightModel.SIG) = struct
(* Functions called by the simulator *) (* Functions called by the simulator *)
let commands = fun s -> rcommands := s let commands = fun s -> rcommands := s
external set_ir : int -> int -> int -> float -> unit = "set_ir" external set_ir_and_airspeed : int -> int -> int -> float -> unit = "set_ir_and_airspeed"
let infrared = fun ir_left ir_front ir_top air_speed -> let infrared_and_airspeed = fun ir_left ir_front ir_top air_speed ->
(** ADC neutral is not taken into account in the soft sim (c.f. sim_ir.c)*) (** ADC neutral is not taken into account in the soft sim (c.f. sim_ir.c)*)
set_ir (truncate ir_left) (truncate ir_front) (truncate ir_top) air_speed set_ir_and_airspeed (truncate ir_left) (truncate ir_front) (truncate ir_top) air_speed
external use_gps_pos: int -> int -> int -> float -> float -> float -> float -> float -> bool -> float -> float -> unit = "sim_use_gps_pos_bytecode" "sim_use_gps_pos" external use_gps_pos: int -> int -> int -> float -> float -> float -> float -> float -> bool -> float -> float -> unit = "sim_use_gps_pos_bytecode" "sim_use_gps_pos"
let gps = fun gps -> let gps = fun gps ->