@@ -37,21 +37,22 @@ void led_init(void) {
3737
3838 /* Turn off LEDs and initialize */
3939 for (int led = 0 ; led < NUM_LEDS ; led ++ ) {
40- PYB_LED_OFF (gLed [led ]);
40+ PYB_LED_OFF (gLed [led ]);
4141 GPIO_InitStructure .Pin = gLed [led ]-> pin_mask ;
4242 HAL_GPIO_Init (gLed [led ]-> gpio , & GPIO_InitStructure );
4343 }
4444
45+ #if defined(PYBOARD4 ) || defined(PYBv10 )
4546 // LED4 (blue) is on PB4 which is TIM3_CH1
4647 // we use PWM on this channel to fade the LED
4748
4849 // GPIO configuration
49- GPIO_InitStructure .Pin = GPIO_PIN_4 ;
50+ GPIO_InitStructure .Pin = PYB_LED4 . pin_mask ;
5051 GPIO_InitStructure .Mode = GPIO_MODE_AF_PP ;
5152 GPIO_InitStructure .Speed = GPIO_SPEED_FAST ;
5253 GPIO_InitStructure .Pull = GPIO_NOPULL ;
5354 GPIO_InitStructure .Alternate = GPIO_AF2_TIM3 ;
54- HAL_GPIO_Init (GPIOB , & GPIO_InitStructure );
55+ HAL_GPIO_Init (PYB_LED4 . gpio , & GPIO_InitStructure );
5556
5657 // PWM mode configuration
5758 TIM_OC_InitTypeDef oc_init ;
@@ -63,13 +64,14 @@ void led_init(void) {
6364
6465 // start PWM
6566 TIM_CCxChannelCmd (TIM3 , TIM_CHANNEL_1 , TIM_CCx_ENABLE );
66- //HAL_TIM_PWM_Start(&USBD_CDC_TIM3_Handle, TIM_CHANNEL_1);
67+ #endif
6768}
6869
6970void led_state (pyb_led_t led , int state ) {
7071 if (led < 1 || led > NUM_LEDS ) {
7172 return ;
7273 }
74+ #if defined(PYBOARD4 ) || defined(PYBv10 )
7375 if (led == 4 ) {
7476 if (state ) {
7577 TIM3 -> CCR1 = 0xffff ;
@@ -78,8 +80,9 @@ void led_state(pyb_led_t led, int state) {
7880 }
7981 return ;
8082 }
83+ #endif
8184 const pin_obj_t * led_pin = gLed [led - 1 ];
82- //printf("led_state(%d,%d)\n", led, state);
85+ //printf("led_state(%d,%d)\n", led, state);
8386 if (state == 0 ) {
8487 // turn LED off
8588 PYB_LED_OFF (led_pin );
@@ -93,6 +96,18 @@ void led_toggle(pyb_led_t led) {
9396 if (led < 1 || led > NUM_LEDS ) {
9497 return ;
9598 }
99+
100+ #if defined(PYBOARD4 ) || defined(PYBv10 )
101+ if (led == 4 ) {
102+ if (TIM3 -> CCR1 == 0 ) {
103+ TIM3 -> CCR1 = 0xffff ;
104+ } else {
105+ TIM3 -> CCR1 = 0 ;
106+ }
107+ return ;
108+ }
109+ #endif
110+
96111 const pin_obj_t * led_pin = gLed [led - 1 ];
97112 GPIO_TypeDef * gpio = led_pin -> gpio ;
98113
@@ -107,23 +122,54 @@ void led_toggle(pyb_led_t led) {
107122 }
108123}
109124
110- int led_get_state (pyb_led_t led ) {
125+ int led_get_intensity (pyb_led_t led ) {
111126 if (led < 1 || led > NUM_LEDS ) {
112127 return 0 ;
113128 }
129+
130+ #if defined(PYBOARD4 ) || defined(PYBv10 )
131+ if (led == 4 ) {
132+ machine_uint_t i = TIM3 -> CCR1 * 255 / ((USBD_CDC_POLLING_INTERVAL * 1000 ) - 1 );
133+ if (i > 255 ) {
134+ i = 255 ;
135+ }
136+ return i ;
137+ }
138+ #endif
139+
114140 const pin_obj_t * led_pin = gLed [led - 1 ];
115141 GPIO_TypeDef * gpio = led_pin -> gpio ;
116142
117143 // TODO convert high/low to on/off depending on board
118144 if (gpio -> ODR & led_pin -> pin_mask ) {
119145 // pin is high
120- return 1 ;
146+ return 255 ;
121147 } else {
122148 // pin is low
123149 return 0 ;
124150 }
125151}
126152
153+ void led_set_intensity (pyb_led_t led , machine_int_t intensity ) {
154+ #if defined(PYBOARD4 ) || defined(PYBv10 )
155+ if (led == 4 ) {
156+ // set intensity using PWM pulse width
157+ if (intensity < 0 ) {
158+ intensity = 0 ;
159+ } else if (intensity >= 255 ) {
160+ intensity = 0xffff ;
161+ } else {
162+ intensity = intensity * ((USBD_CDC_POLLING_INTERVAL * 1000 ) - 1 ) / 255 ;
163+ }
164+ TIM3 -> CCR1 = intensity ;
165+ return ;
166+ }
167+ #endif
168+
169+ // intensity not supported for this LED; just turn it on/off
170+ led_state (led , intensity > 0 );
171+ }
172+
127173void led_debug (int n , int delay ) {
128174 led_state (1 , n & 1 );
129175 led_state (2 , n & 2 );
@@ -163,35 +209,25 @@ mp_obj_t led_obj_toggle(mp_obj_t self_in) {
163209 return mp_const_none ;
164210}
165211
166- mp_obj_t led_obj_state (uint n_args , const mp_obj_t * args ) {
212+ mp_obj_t led_obj_intensity (uint n_args , const mp_obj_t * args ) {
167213 pyb_led_obj_t * self = args [0 ];
168- if (n_args == 0 ) {
169- return MP_BOOL ( led_get_state (self -> led_id ));
214+ if (n_args == 1 ) {
215+ return mp_obj_new_int ( led_get_intensity (self -> led_id ));
170216 } else {
171- led_state (self -> led_id , rt_is_true (args [1 ]));
217+ led_set_intensity (self -> led_id , mp_obj_get_int (args [1 ]));
172218 return mp_const_none ;
173219 }
174220}
175221
176- mp_obj_t led_obj_intensity (mp_obj_t self_in , mp_obj_t intensity ) {
177- pyb_led_obj_t * self = self_in ;
178- if (self -> led_id == 4 ) {
179- TIM3 -> CCR1 = mp_obj_get_int (intensity );
180- }
181- return mp_const_none ;
182- }
183-
184222STATIC MP_DEFINE_CONST_FUN_OBJ_1 (led_obj_on_obj , led_obj_on );
185223STATIC MP_DEFINE_CONST_FUN_OBJ_1 (led_obj_off_obj , led_obj_off );
186224STATIC MP_DEFINE_CONST_FUN_OBJ_1 (led_obj_toggle_obj , led_obj_toggle );
187- STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (led_obj_state_obj , 1 , 2 , led_obj_state );
188- STATIC MP_DEFINE_CONST_FUN_OBJ_2 (led_obj_intensity_obj , led_obj_intensity );
225+ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (led_obj_intensity_obj , 1 , 2 , led_obj_intensity );
189226
190227STATIC const mp_method_t led_methods [] = {
191228 { "on" , & led_obj_on_obj },
192229 { "off" , & led_obj_off_obj },
193230 { "toggle" , & led_obj_toggle_obj },
194- { "state" , & led_obj_state_obj },
195231 { "intensity" , & led_obj_intensity_obj },
196232 { NULL , NULL },
197233};
0 commit comments