Skip to content

Commit

Permalink
Small changes to the pulse train descriptor format.
Browse files Browse the repository at this point in the history
  • Loading branch information
Onwrikbaar committed Jan 6, 2025
1 parent 7f8c97a commit 874a370
Show file tree
Hide file tree
Showing 13 changed files with 1,665 additions and 1,642 deletions.
3,075 changes: 1,546 additions & 1,529 deletions firmware/build/neodk_g071.hex

Large diffs are not rendered by default.

9 changes: 8 additions & 1 deletion firmware/inc/burst.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,14 @@ typedef struct {
uint8_t phase;
uint8_t pace_ms;
uint16_t nr_of_pulses;
uint8_t pulse_width_micros;
uint16_t pulse_width_¼_µs;
uint8_t rfu;
} Burst;

typedef struct {
int16_t delta_width_¼_µs; // [0.25 µs]. Changes the duration of a pulse.
int8_t delta_pace_µs; // [µs]. Modifies the time between pulses.
int8_t delta_amplitude; // In units of 1/255 of the set maximum.
} Deltas;

#endif
10 changes: 5 additions & 5 deletions firmware/inc/pulse_train.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,17 @@
typedef struct _PulseTrain PulseTrain; // Opaque type.
typedef uint8_t pulse_train_size_t;

// Class methods.
// Class method.
pulse_train_size_t PulseTrain_size();
PulseTrain *PulseTrain_new(void *addr, pulse_train_size_t);
PulseTrain *PulseTrain_copy(void *addr, pulse_train_size_t, PulseTrain const *original);

// Instance methods.
PulseTrain *PulseTrain_init(PulseTrain *, uint8_t electrode_set[2], uint16_t nr_of_pulses);
PulseTrain *PulseTrain_setStartTimeMicros(PulseTrain *, uint32_t start_time_micros);
PulseTrain *PulseTrain_init(PulseTrain *, uint8_t seq_nr, uint32_t timestamp, Burst const *burst);
void PulseTrain_clearDeltas(PulseTrain *);
void PulseTrain_setDeltas(PulseTrain *, int16_t delta_width_¼_µs, int8_t delta_amplitude, int8_t delta_pace_µs);
uint16_t PulseTrain_amplitude(PulseTrain const *);
uint8_t PulseTrain_pulseWidth(PulseTrain const *);
Burst const *PulseTrain_getBurst(PulseTrain const *, Burst *);
void PulseTrain_getDeltas(PulseTrain const *, Deltas *);
void PulseTrain_print(PulseTrain const *);

#endif
1 change: 1 addition & 0 deletions firmware/inc/sequencer.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ uint8_t Sequencer_getIntensityPercentage(Sequencer const *);
void Sequencer_notifyIntensity(Sequencer const *);
void Sequencer_notifyPattern(Sequencer const *);
void Sequencer_notifyPlayState(Sequencer const *);
void Sequencer_notifyPtQueue(Sequencer const *);

void Sequencer_stop(Sequencer *);
void Sequencer_delete(Sequencer *);
Expand Down
3 changes: 2 additions & 1 deletion firmware/maolib/inc/convenience.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
*
* Created on: 14 Oct 2020
* Author: mark
* Copyright 2020..2024 Neostim™
* Copyright 2020..2025 Neostim™
*/

