@@ -53,9 +53,51 @@ HardwarePWM* HwPWMx[] =
53
53
#endif
54
54
};
55
55
56
+ bool can_stringify_token (uintptr_t token)
57
+ {
58
+ uint8_t * t = (uint8_t *)&token;
59
+ for (size_t i = 0 ; i < sizeof (uintptr_t ); ++i, ++t)
60
+ {
61
+ uint8_t x = *t;
62
+ if ((x < 0x20 ) || (x > 0x7E )) return false ;
63
+ }
64
+ return true ;
65
+ }
66
+
67
+ void HardwarePWM::DebugOutput (Stream& logger)
68
+ {
69
+ const size_t count = arrcount (HwPWMx);
70
+ logger.printf (" HwPWM Debug:" );
71
+ for (size_t i = 0 ; i < count; i++) {
72
+ HardwarePWM const * pwm = HwPWMx[i];
73
+ uintptr_t token = pwm->_owner_token ;
74
+ logger.printf (" || %d:" , i);
75
+ if (can_stringify_token (token)) {
76
+ uint8_t * t = (uint8_t *)(&token);
77
+ static_assert (sizeof (uintptr_t ) == 4 );
78
+ logger.printf (" \" %c%c%c%c\" " , t[0 ], t[1 ], t[2 ], t[3 ] );
79
+ } else {
80
+ static_assert (sizeof (uintptr_t ) == 4 );
81
+ logger.printf (" %08x " , token);
82
+ }
83
+ for (size_t j = 0 ; j < MAX_CHANNELS; j++) {
84
+ uint32_t r = pwm->_pwm ->PSEL .OUT [i]; // only read it once
85
+ if ( (r & PWM_PSEL_OUT_CONNECT_Msk) != (PWM_PSEL_OUT_CONNECT_Disconnected << PWM_PSEL_OUT_CONNECT_Pos) ) {
86
+ logger.printf (" %02x" , r & 0x1F );
87
+ } else {
88
+ logger.printf (" xx" );
89
+ }
90
+ }
91
+ }
92
+ logger.printf (" \n " );
93
+ }
94
+
95
+
96
+
56
97
// returns true ONLY when (1) no PWM channel has a pin, and (2) the owner token is nullptr
57
- bool HardwarePWM::takeOwnership (void const * token)
98
+ bool HardwarePWM::takeOwnership (uintptr_t token)
58
99
{
100
+ if (token == 0 ) return false ; // cannot take ownership with nullptr
59
101
if (this ->_owner_token != 0 ) return false ; // doesn't matter if it's actually a match ... it's not legal to take ownership twice
60
102
if (this ->usedChannelCount () != 0 ) return false ; // at least one channel is already in use
61
103
if (this ->enabled () ) return false ; // if it's enabled, do not allow new ownership, even with no pins in use
@@ -64,8 +106,9 @@ bool HardwarePWM::takeOwnership(void const * token)
64
106
return __sync_bool_compare_and_swap (&(this ->_owner_token ), 0 , token);
65
107
}
66
108
// returns true ONLY when (1) no PWM channel has a pin attached, and (2) the owner token matches
67
- bool HardwarePWM::releaseOwnership (void const * token)
109
+ bool HardwarePWM::releaseOwnership (uintptr_t token)
68
110
{
111
+ if (token == 0 ) return false ; // cannot release ownership with nullptr
69
112
if (!this ->isOwner (token) ) return false ; // don't even look at peripheral
70
113
if ( this ->usedChannelCount () != 0 ) return false ; // fail if any channels still have pins
71
114
if ( this ->enabled () ) return false ; // if it's enabled, do not allow ownership to be released, even with no pins in use
@@ -74,9 +117,9 @@ bool HardwarePWM::releaseOwnership(void const * token)
74
117
return __sync_bool_compare_and_swap (&(this ->_owner_token ), token, 0 );
75
118
}
76
119
77
- HardwarePWM::HardwarePWM (NRF_PWM_Type* pwm)
120
+ HardwarePWM::HardwarePWM (NRF_PWM_Type* pwm) :
121
+ _pwm(pwm)
78
122
{
79
- _pwm = pwm;
80
123
arrclr (_seq0);
81
124
82
125
_max_value = 255 ;
@@ -225,21 +268,21 @@ bool HardwarePWM::writePin(uint8_t pin, uint16_t value, bool inverted)
225
268
return writeChannel (ch, value, inverted);
226
269
}
227
270
228
- uint16_t HardwarePWM::readPin (uint8_t pin)
271
+ uint16_t HardwarePWM::readPin (uint8_t pin) const
229
272
{
230
273
int ch = pin2channel (pin);
231
274
VERIFY ( ch >= 0 , 0 );
232
275
233
276
return readChannel (ch);
234
277
}
235
278
236
- uint16_t HardwarePWM::readChannel (uint8_t ch)
279
+ uint16_t HardwarePWM::readChannel (uint8_t ch) const
237
280
{
238
281
// remove inverted bit
239
282
return (_seq0[ch] & 0x7FFF );
240
283
}
241
284
242
- uint8_t HardwarePWM::usedChannelCount (void )
285
+ uint8_t HardwarePWM::usedChannelCount (void ) const
243
286
{
244
287
uint8_t usedChannels = 0 ;
245
288
for (int i=0 ; i<MAX_CHANNELS; i++)
@@ -252,7 +295,7 @@ uint8_t HardwarePWM::usedChannelCount(void)
252
295
return usedChannels;
253
296
}
254
297
255
- uint8_t HardwarePWM::freeChannelCount (void )
298
+ uint8_t HardwarePWM::freeChannelCount (void ) const
256
299
{
257
300
return MAX_CHANNELS - usedChannelCount ();
258
301
}
0 commit comments