3232#include "py/runtime.h"
3333
3434//| class Message:
35- //| def __init__(self, id: int=0, data: Optional[bytes] = None, *, size: Optional[int] = None, rtr: bool = False):
35+ //| def __init__(self, id: int=0, data: Optional[bytes] = None, *, size: Optional[int] = None, rtr: bool = False, extended: bool = False ):
3636//| """Construct a Message to send on a CAN bus
3737//|
3838//| :param int id: The numeric ID of the message
3939//| :param bytes data: The content of the message
4040//| :param int size: The amount of data requested, for an rtr
4141//| :param bool rtr: True if the message represents an rtr (Remote Transmission Request)
42+ //| :param bool extended: True if the message has an extended identifier, False if it has a standard identifier
4243//|
4344//| In CAN, messages can have a size from 0 to 8 bytes.
4445//|
4748//| ...
4849//|
4950STATIC mp_obj_t canio_message_make_new (const mp_obj_type_t * type , size_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
50- enum { ARG_id , ARG_data , ARG_size , ARG_rtr , NUM_ARGS };
51+ enum { ARG_id , ARG_data , ARG_size , ARG_rtr , ARG_extended , NUM_ARGS };
5152 static const mp_arg_t allowed_args [] = {
5253 { MP_QSTR_id , MP_ARG_INT , {.u_obj = 0 } },
5354 { MP_QSTR_data , MP_ARG_OBJ , {.u_obj = 0 } },
5455 { MP_QSTR_size , MP_ARG_INT , {.u_int = -1 } },
5556 { MP_QSTR_rtr , MP_ARG_BOOL , {.u_bool = false} },
57+ { MP_QSTR_extended , MP_ARG_BOOL , {.u_bool = false} },
5658 };
5759 mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
5860 MP_STATIC_ASSERT ( MP_ARRAY_SIZE (allowed_args ) == NUM_ARGS );
5961
6062 mp_arg_parse_all (n_args , pos_args , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
6163
6264 bool rtr = args [ARG_rtr ].u_bool ;
65+ bool extended = args [ARG_extended ].u_bool ;
6366 size_t size = (size_t )args [ARG_size ].u_int ;
6467 bool specified_size = (size != (size_t )-1 );
6568 bool specified_data = (args [ARG_data ].u_obj != NULL );
@@ -85,7 +88,7 @@ STATIC mp_obj_t canio_message_make_new(const mp_obj_type_t *type, size_t n_args,
8588
8689 canio_message_obj_t * self = m_new_obj (canio_message_obj_t );
8790 self -> base .type = & canio_message_type ;
88- common_hal_canio_message_construct (self , args [ARG_id ].u_int , data .buf , data .len , rtr );
91+ common_hal_canio_message_construct (self , args [ARG_id ].u_int , data .buf , data .len , rtr , extended );
8992 return self ;
9093}
9194
@@ -174,6 +177,31 @@ STATIC const mp_obj_property_t canio_message_size_obj = {
174177 (mp_obj_t )& mp_const_none_obj },
175178};
176179
180+ //| extended: bool
181+ //| """True if the message represents a remote transmission request (RTR)"""
182+ //|
183+ STATIC mp_obj_t canio_message_extended_get (const mp_obj_t self_in ) {
184+ canio_message_obj_t * self = self_in ;
185+ return mp_obj_new_bool (common_hal_canio_message_extended_get (self ));
186+ }
187+ MP_DEFINE_CONST_FUN_OBJ_1 (canio_message_extended_get_obj , canio_message_extended_get );
188+
189+ STATIC mp_obj_t canio_message_extended_set (const mp_obj_t self_in , const mp_obj_t extended ) {
190+ canio_message_obj_t * self = self_in ;
191+ common_hal_canio_message_size_set (self , mp_obj_is_true (extended ));
192+ return mp_const_none ;
193+ }
194+ MP_DEFINE_CONST_FUN_OBJ_2 (canio_message_extended_set_obj , canio_message_extended_set );
195+
196+
197+ STATIC const mp_obj_property_t canio_message_extended_obj = {
198+ .base .type = & mp_type_property ,
199+ .proxy = {(mp_obj_t )& canio_message_extended_get_obj ,
200+ (mp_obj_t )& canio_message_extended_set_obj ,
201+ (mp_obj_t )& mp_const_none_obj },
202+ };
203+
204+
177205//| rtr: bool
178206//| """True if the message represents a remote transmission request (RTR)"""
179207//|
@@ -204,6 +232,7 @@ STATIC const mp_rom_map_elem_t canio_message_locals_dict_table[] = {
204232 { MP_ROM_QSTR (MP_QSTR_data ), MP_ROM_PTR (& canio_message_data_obj ) },
205233 { MP_ROM_QSTR (MP_QSTR_size ), MP_ROM_PTR (& canio_message_size_obj ) },
206234 { MP_ROM_QSTR (MP_QSTR_rtr ), MP_ROM_PTR (& canio_message_rtr_obj ) },
235+ { MP_ROM_QSTR (MP_QSTR_extended ), MP_ROM_PTR (& canio_message_extended_obj ) },
207236};
208237STATIC MP_DEFINE_CONST_DICT (canio_message_locals_dict , canio_message_locals_dict_table );
209238
0 commit comments