@@ -12,6 +12,7 @@ import (
1212 "fmt" // used only in debug printouts and is optimized out when debugging is disabled
1313 "strconv"
1414 "strings"
15+ "sync"
1516 "time"
1617
1718 "machine"
@@ -288,6 +289,7 @@ type Device struct {
288289 proto uint8
289290 ip uint32
290291 port uint16
292+ mu sync.Mutex
291293}
292294
293295// New returns a new Wifinina device.
@@ -363,6 +365,9 @@ func (d *Device) GetClientState(sock uint8) (uint8, error) {
363365}
364366
365367func (d * Device ) SendData (buf []byte , sock uint8 ) (uint16 , error ) {
368+ d .mu .Lock ()
369+ defer d .mu .Unlock ()
370+
366371 if err := d .waitForChipSelect (); err != nil {
367372 d .spiChipDeselect ()
368373 return 0 , err
@@ -376,6 +381,9 @@ func (d *Device) SendData(buf []byte, sock uint8) (uint16, error) {
376381}
377382
378383func (d * Device ) CheckDataSent (sock uint8 ) (bool , error ) {
384+ d .mu .Lock ()
385+ defer d .mu .Unlock ()
386+
379387 var lastErr error
380388 for timeout := 0 ; timeout < 10 ; timeout ++ {
381389 sent , err := d .getUint8 (d .reqUint8 (CmdDataSentTCP , sock ))
@@ -391,6 +399,9 @@ func (d *Device) CheckDataSent(sock uint8) (bool, error) {
391399}
392400
393401func (d * Device ) GetDataBuf (sock uint8 , buf []byte ) (int , error ) {
402+ d .mu .Lock ()
403+ defer d .mu .Unlock ()
404+
394405 if err := d .waitForChipSelect (); err != nil {
395406 d .spiChipDeselect ()
396407 return 0 , err
@@ -411,6 +422,9 @@ func (d *Device) GetDataBuf(sock uint8, buf []byte) (int, error) {
411422}
412423
413424func (d * Device ) StopClient (sock uint8 ) error {
425+ d .mu .Lock ()
426+ defer d .mu .Unlock ()
427+
414428 if _debug {
415429 println ("[StopClient] called StopClient()\r " )
416430 }
@@ -419,6 +433,9 @@ func (d *Device) StopClient(sock uint8) error {
419433}
420434
421435func (d * Device ) StartServer (port uint16 , sock uint8 , mode uint8 ) error {
436+ d .mu .Lock ()
437+ defer d .mu .Unlock ()
438+
422439 if err := d .waitForChipSelect (); err != nil {
423440 d .spiChipDeselect ()
424441 return err
@@ -435,6 +452,9 @@ func (d *Device) StartServer(port uint16, sock uint8, mode uint8) error {
435452
436453// InsertDataBuf adds data to the buffer used for sending UDP data
437454func (d * Device ) InsertDataBuf (buf []byte , sock uint8 ) (bool , error ) {
455+ d .mu .Lock ()
456+ defer d .mu .Unlock ()
457+
438458 if err := d .waitForChipSelect (); err != nil {
439459 d .spiChipDeselect ()
440460 return false , err
@@ -450,6 +470,9 @@ func (d *Device) InsertDataBuf(buf []byte, sock uint8) (bool, error) {
450470
451471// SendUDPData sends the data previously added to the UDP buffer
452472func (d * Device ) SendUDPData (sock uint8 ) (bool , error ) {
473+ d .mu .Lock ()
474+ defer d .mu .Unlock ()
475+
453476 if err := d .waitForChipSelect (); err != nil {
454477 d .spiChipDeselect ()
455478 return false , err
0 commit comments