diff --git a/dispenser/dispenser.go b/dispenser/dispenser.go index 1f43e49..72f2156 100644 --- a/dispenser/dispenser.go +++ b/dispenser/dispenser.go @@ -69,7 +69,7 @@ var ( } ) -func checkStatus(statusResp []byte) (string, error) { +func checkStatus(statusResp []byte) ([]string, error) { if len(statusResp) > 3 { statusBytes := statusResp[7:11] // Extract the relevant bytes from the response // For each position, get the ASCII character, hex value, and mapped meaning. @@ -84,17 +84,17 @@ func checkStatus(statusResp []byte) (string, error) { {pos: 4, value: statusBytes[3], mapper: statusPos3}, } - result := "" + result := make([]string, len(posStatus)) for _, p := range posStatus { statusMsg, exists := p.mapper[p.value] if !exists { statusMsg = "Unknown status" } if p.value != 0x30 { - result += fmt.Sprintf("Status: %s; ", statusMsg) + result = append(result, fmt.Sprintf("Status: %s; ", statusMsg)) } if p.pos == 4 && p.value == 0x38 { - return result, fmt.Errorf("Card well empty") + return nil, fmt.Errorf("Card well empty") } } return result, nil diff --git a/handlers/handlers.go b/handlers/handlers.go index 1bd476b..6acdffa 100644 --- a/handlers/handlers.go +++ b/handlers/handlers.go @@ -271,7 +271,7 @@ func (app *App) issueDoorCard(w http.ResponseWriter, r *http.Request) { return } - // dispenser sequence + // card to encoder position if not there already if status, err := dispenser.DispenserSequence(app.dispPort); err != nil { if status != "" { logging.Error(serviceName, status, "Dispense error", string(op), "", "", 0) @@ -294,10 +294,11 @@ func (app *App) issueDoorCard(w http.ResponseWriter, r *http.Request) { logging.Error(serviceName, err.Error(), "Key encoding", string(op), "", "", 0) writeError(w, http.StatusBadGateway, err.Error()) dispenser.CardOutOfMouth(app.dispPort) + dispenser.DispenserSequence(app.dispPort) return } - // final dispenser steps + // card out of mouth if status, err := dispenser.CardOutOfMouth(app.dispPort); err != nil { logging.Error(serviceName, err.Error(), "Dispenser eject error", string(op), "", "", 0) writeError(w, http.StatusServiceUnavailable, "Dispenser eject error: "+err.Error()) @@ -306,6 +307,20 @@ func (app *App) issueDoorCard(w http.ResponseWriter, r *http.Request) { log.Info(status) } + // card to encoder position + if status, err := dispenser.DispenserSequence(app.dispPort); err != nil { + if status != "" { + logging.Error(serviceName, status, "Dispense error", string(op), "", "", 0) + writeError(w, http.StatusServiceUnavailable, "Dispense error: "+err.Error()) + } else { + logging.Error(serviceName, err.Error(), "Dispense error", string(op), "", "", 0) + writeError(w, http.StatusServiceUnavailable, "Dispense error: "+err.Error()+"; check card stock") + } + return + } else { + log.Info(status) + } + theResponse.Code = http.StatusOK theResponse.Message = "Card issued successfully" // success! return 200 and any data you like diff --git a/main.go b/main.go index 9bd235b..1ccc101 100644 --- a/main.go +++ b/main.go @@ -65,6 +65,9 @@ func main() { fmt.Println(err.Error()) } } + if status, err = dispenser.DispenserSequence(dispHandle); err != nil { + handlers.FatalError(err) + } log.Infof("Dispenser initialized on port %s, %s", config.DispenserPort, status) }