diff --git a/firmware/axl-stepper/src/axl b/firmware/axl-stepper/src/axl index 0aa41982be0a8ec1189ec6e4517e4f1c2b6774cb..09e3e90667034d09f34bbe4041b3f395461fad8a 160000 --- a/firmware/axl-stepper/src/axl +++ b/firmware/axl-stepper/src/axl @@ -1 +1 @@ -Subproject commit 0aa41982be0a8ec1189ec6e4517e4f1c2b6774cb +Subproject commit 09e3e90667034d09f34bbe4041b3f395461fad8a diff --git a/firmware/axl-stepper/src/main.cpp b/firmware/axl-stepper/src/main.cpp index 49ebd11a81f8d74a8ebfe3aaf9b9e99ddd7077ce..6628e5b52a66e647d673428e153254e74c1c82f4 100644 --- a/firmware/axl-stepper/src/main.cpp +++ b/firmware/axl-stepper/src/main.cpp @@ -21,40 +21,39 @@ VBus_UCBusDrop vbUCBusDrop(&osap, "ucBusDrop"); // -------------------------------------------------------- 2: States EP_ONDATA_RESPONSES onStateData(uint8_t* data, uint16_t len){ + // check for partner-config badness, + if(len != AXL_NUM_DOF * 4 + 2){ OSAP::error("state req has bad DOF count"); return EP_ONDATA_REJECT; } // we have accel, rate, posn data, dofs targ; uint16_t rptr = 0; - uint8_t mode = data[rptr]; - if(mode == AXL_MODE_ACCEL){ - // read from 1st block of ndof - /* - rptr = 1; - for(uint8_t a = 0; a < AXL_NUM_DOF; a ++){ - targ.axis[a] = ts_readFloat32(data, &rptr); - } - axl_setAccelTarget(targ); - */ - } else if (mode == AXL_MODE_VELOCITY){ - //axl_setVelocityTarget(rate.f); - rptr = 1 + AXL_NUM_DOF * 4 * 1; - for(uint8_t a = 0; a < AXL_NUM_DOF; a ++){ - targ.axis[a] = ts_readFloat32(data, &rptr); - } - axl_setVelocityTarget(targ); - } else if (mode == AXL_MODE_POSITION){ - rptr = 1 + AXL_NUM_DOF * 4 * 2; - for(uint8_t a = 0; a < AXL_NUM_DOF; a ++){ - targ.axis[a] = ts_readFloat32(data, &rptr); + uint8_t mode = data[rptr ++]; + uint8_t set = data[rptr ++]; + for(uint8_t a = 0; a < AXL_NUM_DOF; a ++){ + targ.axis[a] = ts_readFloat32(data, &rptr); + } + // set or target? + if(set){ + if(mode == AXL_MODE_POSITION){ + OSAP::error("axl set-pos... havne't written it yet"); + } else { + OSAP::error("we can only 'set' position, others are targs"); } - axl_setPositionTarget(targ); } else { - // no / bad mode set, noop - OSAP::error("bad set-states request to axl, no / bad mode info", MEDIUM); + switch(mode){ + case AXL_MODE_ACCEL: + axl_setAccelTarget(targ); + break; + case AXL_MODE_VELOCITY: + axl_setVelocityTarget(targ); + break; + case AXL_MODE_POSITION: + axl_setPositionTarget(targ); + break; + default: + OSAP::error("AXL state targ has bad / unrecognized mode"); + break; + } } - // chunk_float32 acc = { .bytes = { data[0], data[1], data[2], data[3] } }; - // chunk_float32 rate = { .bytes = { data[4], data[5], data[6], data[7] } }; - // chunk_float32 posn = { .bytes = { data[8], data[9], data[10], data[11] } }; - // we 'reject' this i.e. we don't write these data into the endpoint, // since we routinely update it w/ actual states (not requests) return EP_ONDATA_REJECT; } @@ -81,7 +80,16 @@ void updateStatesEP(void){ statesEP.write(stash, numBytes); } -// -------------------------------------------------------- 3: Moves -> Queue +// -------------------------------------------------------- 3: Halt + +EP_ONDATA_RESPONSES onHaltData(uint8_t* data, uint16_t len){ + axl_halt(); + return EP_ONDATA_REJECT; +} + +Endpoint haltEP(&osap, "halt", onHaltData); + +// -------------------------------------------------------- 4: Moves -> Queue EP_ONDATA_RESPONSES onMoveData(uint8_t* data, uint16_t len){ // this (and states-input) could watch <len> to make sure that @@ -102,7 +110,7 @@ EP_ONDATA_RESPONSES onMoveData(uint8_t* data, uint16_t len){ Endpoint moveEP(&osap, "moves", onMoveData); -// -------------------------------------------------------- 4: AXL Settings +// -------------------------------------------------------- 5: AXL Settings EP_ONDATA_RESPONSES onAXLSettingsData(uint8_t* data, uint16_t len){ // jd, then pairs of accel & vel limits, @@ -123,7 +131,7 @@ EP_ONDATA_RESPONSES onAXLSettingsData(uint8_t* data, uint16_t len){ Endpoint axlSettingsEP(&osap, "axlSettings", onAXLSettingsData); -// -------------------------------------------------------- 5: Motor Settings +// -------------------------------------------------------- 6: Motor Settings uint8_t axisPick = 0; boolean invert = false;