00001 #ifndef _DDA_MATHS_H
00002 #define _DDA_MATHS_H
00003
00004 #include <stdint.h>
00005
00006 #include "config.h"
00007
00008
00009
00010 const int32_t muldivQR(int32_t multiplicand, uint32_t qn, uint32_t rn,
00011 uint32_t divisor);
00012
00013
00014 static int32_t muldiv(int32_t, uint32_t, uint32_t) __attribute__ ((always_inline));
00015 inline int32_t muldiv(int32_t multiplicand, uint32_t multiplier,
00016 uint32_t divisor) {
00017 return muldivQR(multiplicand, multiplier / divisor, multiplier % divisor, divisor);
00018 }
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 static int32_t um_to_steps_x(int32_t) __attribute__ ((always_inline));
00029 inline int32_t um_to_steps_x(int32_t distance) {
00030 return muldivQR(distance, STEPS_PER_M_X / 1000000UL,
00031 STEPS_PER_M_X % 1000000UL, 1000000UL);
00032 }
00033
00034 static int32_t um_to_steps_y(int32_t) __attribute__ ((always_inline));
00035 inline int32_t um_to_steps_y(int32_t distance) {
00036 return muldivQR(distance, STEPS_PER_M_Y / 1000000UL,
00037 STEPS_PER_M_Y % 1000000UL, 1000000UL);
00038 }
00039
00040 static int32_t um_to_steps_z(int32_t) __attribute__ ((always_inline));
00041 inline int32_t um_to_steps_z(int32_t distance) {
00042 return muldivQR(distance, STEPS_PER_M_Z / 1000000UL,
00043 STEPS_PER_M_Z % 1000000UL, 1000000UL);
00044 }
00045
00046
00047 uint32_t approx_distance(uint32_t dx, uint32_t dy);
00048
00049
00050 uint32_t approx_distance_3(uint32_t dx, uint32_t dy, uint32_t dz);
00051
00052
00053 uint16_t int_sqrt(uint32_t a);
00054
00055
00056
00057 const uint8_t msbloc(uint32_t v);
00058
00059 #endif