#ifndef INC_CONVENIENCE_H_
Expand Down Expand Up @@ -35,6 +35,7 @@ extern "C" {

Selector *Selector_init(Selector *, Action, void *target);
void invokeSelector(Selector *, uint32_t);
int dumpBuffer(const char *prefix, const uint8_t *bbuf, uint8_t nb);
struct timespec *tsIncrementNanos(struct timespec *, int64_t nanoseconds);
char const *bytesToHexString(uint8_t const *pb, uint16_t nb);

Expand Down
2 changes: 1 addition & 1 deletion firmware/maolib/inc/net_frame.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
*
* Created on: 29 Feb 2020
* Author: mark
* Copyright 2020..2024 Neostim™
* Copyright 2020..2025 Neostim™
*/

#include <stdbool.h>
Expand Down
Binary file modified firmware/maolib/libmao.a
Binary file not shown.
12 changes: 8 additions & 4 deletions firmware/src/attributes.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,16 +68,20 @@ SubscriptionId Attribute_awaitRead(AttributeId ai, AttrNotifier notify, void *ta
SubscriptionId Attribute_subscribe(AttributeId ai, AttrNotifier notify, void *target)
{
// BSP_logf("%s for id=%hu\n", __func__, ai);
return setSubForId(ai, notify, target, ~0);
return setSubForId(ai, notify, target, 0);
}


void Attribute_changed(AttributeId ai, ElementEncoding enc, uint8_t const *data, uint16_t size)
{
// BSP_logf("%s(%hu)\n", __func__, ai);
Subscription *sub = findSubForId(ai);
if (sub != NULL && sub->times != 0) {
sub->notify(sub->target, ai, enc, data, size);
if (sub == NULL) return; // No subscription for this attribute.

sub->notify(sub->target, ai, enc, data, size);
if (sub->times == 1) { // Subscription expired?
BSP_logf("Cancelling subscription for id=%hu\n", sub->ai);
*sub = subscriptions[--nr_of_subs]; // Cancel it.
} else if (sub->times != 0) {
sub->times -= 1;
}
}
10 changes: 5 additions & 5 deletions firmware/src/bsp_stm32g071.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@


// #define ADC_TIMER_FREQ_Hz 100000UL
#define PULSE_TIMER_FREQ_Hz 1000000UL
#define PULSE_TIMER_FREQ_Hz 4000000UL
#define APP_TIMER_FREQ_Hz 4000000UL
#define TICKS_PER_MICROSECOND (APP_TIMER_FREQ_Hz / 1000000UL)

Expand Down Expand Up @@ -638,7 +638,7 @@ void BSP_init()

char const *BSP_firmwareVersion()
{
return "v0.43-beta";
return "v0.44-beta";
}


Expand Down Expand Up @@ -828,18 +828,18 @@ uint16_t BSP_setPrimaryVoltage_mV(uint16_t V_prim_mV)
bool BSP_startBurst(Burst const *burst)
{
M_ASSERT(burst->pace_ms >= 5); // Repetition rate <= 200 Hz.
M_ASSERT(burst->pulse_width_micros != 0);
M_ASSERT(burst->pulse_width_¼_µs != 0);
M_ASSERT(burst->nr_of_pulses != 0);

pulse_timer->ARR = pulsePaceMillisecondsToTicks(burst->pace_ms) - 1;
pulse_timer->RCR = burst->nr_of_pulses - 1;
pulse_timer->CNT = 0;
pulse_timer->SR &= ~(TIM_SR_CC1IF | TIM_SR_CC2IF);
if (burst->phase == 0) {
pulse_timer->CCR1 = burst->pulse_width_micros - 1;
pulse_timer->CCR1 = burst->pulse_width_¼_µs - 1;
pulse_timer->DIER |= TIM_DIER_CC1IE;
} else if (burst->phase == 1) {
pulse_timer->CCR2 = burst->pulse_width_micros - 1;
pulse_timer->CCR2 = burst->pulse_width_¼_µs - 1;
pulse_timer->DIER |= TIM_DIER_CC2IE;
} else return false; // We only have one output stage.

Expand Down
39 changes: 21 additions & 18 deletions firmware/src/controller.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,12 @@ static void initResponsePacket(PacketHeader *ph)
}


static void initAttributeAction(AttributeAction *rsp_aa, AttributeAction const *req_aa)
static void initAttributeAction(AttributeAction *aa, uint16_t transaction_id, uint8_t opcode, uint16_t attribute_id)
{
*rsp_aa = *req_aa; // Copy the request.
rsp_aa->opcode = OC_REPORT_DATA; // Only change the opcode.
aa->transaction_id = transaction_id;
aa->opcode = opcode;
aa->reserved = 0;
aa->attribute_id = attribute_id;
}


Expand All @@ -79,7 +81,7 @@ static void readPatternNames(Controller *me, AttributeAction const *aa)
// TODO Ensure packet_size does not exceed max frame payload size.
uint8_t packet[packet_size];
initResponsePacket((PacketHeader *)packet);
initAttributeAction((AttributeAction *)(packet + sizeof(PacketHeader)), aa);
initAttributeAction((AttributeAction *)(packet + sizeof(PacketHeader)), aa->transaction_id, OC_REPORT_DATA, aa->attribute_id);
nbtw += Matter_encodeStringArray(packet + nbtw, pattern_names, nr_of_patterns);
DataLink_sendDatagram(me->datalink, packet, nbtw);
}
Expand All @@ -91,27 +93,26 @@ static void attributeChanged(Controller *me, AttributeId ai, ElementEncoding enc
uint16_t nbtw = sizeof(PacketHeader) + sizeof(AttributeAction);
uint8_t packet[nbtw + Matter_encodedDataLength(enc, data_size)];
initResponsePacket((PacketHeader *)packet);
AttributeAction *aa = (AttributeAction *)(packet + sizeof(PacketHeader));
aa->transaction_id = 0;
aa->opcode = OC_REPORT_DATA;
aa->reserved = 0;
aa->attribute_id = ai;
// TODO Add subscription Id if applicable?
initAttributeAction((AttributeAction *)(packet + sizeof(PacketHeader)), 0, OC_REPORT_DATA, ai);
nbtw += Matter_encode(packet + nbtw, enc, data, data_size);
DataLink_sendDatagram(me->datalink, packet, nbtw);
}


static void logTransaction(AttributeAction const *aa, char const *action_str)
static void sendStatusResponse(Controller *me, AttributeAction const *aa, StatusCode sc)
{
BSP_logf("Transaction %hu: %s attribute %hu\n", aa->transaction_id, action_str, aa->attribute_id);
if (sc != SC_SUCCESS) BSP_logf("%s %hu for attr id=%hu\n", __func__, sc, aa->attribute_id);
uint16_t nbtw = sizeof(PacketHeader) + sizeof(AttributeAction);
uint8_t packet[nbtw];
initResponsePacket((PacketHeader *)packet);
initAttributeAction((AttributeAction *)(packet + sizeof(PacketHeader)), aa->transaction_id, sc, aa->attribute_id);
DataLink_sendDatagram(me->datalink, packet, nbtw);
}


static void sendStatusResponse(Controller *me, AttributeAction const *aa, StatusCode sc)
static void logTransaction(AttributeAction const *aa, char const *action_str)
{
BSP_logf("%s %hu for attr id=%hu\n", __func__, sc, aa->attribute_id);
// TODO Implement.
BSP_logf("Transaction %hu: %s attribute %hu\n", aa->transaction_id, action_str, aa->attribute_id);
}


Expand Down Expand Up @@ -148,12 +149,14 @@ static void handleReadRequest(Controller *me, AttributeAction const *aa)
case AI_BOX_NAME:
attributeChanged(me, aa->attribute_id, EE_UTF8_1LEN, (uint8_t const *)me->box_name, strlen(me->box_name));
break;
case AI_PT_DESCRIPTOR_QUEUE:
Sequencer_notifyPtQueue(me->sequencer);
break;
default:
BSP_logf("%s: unknown attribute id=%hu\n", __func__, aa->attribute_id);
sendStatusResponse(me, aa, SC_UNSUPPORTED_ATTRIBUTE);
return;
}
sendStatusResponse(me, aa, SC_SUCCESS);
}


