Issues
We use only three categories
- FIXME
-
For known bugs and defects. Should not appear in devel/master branch. May appera in feature/development branches.
- TODO
-
Things considered to be vital for the next release, may appear in devel but should not appear in master and release branches.
- PLANNED
-
General wishlist/brainfart/planning thing. Just noted, some may become promoted to TODO someday, others may become discarded.
Fixme
muos/doc/muos.txt:7::
document that functions must disable interrupts
muos/stepper.c:178::
refine configstore errors
muos/stepper.c:188::
phase correction for UP steppers
muos/stepper.c:399::
refine configstore errors
muos/sm.c:169::
wait for 2 elements free, locked wait
muos/configstore.c:148::
simple non redundant version for now
muos/configstore.c:171::
DEAD not as state but error, let states only reflect the state in memory
muos/lib/spriq.c:23::
schedule with when = 1 doesn't work
muos/stepper.h:407::
done -> plan
muos/hw/atmel/avr/atmega.h:27::
HW() config
Todo
muos/doc/WEB.pdoc:30::
mob repository
muos/doc/WEB.pdoc:39::
contact/mailinglist
muos/doc/MAIN.pdoc:25::
document git repository/submodules
muos/doc/MAIN.pdoc:26::
cooperation, mob repository, coding style, docs
muos/doc/MAIN.pdoc:27::
development workflow
muos/doc/MAIN.pdoc:28::
usage workflow
muos/stepper.c:30::
API for setting each axis and then start all together
muos/stepper.c:405::
fast return only out_steps w/o fast or slope
muos/serial.c:94::
calculate timeout baudrate for txbuffer characters
muos/error.c:26::
no need to store muos_error_success, array one bit smaller, fix indexing
muos/muos.c:45::
select sleep mode depending on active hardware (adc, usart)
muos/muos.c:183::
how to init all muos structures .. #define MUOS_EXPLICIT_INIT
muos/configstore.c:48::
calculate type from array capacity
muos/clpq.c:79::
return error instead async
muos/clpq.c:101::
return when already compmatch or disable compmatch when time is too short
muos/clpq.c:103::
new implementation
muos/lineedit.c:299::
suspend lineedit until the callback is finished (w/ wraper)
muos/lineedit.c:300::
push callback on bgq
muos/hw/atmel/avr/stepper.c:174::
case MUOS_STEPPER_STOPPING: */ {git_blame_context ()}
muos/hw/atmel/avr/stepper.c:329::
set pin to defined state
muos/hw/atmel/avr/stepper.c:416::
dirpol for unipolar
muos/hw/atmel/avr/stepper.c:445::
conditional for different parts
muos/hw/atmel/avr/stepper.c:446::
progmem
muos/hw/atmel/avr/serial.c:71::
disable error checks depending on config (no parity etc)
muos/io.h:51::
I/O and interrupt safety
muos/pp.h:25::
DOCME
muos/configstore.h:127::
add callback when config gets changed for reinitializeing dependencies
muos/configstore.h:128::
document implicit config_size
muos/pptest.h:56::
check state
muos/stepper.h:34::
startall()
muos/stepper.h:35::
sync moves
muos/stepper.h:144::
unimplemented
muos/stepper.h:165::
calculate for maxslope
muos/stepper.h:337::
what helper functions are needed foor low level configuration? zigzag etc.
muos/stepper.h:475::
implement slope_load() (doing get, copy, commit)
muos/stepper.h:530::
slope_load w/ fixing destination
muos/stepper.h:569::
implement me
muos/stepper.h:572::
implement me
muos/stepper.h:650::
backlash compensation
muos/error.h:39::
conditional error generation depending on what drivers are enabled
muos/sm.h:227::
improper api, needs to be improved
muos/muos.h:56::
use GPIO register
muos/muos.h:132::
document me
muos/hw/atmel/avr/attiny84.h:81::
DDRB = 0;
muos/hw/atmel/avr/attiny84.h:82::
DDRC = 0;
muos/hw/atmel/avr/attiny84.h:83::
DDRD = 0;
muos/hw/atmel/avr/avr.h:94::
configureable mode
muos/muos.mk:103::
document init system
Planned
muos/doc/PLANNED.txt:1::
macros for Hz kHz
muos/doc/PLANNED.txt:3::
different timebase, stable timing etc
muos/doc/PLANNED.txt:6::
return continutations and schedule them in the schedulers
muos/doc/PLANNED.txt:9::
docme MAKEFILE include muos/muos.mk
muos/doc/PLANNED.txt:10::
docme All hardware macro and functions have the prefix 'MUOS_HW_' or 'muos_hw_'
muos/doc/PLANNED.txt:12::
rtpq realtime priority queue
runs direct in timer interrupt, exact timing, wakes up a little earlier
spins to exact time. Serve from clpq, tag functions as hard-rt and dont
reenable interrupts then.
muos/doc/PLANNED.txt:17::
ltpq long time queue
. uses longer, absolute time format (muos_clock or muos_fullclock)
. needs more memory
. handled from the clpq (one regular job at each cycles moves elements
form ltpq to clpq)
. optional only needed for 'calendar' like events, may be short, only as
much long time events the program uses at most
. persistent timers stored in EEPROM when RTC is present
muos/doc/PLANNED.txt:26::
-mint8 compatible
muos/doc/PLANNED.txt:28::
library for rationals
muos/doc/PLANNED.txt:30::
Testing
muos/doc/PLANNED.txt:32::
Stack checks
muos/doc/PLANNED.txt:34::
watchdog
timeout for rtq, bgq
how to detect timeouts on clq?
muos/doc/PLANNED.txt:38::
Indirect jump tables for queues
register all 'callable' functions in one array. The queues can then
index this table by uint8_t or shorter.
muos/doc/PLANNED.txt:42::
Interrupt hooks? adding interrupt handlers dynamically
muos/doc/PLANNED.txt:45::
*lineedit* load/save commandline from api (configuration settings)
muos/doc/PLANNED.txt:46::
*lineedit* block lineedit when TX is stalled
muos/doc/PLANNED.txt:47::
*lineedit* implement txqueue ._R variants to print from lineedit buffer
muos/doc/PLANNED.txt:48::
*lineedit* history
muos/doc/PLANNED.txt:49::
*lineedit* completion
- tab for text
- pgup/pgdown for values
muos/doc/PLANNED.txt:52::
*uart* rxsync when line is idle for some frames
muos/doc/PLANNED.txt:56::
*driver* gpio
configure (in out pullup)
set, clear, toggle
sequencer
muos/doc/PLANNED.txt:62::
*driver* Buttons w/ debounce
muos/doc/PLANNED.txt:64::
*driver* Encoder
muos/doc/PLANNED.txt:66::
*driver* PWM
muos/doc/PLANNED.txt:67::
*driver* Flash
muos/doc/PLANNED.txt:68::
*driver* Fuses
muos/doc/PLANNED.txt:69::
*driver* Watchdog
muos/doc/PLANNED.txt:71::
*driver* USB
muos/doc/PLANNED.txt:72::
*driver* bangbus
muos/doc/PLANNED.txt:73::
*driver* onewire
muos/doc/PLANNED.txt:74::
*driver* DCF77
muos/doc/PLANNED.txt:75::
*driver* logfs
muos/doc/PLANNED.txt:76::
*driver* PID++
muos/doc/PLANNED.txt:77::
*driver* power interface depending on active components
muos/doc/PLANNED.txt:78::
*driver* Debug tools
muos/doc/PLANNED.txt:80::
Debugger
over serial
only few commands, most logic on host side
. peek
. debug() function
. debug interrupt
muos/doc/PLANNED.txt:88::
. F_OSC for oscillator clock
automatic prescale setting etc
muos/doc/PLANNED.txt:91::
random generator
byte queue
quality
sources
- poll
- interrupt
- push
quality limit low/high
muos/doc/PLANNED.txt:100::
Reorganization
Split config hierarchically
config.h
- how to depend on used config vars only?
muos/muos.h -> main header
muos/muos.c -> main program
muos/config.h -> configuration management
muos/$feature.h -> header for subsystem
muos/$feature.c -> portable subsystem interface implementaton
muos/hw/$vendor/$architecture/$feature.h|c hardware specific
Resource management at compiletime
The Stepper driver does not provide any means of moving multiple axis
exactly synchronized, but it is possible to arrange it that the axis
doing the shorter move wait for completion all other axis and then
continue with the operation. Together with matched max_speed for each
move, reasonable synchronized moves are possible.
==== States
Each stepper motor can be in one of the following states.
enum muos_stepper_state
MUOS_STEPPER_UNKNOWN;;
- no initialized yet
MUOS_STEPPER_OFF;;
- stepper not energized
- position unknown
MUOS_STEPPER_ON;;
- stepper energized
- position unknown, only raw movements
MUOS_STEPPER_HOLD;;
- stepper energized
- position unknown
- only relative movements
MUOS_STEPPER_ARMED;;
- stepper energized
- position known
- all kinds of movements allowed
MUOS_STEPPER_WAIT;;
- stepper energized
- position known
- done moving, waiting for sync/continuation
MUOS_STEPPER_RAW;;
- stepper moving
- position unknown
- no configuration necessary
- dangerous/invalid moves possible!
MUOS_STEPPER_SLOW_CAL;;
- stepper moving slower than slow_speed
- position unknown
- can be stopped instantly without loosing steps
MUOS_STEPPER_SLOW_REL;;
- stepper moving slower than slow_speed
- position known
- can be stopped instantly without loosing steps
MUOS_STEPPER_SLOW;;
- stepper moving slower than slow_speed
- position known
- can be stopped instantly without loosing steps
MUOS_STEPPER_SLOPE;;
- stepper moving, accelerating or decelerating on slope parameters
- position known
MUOS_STEPPER_FAST;;
- stepper moving faster than slow_speed
- position known
- must decelerate for stopping w/o loosing steps.
MUOS_STEPPER_STOPPING;;
- stepper moving faster than slow_speed, braking
- position known
- Controlled brake to a slow_speed, then stop
//TODO: muos/doc/stepper.txt:97::
document hardware indexing
// prescale prescaler setting
// cal_speed slow speed for calibration (zeroing)
// starting from min speed, that could be the speed where it can reverse
// direction w/o loosing steps with some safety marigin (25%)
// min_speed fastest speed which can be accelerated/decelerated from/to zero w/o
// loosing steps with some safety marigin (10%)
// max_speed maximum speed the motors run stable w/ loosing steps (after acceleration)
// accel acceleration factor
// decel deceleration factor
//
// conf_valid bitfield, which values are known good
// Cares only for stepper control/positioning
// End switches are not handled here but rather engage/disengage the stepper via api.
//
// But all movements are contrained within the configured limits.
//
// * constant speed api
// for slow movements (calibration), relative movements
//
// * position api
// absolute positioning which honors accel/decel and backlash and max speed settings
// Movement is defined by up to 3 phases
//
// ----
// Stepper accelerates, reached max_speed then decelerates
// _________
// / \
// / \
// / \
// ___/ \____
//
//
// Distance is too short to reach max_speed, after acceleration it directly decelerates
//
// /\
// _____/ \____
// ----
//
// *** Features to implement
//
// * Variable frequency generation
// * Direction signal
// * Motor arming
// * keep counter for position
// * callbacks on position
// * machine properties -> higher level
// * linear (steps per meter)
// * rotary (steps per rotation)
// * calibration values
// * max speed
// * min speed (we still need to reach a destionation even when we are close by)
// * acceleration
// linear and proportional part
// * decelerarion
// linear and proportional part
// * accel/decel are functions over the distance traveled
// * 2x backlash compensation
// * offset
// * speed
// * later: have a small queue for planning ahead that allows smooth
// movements without stopping
//
//
// **** Backlash compensation
//
// Two possible strategies:
//
// 1. speed=0
// Offset is used directly as distance to the current position.
// Can be inaccurate but is fast
//
// 2. speed!=0
// Overshoot by offset steps, then move back offset steps with 'speed'
// Slow but accurate
//
//
// *** API
//
// disclaimer: function and type names below are just for functional description
//
//
// **** Types
// typedef int32_t position; // steps from origin
// typedef int32_t offset; // relative steps
// typedef int32_t speed; // TBD -> translate directly into timer overflow
//
// **** Configuration structure
// defined in source, values are directly written there
//
// * axis limits
// * max speed change for constant speed movements
// * max speed
// * backlash compensation values
//
// **** State structure
// defined in source, values are directly written there
//
// * position
// * position valid flag
// * arming state
// * current speed -> derrived from frequency generator register
// * movement phase?
//
// **** Configuration commands
// zero_axis(offset)
// sets the axis zero to offset from the current position
//
// **** Arming
//
// Arming states:
//
// * OFF motors disenganged
// * HOLD position hold, but no movents allowed
// * ARMED movements allowed
//
// arm (state)
// state arm_get()
//
//
// **** Constant speed commands
// move_const(speed)
// move at constant seed w/o limit, negative speed for reverse
//
// move_rel(offset, speed)
// for slow adjustment/calibration movements
//
//
// **** Positioning commands
//
// time move_abs_estimate(position)
// calculate how long it will take to reach position
//
// move_abs(position, speed_factor)
// move to position, speed_factor to slow the movement
// speed_factor gets ignored on first version
//
// later one can make diagonal moves where both axis reach their
// position at roughly the same time by matching the faster one to
// the slower ones speed. This will reduce vibration and wear.
//
//
// **** callback/query
//
// set_callback_at (position, function)
// calls function when position is touched (w/o backlash compensation)
//
// set_callback (function)
// calls function absolute positioning is done (w/ backlash commpensation)
//
// position query_position ()
// position query_speed ()
===== API
.Switching steppers on and off, stopping
muos_error muos_stepper_enable_all (void)
void muos_stepper_disable_all (void)
void muos_stepper_stop (uint8_t hw)
void muos_stepper_stop_all (void)
'muos_stepper_enable_all ()' tries to switch on all steppers.
When successful muos_success is returned.
The steppers are energized and in state 'MUOS_STEPPER_ON' which
allows only raw movements.
.On error following values are returned:
+muos_warn_sched_depth+;;
+muos_error_stepper_state+;;
Steppers are externally disabled, uninitialized or otherwise unavailable.
'muos_stepper_disable_all ()' switches all steppers off.
No matter of the state, the steppers will be disabled afterwards.
States 'MUOS_STEPPER_UNKNOWN' will stay, otherwise the new state will be MUOS_STEPPER_OFF.
Turning the steppers off will loose their position and free the configuration lock.
'muos_stepper_stop (hw)' stops movement of a single stepper, but keeps it energized.
For steppers which were running faster than 'MUOS_STEPPER_SLOW' the position will
be invalidated and the state becomes 'MUOS_STEPPER_HOLD'. They need to be re-zeroed
after a stop. For Steppers running at 'MUOS_STEPPER_SLOW' or slower the position is
kept valid and the state becomes 'MUOS_STEPPER_ARMED'.
'muos_stepper_all_stop ()' is the same as 'muos_stepper_stop (hw)' but for all Steppers.
Stopping and turning steppers off will never fail nor return an error code.
Only the resulting state may differ depending on the initial state.
.Locking the config
muos_error muos_stepper_lock_all (void);
void muos_stepper_unlock_all (void)
All higher level stepper movements need to place a read lock on the configuration. For this
The steppers must be first turned into ON state with 'muos_stepper_enable_all()'. Then the
'muos_stepper_lock_all()' will put them in HOLD state. From there calibration movements and
zeroing becomes possible.
'muos_stepper_unlock_all()' stops all steppers, releases the configuration lock, and puts them
back into ON state.
.Axis zeroing
muos_error muos_stepper_set_zero (uint8_t hw, int32_t offset)
+hw+;;
Stepper to control.
+offset+;;
Offset to the current position.
Zeros the step counter to the given offset.
Only available when the stepper is in HOLD state. Zeroing puts a stepper
in ARMED state which allows fast movements.
.Raw Movements
muos_error muos_stepper_move_raw (uint8_t hw, int32_t offset, uint16_t speed, uint8_t prescale, muos_queue_function done)
+hw+;;
Stepper to control.
+offset+;;
Distance and direction to travel.
+speed+;;
+prescale+;;
+done+;;
Function to be scheduled when done
Repetitions.
Raw movement bypassing the normal logic and being functional even when there is no
configuration available yet.
The 'prescale' parameter has the greatest effect on speeds and should be used with
uttermost care. The actual values are hardware implementation dependent.
WARNING: wrong use of this functions can damage the hardware.
Raw movements are used to probe stepper configuration and find maximum speeds, acceleration
and deceleration factors.
muos_stepper_move_raw;;
Moves for 'offset' steps at 'speed', negative values reverse the direction.
.Calibration Movements
muos_error muos_stepper_move_cal (uint8_t hw, uint16_t speed, int32_t offset, muos_queue_function done)
+hw+;;
Stepper to control.
+offset+;;
Distance and direction to travel.
+speed+;;
+done+;;
Function to be scheduled when done
Calibration movement is needs basic machine configuration and is restricted to 'stepper_calspeed'.
This should be used to find end switch positions and zero the axis.
.Relative Movements
muos_error muos_stepper_move_rel (uint8_t hw, unt16_t speed, int32_t offset, muos_queue_function done)
+hw+;;
Stepper to control.
+offset+;;
Distance and direction to travel.
+speed+;;
+done+;;
Function to be scheduled when done
.Absolute Movements
muos_error muos_stepper_move_start (uint8_t hw, muos_queue_function slope_gen)
+hw+;;
Stepper to control.
+slope_gen+;;
Function to be scheduled to generate then next move
.Slope Calculations
struct muos_stepper_slope* muos_stepper_slope_get (uint8_t hw)
muos_error muos_stepper_slope_prep (uint8_t hw, struct muos_stepper_slope* slope, uint32_t distance, uint16_t speed_in, uint16_t max_speed, uint16_t speed_out, uint16_t out_steps)
void muos_stepper_slope_commit (uint8_t hw, int32_t position)
Fast movements require a slope for acceleration and deceleration to be prepared.
Such a slope starts at speed_in, accelerates to max_speed (when there is enough
distance to travel), keeps the max_speed for some distance, then decelerates to
speed_out and finally does some 'out_steps' at constant speed_out.
The stepper state itself keeps 2 such slopes internally, one as the active slope for the
current movement the other for preparing a slope in the background for the next move.
When a move completes it swaps buffers and executes the next move. While scheduling
a job to prepare the slope for the next movement.
Besides this 2 internal buffers it is also possible for a user to prepare slope for common
movements which can be copied in place instead recalculating them for every move.
'muos_stepper_slope_get()' returns a handle to the inactive slope buffer for the next move.
This buffer can then be initialized with 'muos_stepper_slope_prep()' or loaded with
an already prepared slope. When done, the buffer needs to be committed to tell the driver
that the slope is ready to use.
'muos_stepper_slope_get()' will return NULL if either the stepper is not in a state >= ARMED or did
not consume the previous slope yet. Zeroing/Arming invalidates the slope buffer and makes it
ready to load new slopes (Those error's wont happen with the slope callback).
When it is not possible to generate new slopes in a timely manner,the stepper driver will
call 'muos_stepper_stop_all()' and error out.
'muos_stepper_slope_prep()' initializes a slope buffer. This calculation is somewhat expensive.
Slope calculation is over a distance to travel, while there is a destination position stored
within the slope structure this gets only be set when the slope is commited or loaded.
+hw+;;
Stepper for which the slope is.
+slope+;;
The slope buffer to be initialized.
+distance+;;
The absolute amounts of steps to travel (direction doesn't matter).
+speed_in+;;
The starting speed, either less than 'stepper_slowspeed' or the speed the stepper is already
moving.
+max_speed+;;
Maximum speed for the fastest part of the slope
+speed_out+;;
The speed at the end of the slope. must be less than 'stepper_slowspeed' when the slope is not
followed by another movement in the same direction.
+out_steps+;;
Steps done at the end at 'speed_out'.
.Actions at Positions
enum muos_stepper_actions
Define actions to take when the stepper reaches a position. These are bit values
which can be or'ed together.
MUOS_STEPPER_ACTION_PERMANENT;;
Keep the registered action. execute it always again on that position.
MUOS_STEPPER_ACTION_2ND;;
Exceute the registered action when the stepper hits the position the second time.
Incompatible with MUOS_STEPPER_ACTION_PERMANENT. Used for backlash compensation.
Implementation detail: This flag gets deleted on first hit.
MUOS_STEPPER_ACTION_STOP;;
Immediately stop the stepper at the position.
MUOS_STEPPER_ACTION_SYNC;;
Together with STOP: stops the stepper and puts it in WAIT state
Without STOP: wakes all waiting steppers.
MUOS_STEPPER_HPQ_FRONT;;
Use the provided argument as function to push it to the front of the hpq. This gives the
highest possible priority.
MUOS_STEPPER_HPQ_BACK;;
Use the provided argument as function to push it to the back of the hpq.
muos_error muos_stepper_register_action (uint8_t hw, int32_t position, uint8_t action, uintptr_t arg)
muos_error muos_stepper_remove_action (uint8_t hw, int32_t position, uint8_t action, uintptr_t arg)
+hw+;;
Stepper to address.
+position+;;
Position which triggers the action.
+action+;;
Action flags or'ed together.
+arg+;;
Argument to the action, callback function for the hpq for example.
Register or remove and action to be done when the stepper hits a position.
Action must be at least one or more of the action flags above or'ed together.
Optionally a pointer to a function which gets pushed to the HPQ can be supplied.
Actions can only be registered or removed while the stepper is not moving.
Removing an action needs the exact same arguments as given registering it. Only one
instance gets removed even when the action was registered multiple times.
Returning +muos_success+ when everything worked well or one of the following errors:
+muos_error_nohw+;;
'hw' out of range.
+muos_error_stepper_state+;;
Tried to register/remove an action while the steppers are moving.
+muos_error_stepper_noslot+;;
'register_action':: no more slots free to register an action.
'remove_action':: no action found with the given parameters.
===== configuration
MUOS_STEPPER::
Enable the Stepper motor driver
MUOS_STEPPER_ACTION_SLOTS::
Number of slots for callback actions per stepper.
MUOS_STEPPER_COUNT::
How many stepper motors.
MUOS_STEPPER_DIR_HW::
Pin used for direction control
MUOS_STEPPER_DIR_NS::
min nanoseconds the direction signal must be ahead of starting pulsing
MUOS_STEPPER_ENABLEALL_INOUT_HW::
Pin used for global enabling/disabling the stepper motors.
Disable is pin LOW, either generated on the mcu or externally pulled down.
Enable is pin as input, externally pulled up.
MUOS_STEPPER_ENABLE_NS::
min nanoseconds the enable signal must be ahead of DIR
MUOS_STEPPER_HW::
Define the type and which hardware (timers) are bound to stepper motors.
MUOS_STEPPER_SLOPE_MULTIPLIER::
Factor to stretch the time for accel/decel.
MUOS_STEPPER_SLOPE_YIELDS::
Number of yields for slope-prep.
Needs MUOS_SCHED_DEPTH
MUOS_STEPPER_SLOPE_YIELDS_ITER::
When set then yield per iteration, otherwise only after
the loops.
Needs MUOS_SCHED_DEPTH
MUOS_STEPPER_STEP_NS::
min nanoseconds for the step pulse signals.
MUOS_STEPPER_UPTABLES::
Defines which outputs need to be driven for unipolar steppers motor with
IO pins directly controlling the windings.
(name, values..)
muos/doc/library.txt:35::
rename to fqueue
muos/doc/development.txt:13::
'master' branch will have no open FIXME, TODO
muos/doc/development.txt:14::
'devel' branch will have no open FIXME
muos/doc/MAIN.pdoc:32::
note about this documentation, define what terms are used
muos/doc/MAIN.pdoc:50::
example/howto
muos/doc/MAIN.pdoc:51::
project structure structure
muos/txqueue.c:39::
transaction support with commit/abort
muos/txqueue.c:53::
store index of the last tag, can be used to patch up the tag and append data
muos/txqueue.c:190::
64 bit support
muos/txqueue.c:654::
fix overprovisioning again MUOS_CBUFFER_RPOP (muos_txqueue);
muos/serial.c:125::
muos_serial_tx_avail (void)
muos/serial.c:214::
muos_serial_rx_avail (void)
muos/sm.c:152::
intptr_t* muos_queue_reserve(num, init) for reserving elements on a queue (hpq)
muos/muos.c:31::
stash muos_now_ away on recursive mainloops
muos/muos.c:32::
make ERRORFN optional
muos/muos.c:33::
ignoremask for ERRORFN for errors handled elsewhere
muos/muos.c:34::
instead disabling interrupts have a mutex and temp buffer for work queues
muos/muos.c:35::
finer locking in mainloop instead interrupt disable, per queue
muos/muos.c:63::
document and implement
muos/configstore.c:44::
on the fly
muos/configstore.c:113::
configstore_revert revert to an earlier config
muos/configstore.c:155::
later, journaled
muos/configstore.c:211::
later, journaled
muos/clpq.c:30::
realtime in interrupt function calls
muos/clpq.c:31::
sorting before normal functions
muos/clpq.c:32::
possibly add a small 'boost' (MUOS_CLOCK_LATENCY/2) for sorting them earlier (sorting only)
muos/lineedit.c:38::
strategy on input errors, desync?
muos/lineedit.c:39::
full line overflow, because lineedit buffer > txqueue, needs some strategy (blocking_io/atomic_io)
muos/lineedit.c:135::
history
muos/lineedit.c:154::
history
muos/lineedit.c:232::
completion
muos/lineedit.c:244::
completion
muos/lineedit.c:293::
completion
muos/io.c:34::
fixed point for integers and mille delimiters
muos/hw/atmel/avr/stepper.c:36::
dynamic prescaler change to increase range and resolution
muos/hw/atmel/avr/stepper.c:216::
see if steppers run smoother when using filtered speed
muos/hw/atmel/avr/stepper.c:433::
busy loop for very short delays, eventually we need muos function for this
muos/hw/atmel/avr/stepper.c:434::
only delay when direction was changed
muos/hw/atmel/avr/stepper.c:457::
abstract F_CPU for timers running on other clock sources
muos/hw/atmel/avr/eeprom.c:103::
batching?
muos/hw/atmel/avr/eeprom.c:138::
implement batching
muos/hw/atmel/avr/debug.c:26::
generic macros -> muos.h INPUT, OUTPUT, PULLUP, PULLDOWN, NOP
muos/hw/atmel/avr/serial.c:102::
sync when line is idle
muos/hw/atmel/avr/cppm.c:56::
compile time check that hwclock and icp match
muos/hw/atmel/avr/cppm.c:118::
pcint implementation
muos/io.h:29::
#define MUOS_IO .. if undefined then avr-libc stdio, check size requirement if it makes sense
muos/io.h:87::
OUTPUTFN(commit) /* */
muos/io.h:88::
OUTPUTFN(abort) /* */
muos/io.h:89::
OUTPUTFN(commitnl) /* */
muos/io.h:92::
OUTPUTFN(float_R) /* */
muos/io.h:93::
OUTPUTFN(ifmt, uint8_t, uint8_t) /* */
muos/io.h:94::
OUTPUTFN(ffmt, char) /* */
muos/io.h:95::
OUTPUTFN(pifmt, uint8_t, uint8_t) /* */
muos/io.h:96::
OUTPUTFN(pffmt, char) /* */
muos/io.h:97::
OUTPUTFN(ctrl, uint8_t, uint8_t, uint8_t) /* */
muos/clock.h:28::
dont inline clock functions
muos/clock.h:30::
macros compensating drift over long timespans; using rationals thereof
muos/clock.h:32::
make it possible to configure muos w/o a clock
muos/serial.h:30::
lowwater/highwater generic
muos/serial.h:105::
muos_cbuffer_index muos_serial_tx_avail (void);
muos/serial.h:177::
muos_cbuffer_index muos_serial_rx_avail (void);
muos/configstore.h:53::
interleaved/wraparound configstore
muos/stepper.h:36::
budget/cost for each movement
muos/stepper.h:53::
axis length/limit switches
muos/stepper.h:237::
api for braking to stop
muos/stepper.h:402::
use out_steps of slope, no extra state
muos/stepper.h:576::
MUOS_STEPPER_MERGE = (1<<7),
muos/stepper.h:622::
muos_stepper_remove_all_actions(hw)
muos/error.h:127::
do we need a muos_error_again in case a error was already set?
muos/sm.h:240::
state change callback
muos/muos.h:127::
add priority, which queues to schedule
muos/eeprom.h:37::
MUOS_EEPROM_READ_BLOCKING, // eeprom -> memory blocking read
muos/eeprom.h:47::
MUOS_EEPROM_REFRESH, // eeprom <- eeprom, read, erase, write to refresh content
muos/eeprom.h:51::
MUOS_EEPROM_ERASESECURE, // eeprom <- ^eeprom, eeprom <- 0x00, erase, secure erase (equivalent wear)
muos/eeprom.h:56::
MUOS_EEPROM_CRC8, // crc8 over the given range
muos/eeprom.h:322::
query current position (ram? eeprom?)
muos/hw/atmel/avr/attiny85.h:69::
proper shutdown, needs user definition and/or weak symbol or hook
muos/hw/atmel/avr/avr.h:49::
cleanup macros when to use arguments, when tuple
muos/hw/atmel/avr/avr.h:51::
HW() for all hardware specific stuff (s. Makefile)
muos/hw/atmel/avr/avr.h:53::
generic macros -> muos.h INPUT, OUTPUT, PULLUP, PULLDOWN, NOP, ANALOG
muos/hw/atmel/avr/avr.h:59::
also GPIO_SET for input states (config + set)
Makefile:21::
branch a 'tests' from example with permanent test code/suite +
_tidy up the example code_ +
Christian Thäter Mon Nov 19 14:25:00 2018 +
+82c6b3749fa966593e04423a0bb6ddef5c439032+
muos/muos.mk:104::
make a complete header? not including drivers from muos.c
muos/prg_micronucleus.mk:21::
generate images in another target specific makefile?