aboutsummaryrefslogtreecommitdiffstats
path: root/wirish
diff options
context:
space:
mode:
Diffstat (limited to 'wirish')
-rw-r--r--wirish/ext_interrupts.h8
-rw-r--r--wirish/io.h14
-rw-r--r--wirish/pwm.c2
-rw-r--r--wirish/pwm.h11
-rw-r--r--wirish/time.c1
-rw-r--r--wirish/time.h36
-rw-r--r--wirish/wirish_digital.c6
-rw-r--r--wirish/wirish_math.h100
8 files changed, 154 insertions, 24 deletions
diff --git a/wirish/ext_interrupts.h b/wirish/ext_interrupts.h
index 80e2e9e..d44978a 100644
--- a/wirish/ext_interrupts.h
+++ b/wirish/ext_interrupts.h
@@ -34,7 +34,7 @@
#define _EXT_INTERRUPTS_H_
/**
- * The kind transition on an external pin which should trigger an
+ * The kind of transition on an external pin which should trigger an
* interrupt.
*/
typedef enum ExtIntTriggerMode_ {
@@ -56,13 +56,16 @@ extern "C"{
*
* The interrupt will be triggered on a given transition on the pin,
* as specified by the mode parameter. The handler runs in interrupt
- * context.
+ * context. The new handler will replace whatever handler is
+ * currently registered for the pin, if any.
*
* @param pin Maple pin number
* @param handler Function to run upon external interrupt trigger.
+ * The handler should take no arguments, and have void return type.
* @param mode Type of transition to trigger on, e.g. falling, rising, etc.
*
* @sideeffect Registers a handler
+ * @see detachInterrupt()
*/
void attachInterrupt(uint8 pin, voidFuncPtr handler, ExtIntTriggerMode mode);
@@ -70,6 +73,7 @@ void attachInterrupt(uint8 pin, voidFuncPtr handler, ExtIntTriggerMode mode);
* @brief Disable any registered external interrupt.
* @param pin Maple pin number
* @sideeffect unregisters external interrupt handler
+ * @see attachInterrupt()
*/
void detachInterrupt(uint8 pin);
diff --git a/wirish/io.h b/wirish/io.h
index f82e414..f01efcb 100644
--- a/wirish/io.h
+++ b/wirish/io.h
@@ -148,13 +148,17 @@ uint32 digitalRead(uint8);
/**
* Read an analog value from pin. This function blocks during ADC
- * conversion. The pin must have its mode set to INPUT_ANALOG.
+ * conversion, and has 12 bits of resolution. The pin must have its
+ * mode set to INPUT_ANALOG. Ignoring function call overhead,
+ * conversion time is 55.5 cycles.
*
- * @param pin Pin to read from. One of: 0-38 (pin numbers as labeled
- * on silkscreen), or D0-D38 (symbols for same)
- * @return ADC-converted voltage, in the range 0--4095, inclusive.
+ * @param pin Pin to read from. One of: 0, 1, 2, 3, 10, 11, 12, 13,
+ * 15, 16, 17, 18, 19, 20, 27, 28.
+
+ * @return ADC-converted voltage, in the range 0--4095, inclusive
+ * (i.e. a 12-bit ADC conversion).
+
* @see pinMode()
- * @see analogReference()
*/
uint32 analogRead(uint8 pin);
diff --git a/wirish/pwm.c b/wirish/pwm.c
index 0bf27aa..dc5cfab 100644
--- a/wirish/pwm.c
+++ b/wirish/pwm.c
@@ -46,5 +46,3 @@ void pwmWrite(uint8 pin, uint16 duty_cycle) {
timer_pwm_write_ccr(ccr, duty_cycle);
}
-
-
diff --git a/wirish/pwm.h b/wirish/pwm.h
index 6d0ddaf..d0bc9e0 100644
--- a/wirish/pwm.h
+++ b/wirish/pwm.h
@@ -35,15 +35,18 @@
extern "C"{
#endif
+/**
+ * As a convenience, analogWrite is an alias of pwmWrite to ease
+ * porting Arduino code. However, period and duty will have to be
+ * recalibrated.
+ */
#define analogWrite pwmWrite
/**
- * Set the PWM duty.
+ * Set the PWM duty on the given pin.
*
* User code is expected to determine and honor the maximum value
- * (based on the configured period). As a convenience, analogWrite is
- * an alias of pwmWrite to ease porting Arduino code, though period
- * and duty will have to be recalibrated
+ * (based on the configured period).
*/
void pwmWrite(uint8 pin, uint16 duty_cycle);
diff --git a/wirish/time.c b/wirish/time.c
index 3a48197..c0a0649 100644
--- a/wirish/time.c
+++ b/wirish/time.c
@@ -43,7 +43,6 @@ void delayMicroseconds(uint32 us) {
/* fudge for function call overhead */
us--;
- int x = 4;
asm volatile(" mov r0, %[us] \n\t"
"1: subs r0, #1 \n\t"
" bhi 1b \n\t"
diff --git a/wirish/time.h b/wirish/time.h
index fad47a4..18aef9a 100644
--- a/wirish/time.h
+++ b/wirish/time.h
@@ -23,7 +23,8 @@
*****************************************************************************/
/**
- * @brief Timing and delay functions.
+ * @file time.h
+ * @brief Timing and delay functions.
*/
#ifndef _TIME_H
@@ -41,12 +42,20 @@ extern "C"{
extern volatile uint32 systick_timer_millis;
-/* time in milliseconds since boot */
+/**
+ * Returns time (in milliseconds) since the beginning of program
+ * execution. On overflow, restarts at 0.
+ * @see micros()
+ */
static inline uint32 millis(void) {
return systick_timer_millis;
}
-/* Time in microseconds since boot */
+/**
+ * Returns time (in microseconds) since the beginning of program
+ * execution. On overflow, restarts at 0.
+ * @see millis()
+ */
static inline uint32 micros(void) {
uint32 ms;
uint32 cycle_cnt;
@@ -67,7 +76,28 @@ static inline uint32 micros(void) {
return res;
}
+/**
+ * Delay for at least the given number of milliseconds.
+ *
+ * Interrupts, etc. may cause the actual number of milliseconds to
+ * exceed ms. However, this function will return no less than ms
+ * milliseconds from the time it is called.
+ *
+ * @param ms the number of milliseconds to delay.
+ * @see delayMicroseconds()
+ */
void delay(unsigned long ms);
+
+/**
+ * Delay for at least the given number of microseconds.
+ *
+ * Interrupts, etc. may cause the actual number of microseconds to
+ * exceed us. However, this function will return no less than us
+ * microseconds from the time it is called.
+ *
+ * @param us the number of microseconds to delay.
+ * @see delay()
+ */
void delayMicroseconds(uint32 us);
#ifdef __cplusplus
diff --git a/wirish/wirish_digital.c b/wirish/wirish_digital.c
index aa22196..d7da81f 100644
--- a/wirish/wirish_digital.c
+++ b/wirish/wirish_digital.c
@@ -31,7 +31,7 @@
void pinMode(uint8 pin, WiringPinMode mode) {
uint8 outputMode;
- uint32 pwm = 0;
+ boolean pwm = false;
if (pin >= NR_GPIO_PINS) {
return;
@@ -59,11 +59,11 @@ void pinMode(uint8 pin, WiringPinMode mode) {
break;
case PWM:
outputMode = GPIO_MODE_AF_OUTPUT_PP;
- pwm = 1;
+ pwm = true;
break;
case PWM_OPEN_DRAIN:
outputMode = GPIO_MODE_AF_OUTPUT_OD;
- pwm = 1;
+ pwm = true;
break;
default:
ASSERT(0);
diff --git a/wirish/wirish_math.h b/wirish/wirish_math.h
index 4543c1b..9578eb4 100644
--- a/wirish/wirish_math.h
+++ b/wirish/wirish_math.h
@@ -22,6 +22,11 @@
* THE SOFTWARE.
*****************************************************************************/
+/**
+ * @file wirish_math.h
+ * @brief Includes cmath; provides Arduino-compatible math routines.
+ */
+
#ifndef _WIRING_MATH_H_
#define _WIRING_MATH_H_
@@ -29,10 +34,53 @@
#ifdef __cplusplus
-void randomSeed(unsigned int);
-long random(long);
-long random(long, long);
-long map(long, long, long, long, long);
+/**
+ * @brief Initialize the pseudo-random number generator.
+ * @param seed the number used to initialize the seed; cannot be zero.
+ */
+void randomSeed(unsigned int seed);
+
+/**
+ * @brief Generate a pseudo-random number with upper bound.
+ * @param max An upper bound on the returned value, exclusive.
+ * @return A pseudo-random number in the range [0,max).
+ * @see randomSeed()
+ */
+long random(long max);
+
+/**
+ * @brief Generate a pseudo-random number with lower and upper bounds.
+ * @param min Lower bound on the returned value, inclusive.
+ * @param max Upper bound on the returned value, exclusive.
+ * @return A pseudo-random number in the range [min, max).
+ * @see randomSeed()
+ */
+long random(long min, long max);
+
+/**
+ * @brief Remap a number from one range to another.
+ *
+ * That is, a value equal to fromStart gets mapped to toStart, a value
+ * of fromEnd to toEnd, and other values are mapped proportionately.
+ *
+ * Does not constrain value to lie within [fromStart, fromEnd].
+ *
+ * If a "start" value is larger than its corresponding "end", the
+ * ranges are reversed, so map(n, 1, 10, 10, 1) would reverse the
+ * range [1,10].
+ *
+ * Negative numbers may appear as any argument.
+ *
+ * @param value the value to map.
+ * @param fromStart the beginning of the value's current range.
+ * @param fromEnd the end of the value's current range.
+ * @param toStart the beginning of the value's mapped range.
+ * @param toEnd the end of the value's mapped range.
+ * @return the mapped value.
+ */
+long map(long value,
+ long fromStart, long fromEnd,
+ long toStart, long toEnd);
#define PI 3.1415926535897932384626433832795
#define HALF_PI 1.5707963267948966192313216916398
@@ -56,4 +104,48 @@ long map(long, long, long, long, long);
#endif
+/* Following are duplicate declarations (with Doxygen comments) for
+ * some of the math.h functions; this is for the convenience of the
+ * Sphinx docs.
+ */
+
+/**
+ * Compute the cosine of an angle, in radians.
+ * @param x The radian measure of the angle.
+ * @return The cosine of x. This value will be between -1 and 1.
+ */
+double cos(double x);
+
+/**
+ * Compute the sine of an angle, in radians.
+ * @param x The radian measure of the angle.
+ * @return The sine of x. This value will be between -1 and 1.
+ */
+double sin(double x);
+
+/**
+ * Compute the tangent of an angle, in radians.
+ * @param x The radian measure of the angle.
+ * @return The tangent of x. There are no limits on the return value
+ * of this function.
+ */
+double tan(double x);
+
+/**
+ * Compute the square root of a number.
+ * @param x The number whose square root to find. This value cannot
+ * be negative.
+ * @return The square root of x. The return value is never negative.
+ */
+double sqrt(double x);
+
+/**
+ * Compute an exponentiation.
+ * @param x the base. This value cannot be zero if y <= 0. This value
+ * cannot be negative if y is not an integral value.
+ * @param y the exponent.
+ * @return x raised to the power y.
+ */
+double pow(double x, double y);
+
#endif