@@ -284,6 +284,8 @@ func (p *serport) writerRaw() {
284
284
285
285
// FIXME: move this into the `hub.go` file
286
286
func (h * hub ) spHandlerOpen (portname string , baud int , buftype string ) {
287
+ h .spHandlerOpenLock .Lock ()
288
+ defer h .spHandlerOpenLock .Unlock ()
287
289
288
290
log .Print ("Inside spHandler" )
289
291
@@ -305,11 +307,14 @@ func (h *hub) spHandlerOpen(portname string, baud int, buftype string) {
305
307
sp , err := serial .Open (portname , mode )
306
308
log .Print ("Just tried to open port" )
307
309
if err != nil {
308
- //log.Fatal(err)
309
- log .Print ("Error opening port " + err .Error ())
310
- //h.broadcastSys <- []byte("Error opening port. " + err.Error())
311
- h .broadcastSys <- []byte ("{\" Cmd\" :\" OpenFail\" ,\" Desc\" :\" Error opening port. " + err .Error () + "\" ,\" Port\" :\" " + conf .Name + "\" ,\" Baud\" :" + strconv .Itoa (conf .Baud ) + "}" )
312
-
310
+ existingPort , ok := h .serialHub .FindPortByName (portname )
311
+ if ok && existingPort .portConf .Baud == baud && existingPort .BufferType == buftype {
312
+ log .Print ("Port already opened" )
313
+ h .broadcastSys <- []byte ("{\" Cmd\" :\" Open\" ,\" Desc\" :\" Port already opened.\" ,\" Port\" :\" " + existingPort .portConf .Name + "\" ,\" Baud\" :" + strconv .Itoa (existingPort .portConf .Baud ) + ",\" BufferType\" :\" " + existingPort .BufferType + "\" }" )
314
+ } else {
315
+ log .Print ("Error opening port " + err .Error ())
316
+ h .broadcastSys <- []byte ("{\" Cmd\" :\" OpenFail\" ,\" Desc\" :\" Error opening port. " + err .Error () + "\" ,\" Port\" :\" " + conf .Name + "\" ,\" Baud\" :" + strconv .Itoa (conf .Baud ) + "}" )
317
+ }
313
318
return
314
319
}
315
320
log .Print ("Opened port successfully" )
@@ -348,7 +353,6 @@ func (h *hub) spHandlerOpen(portname string, baud int, buftype string) {
348
353
p .bufferwatcher = bw
349
354
350
355
h .serialHub .Register (p )
351
- defer h .serialHub .Unregister (p )
352
356
353
357
h .serialPortList .MarkPortAsOpened (portname )
354
358
h .serialPortList .List ()
@@ -359,10 +363,12 @@ func (h *hub) spHandlerOpen(portname string, baud int, buftype string) {
359
363
go p .writerNoBuf ()
360
364
// this is thread to send to serial port but with base64 decoding
361
365
go p .writerRaw ()
362
-
363
- p .reader (buftype )
364
-
365
- h .serialPortList .List ()
366
+ // this is the thread that reads from the serial port
367
+ go func () {
368
+ p .reader (buftype )
369
+ h .serialPortList .List ()
370
+ h .serialHub .Unregister (p )
371
+ }()
366
372
}
367
373
368
374
func (p * serport ) Close () {
0 commit comments