/// <summary> /// Manage open compartment by requested object and based on locker configuration. /// </summary> /// <returns> /// The compartment object mapped from locker configuration. /// </returns> public static Locker CompartmentOpen(DataObjects.Models.Compartment model, AppSettings lockerConfiguration) { var odbModuleList = new List <string> { }; // Find object detection module id list by input list of compartment List <CompartmentConfiguration> compartments = lockerConfiguration.Locker.Compartments; if (model.CompartmentIds.Any(CompartmentId => CompartmentId == "All")) { model.CompartmentIds = lockerConfiguration.Locker.Compartments.Select(compartment => compartment.CompartmentId).ToArray(); } foreach (var compartmentId in model.CompartmentIds) { var compartment = compartments.Find(c => c.CompartmentId == compartmentId); if (!odbModuleList.Contains(compartment.CompartmentCode.Odbmod)) // Get object detection module id { odbModuleList.Add(compartment.CompartmentCode.Odbmod); } } // Update object detection status of selected modules var objectdetectStatusAry = new Dictionary <string, Dictionary <string, byte> > { }; foreach (string moduleNo in odbModuleList) { objectdetectStatusAry[moduleNo] = CompartmentHelper.GetStatusByModuleId(CommandType.ItemDetection, moduleNo, lockerConfiguration); Log.Debug("[HCM][Compartment Manager][Compartment Open]" + "[Module No : " + moduleNo + "]" + "[Object Detection Status Array : " + objectdetectStatusAry[moduleNo] + "]"); } var result = new Locker(); bool compartmentDoorStatusAlert = false; foreach (var compartmentId in model.CompartmentIds) { var targetCompartment = CompartmentService.CompartmentOpen(compartmentId, lockerConfiguration); // Update objectdetection status CompartmentConfiguration targetCompartmentConfig = CompartmentHelper.MapCompartment(compartmentId, lockerConfiguration); Dictionary <string, byte> objectdetectStatus = objectdetectStatusAry[targetCompartmentConfig.CompartmentCode.Odbmod]; targetCompartment.ObjectDetected = objectdetectStatus[targetCompartmentConfig.CompartmentCode.Odbid] == 1 ? true : false; result.Compartments.Add(targetCompartment); compartmentDoorStatusAlert |= targetCompartment.CompartmentDoorOpen; } result.TransactionId = model.TransactionId; // Set alert timer if (compartmentDoorStatusAlert) { Log.Information("[HCM][Compartment Manager][Compartment Open]" + "[Set Door Open Timer]"); CompartmentHelper.SetDoorOpenTimer(lockerConfiguration); //CompartmentHelper.EndDoorOpenTimer(); } return(result); }
/// <summary> /// Prepare compartment status object by communicating command to communication port service. /// </summary> /// <returns> /// Compartment status actual result including real hardware status. /// </returns> public static List <Compartment> CompartmentStatus(DataObjects.Models.Compartment model, AppSettings lockerConfiguration) { // Find locker controller board module id and object detection module id list var lcbModuleList = new List <string> { }; var odbModuleList = new List <string> { }; List <CompartmentConfiguration> compartments = lockerConfiguration.Locker.Compartments; if (model.CompartmentIds.Any(CompartmentId => CompartmentId == "All")) { model.CompartmentIds = lockerConfiguration.Locker.Compartments.Select(compartment => compartment.CompartmentId).ToArray(); } foreach (var compartmentId in model.CompartmentIds) { var compartment = compartments.Find(c => c.CompartmentId == compartmentId); if (!odbModuleList.Contains(compartment.CompartmentCode.Odbmod)) // Get object detection module id { odbModuleList.Add(compartment.CompartmentCode.Odbmod); } // Get locker controller module id if (!lcbModuleList.Contains(compartment.CompartmentCode.Lcbmod)) { lcbModuleList.Add(compartment.CompartmentCode.Lcbmod); } } // Get all module update List <Compartment> compartmentList = new List <Compartment>(); var opendoorStatusAry = new Dictionary <string, Dictionary <string, byte> > { }; foreach (string moduleNo in lcbModuleList) { opendoorStatusAry[moduleNo] = CompartmentHelper.GetStatusByModuleId(CommandType.DoorStatus, moduleNo, lockerConfiguration); } var objectdetectStatusAry = new Dictionary <string, Dictionary <string, byte> > { }; foreach (string moduleNo in odbModuleList) { objectdetectStatusAry[moduleNo] = CompartmentHelper.GetStatusByModuleId(CommandType.ItemDetection, moduleNo, lockerConfiguration); } foreach (var compatmentId in model.CompartmentIds) { var compartment = compartments.Find(c => c.CompartmentId == compatmentId); Dictionary <string, byte> opendoorStatus = opendoorStatusAry[compartment.CompartmentCode.Lcbmod]; //[compatment.CompartmentCode.Lcbid]; Dictionary <string, byte> objectdetectStatus = objectdetectStatusAry[compartment.CompartmentCode.Odbmod]; //[compatment.CompartmentCode.Odbid]; Compartment compartmentResult = new Compartment(lockerConfiguration.Locker.LockerId, compartment.CompartmentId, compartment.CompartmentSize, opendoorStatus[compartment.CompartmentCode.Lcbid] == 0 ? true : false, opendoorStatus[compartment.CompartmentCode.Lcbid] == 0 ? false : true, objectdetectStatus[compartment.CompartmentCode.Odbid] == 1 ? true : false, opendoorStatus[compartment.CompartmentCode.Lcbid] == 0 ? "ON" : "OFF"); Log.Debug("[HCM][Compartment Service][Compartment Status]" + "[Compartment ID : " + compartmentResult.CompartmentId.ToString() + "]" + "[Open Door status: " + compartmentResult.CompartmentDoorOpen.ToString() + "]" + "[Door Available status: " + compartmentResult.CompartmentDoorAvailable.ToString() + "]" + "[Object Detection status: " + compartmentResult.ObjectDetected.ToString() + "]" + "[LED status: " + compartmentResult.StatusLed.ToString() + "]" ); compartmentList.Add(compartmentResult); } return(compartmentList); }