Expand Down Expand Up @@ -267,7 +270,7 @@ static void *stateNop(Controller *me, AOEvent const *evt)
}


static void *stateIdle(Controller *me, AOEvent const *evt)
static void *stateReady(Controller *me, AOEvent const *evt)
{
switch (AOEvent_type(evt))
{
Expand Down Expand Up @@ -328,7 +331,7 @@ void Controller_init(Controller *me, Sequencer *sequencer, DataLink *datalink)

void Controller_start(Controller *me)
{
me->state = &stateIdle;
me->state = &stateReady;
me->state(me, AOEvent_newEntryEvent());
DataLink_open(me->datalink, &me->event_queue);
DataLink_awaitSync(me->datalink);
Expand Down
2 changes: 1 addition & 1 deletion firmware/src/pattern_iter.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ bool PatternIterator_getNextBurst(PatternIterator *me, Burst *burst)
uint8_t const *elcon = getNextPattern(me, &burst->nr_of_pulses);
burst->elcon[0] = elcon[0];
burst->elcon[1] = elcon[1];
burst->pulse_width_micros = me->pulse_width_micros;
burst->pulse_width_¼_µs = me->pulse_width_micros * 4;
burst->pace_ms = me->pattern_descr->pace_ms;// Yields 1000/pace_ms pulses per second.
return true;
}
Loading

0 comments on commit 874a370

Please sign in to comment.