Skip to content

Commit f4e36fc

Browse files
committed
CAN: Use mp_obj_t insteaed of canio_message_obj_t, get rid of rtr field
1 parent 1349373 commit f4e36fc

File tree

8 files changed

+18
-24
lines changed

8 files changed

+18
-24
lines changed

ports/atmel-samd/common-hal/canio/CAN.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -328,16 +328,18 @@ static void maybe_auto_restart(canio_can_obj_t *self) {
328328
}
329329
}
330330

331-
void common_hal_canio_can_send(canio_can_obj_t *self, canio_message_obj_t *message)
331+
void common_hal_canio_can_send(canio_can_obj_t *self, mp_obj_t message_in)
332332
{
333333
maybe_auto_restart(self);
334334

335+
canio_message_obj_t *message = message_in;;
335336
// We have just one dedicated TX buffer, use it!
336337
canio_can_tx_buffer_t *ent = &self->state->tx_buffer[0];
337338

339+
bool rtr = message->base.type == &canio_remote_transmission_request_type;
338340
ent->txb0.bit.ESI = false;
339341
ent->txb0.bit.XTD = message->extended;
340-
ent->txb0.bit.RTR = message->rtr;
342+
ent->txb0.bit.RTR = rtr;
341343
if (message->extended) {
342344
ent->txb0.bit.ID = message->id;
343345
} else {
@@ -350,7 +352,7 @@ void common_hal_canio_can_send(canio_can_obj_t *self, canio_message_obj_t *messa
350352
ent->txb1.bit.BRS = 0; // No bit rate switching
351353
ent->txb1.bit.DLC = message->size;
352354

353-
if (!message->rtr) {
355+
if (!rtr) {
354356
memcpy(ent->data, message->data, message->size);
355357
}
356358

ports/atmel-samd/common-hal/canio/Listener.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -349,30 +349,32 @@ int common_hal_canio_listener_in_waiting(canio_listener_obj_t *self) {
349349
return self->hw->RXFS.bit.F0FL;
350350
}
351351

352-
bool common_hal_canio_listener_receiveinto(canio_listener_obj_t *self, canio_message_obj_t *message) {
352+
mp_obj_t common_hal_canio_listener_receive(canio_listener_obj_t *self) {
353353
if (!common_hal_canio_listener_in_waiting(self)) {
354354
uint64_t deadline = supervisor_ticks_ms64() + self->timeout_ms;
355355
do {
356356
if (supervisor_ticks_ms64() > deadline) {
357-
return false;
357+
return NULL;
358358
}
359359
} while (!common_hal_canio_listener_in_waiting(self));
360360
}
361361
int index = self->hw->RXFS.bit.F0GI;
362362
canio_can_rx_fifo_t *hw_message = &self->fifo[index];
363+
bool rtr = hw_message->rxf0.bit.RTR;
364+
canio_message_obj_t *message = m_new_obj(canio_message_obj_t);
365+
message->base.type = rtr ? &canio_remote_transmission_request_type : &canio_message_type;
363366
message->extended = hw_message->rxf0.bit.XTD;
364367
if (message->extended) {
365368
message->id = hw_message->rxf0.bit.ID;
366369
} else {
367370
message->id = hw_message->rxf0.bit.ID >> 18; // short ids are left-justified
368371
}
369-
message->rtr = hw_message->rxf0.bit.RTR;
370372
message->size = hw_message->rxf1.bit.DLC;
371-
if (!message->rtr) {
373+
if (!rtr) {
372374
memcpy(message->data, hw_message->data, message->size);
373375
}
374376
self->hw->RXFA.bit.F0AI = index;
375-
return true;
377+
return message;
376378
}
377379

378380
void common_hal_canio_listener_deinit(canio_listener_obj_t *self) {

shared-bindings/canio/CAN.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,5 @@ void common_hal_canio_can_auto_restart_set(canio_can_obj_t *self, bool auto_rest
5151
void common_hal_canio_can_check_for_deinit(canio_can_obj_t *self);
5252
void common_hal_canio_can_deinit(canio_can_obj_t *self);
5353
void common_hal_canio_can_restart(canio_can_obj_t *self);
54-
void common_hal_canio_can_send(canio_can_obj_t *self, canio_message_obj_t *message);
54+
void common_hal_canio_can_send(canio_can_obj_t *self, mp_obj_t message);
5555
void common_hal_canio_reset(void);

shared-bindings/canio/Listener.c

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,11 @@ STATIC mp_obj_t canio_listener_receive(mp_obj_t self_in) {
4949
canio_listener_obj_t *self = MP_OBJ_TO_PTR(self_in);
5050
common_hal_canio_listener_check_for_deinit(self);
5151

52-
canio_message_obj_t *message = m_new_obj(canio_message_obj_t);
53-
54-
if (common_hal_canio_listener_receiveinto(self, message)) {
55-
if (message->rtr) {
56-
message->base.type = &canio_remote_transmission_request_type;
57-
} else {
58-
message->base.type = &canio_message_type;
59-
}
52+
mp_obj_t message = common_hal_canio_listener_receive(self);
53+
// note: receive fills out the type field of the message
54+
55+
if (message) {
6056
return message;
61-
} else {
62-
m_free(message); // message did not escape into vm
6357
}
6458
return mp_const_none;
6559
}

shared-bindings/canio/Listener.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ typedef struct canio_listener_obj canio_listener_obj_t;
3737
void common_hal_canio_listener_construct(canio_listener_obj_t *self, canio_can_obj_t *can, size_t nmatch, canio_match_obj_t **matches, float timeout);
3838
void common_hal_canio_listener_check_for_deinit(canio_listener_obj_t *self);
3939
void common_hal_canio_listener_deinit(canio_listener_obj_t *self);
40-
bool common_hal_canio_listener_receiveinto(canio_listener_obj_t *self, canio_message_obj_t *message);
40+
mp_obj_t common_hal_canio_listener_receive(canio_listener_obj_t *self);
4141
int common_hal_canio_listener_in_waiting(canio_listener_obj_t *self);
4242
float common_hal_canio_listener_get_timeout(canio_listener_obj_t *self);
4343
void common_hal_canio_listener_set_timeout(canio_listener_obj_t *self, float timeout);

shared-module/canio/Message.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ void common_hal_canio_message_construct(canio_message_obj_t *self, int id, void
3232
{
3333
self->id = id;
3434
self->size = size;
35-
self->rtr = !data;
3635
self->extended = extended;
3736
if (data) {
3837
memcpy(self->data, data, size);
@@ -57,7 +56,6 @@ const void *common_hal_canio_message_get_data(const canio_message_obj_t *self)
5756

5857
const void common_hal_canio_message_set_data(canio_message_obj_t *self, const void *data, size_t size)
5958
{
60-
self->rtr = false;
6159
self->size = size;
6260
memcpy(self->data, data, size);
6361
}

shared-module/canio/Message.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,5 @@ typedef struct {
3333
int id;
3434
uint8_t data[8];
3535
size_t size:4;
36-
bool rtr:1;
3736
bool extended:1;
3837
} canio_message_obj_t;

shared-module/canio/RemoteTransmissionRequest.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ void common_hal_canio_remote_transmission_request_construct(canio_remote_transmi
3333
{
3434
self->id = id;
3535
self->size = size;
36-
self->rtr = true;
3736
self->extended = extended;
3837
}
3938

0 commit comments

Comments
 (0)