public object Perform() { var logConfig = Logger.FSettings; //Get database collection var collection = Database.Connection.X.GetCollection <Database.Registers>(); var servos = PortPool.X.Servos; if (this.servoIDs == null) { throw (new Exception("No list of servos provided. Please set servoIDs")); } //Check we have these servos foreach (var servoID in this.servoIDs) { if (!servos.ContainsKey(servoID)) { throw (new Exception(String.Format("Cannot find servo {0}", servoID))); } } foreach (var servo in servos) { var servoID = servo.Key; var valuesForServo = new Dictionary <string, int>(); foreach (var registerType in Logger.FSettings.Registers) { valuesForServo.Add(registerType.ToString() , servo.Value.ReadValue(registerType)); } var row = new Database.Registers { ServoID = servoID, TimeStamp = DateTime.Now, RegisterValues = valuesForServo }; collection.InsertOne(row); } return(new { }); }
public object Perform() { var servos = PortPool.X.Servos; foreach (var servo in servos.Values) { //Ideally we want to change this later servo.ReadAll(); var dataRow = new Database.Registers(); dataRow.ServoID = servo.ID; var registers = servo.Registers; foreach (var register in registers) { dataRow.RegisterValues.Add(register.Key.ToString(), register.Value.Value); } Database.Connection.X.Log(dataRow); } return(new { }); }
public object Perform() { //Get ports var ports = PortPool.X.Ports; //Get database collection var collection = Database.Connection.X.GetCollection <Database.Registers>(); //We get the register objects from the first servo we find in order to know addresses and sizes DynamixelSDKSharp.Servo firstServo = null; var report = new Dictionary <string, List <byte> >(); Parallel.ForEach(ports, (portIterator) => { var listOfServosToLog = new List <byte>(); var port = portIterator.Value; // check which servos need to be logged for either high frequency or because they've never been logged foreach (var servoIterator in port.Servos) { var servoID = servoIterator.Key; var servo = servoIterator.Value; // store the first servo if (firstServo == null) { firstServo = servoIterator.Value; } else { //check all servos are the same model number if (servoIterator.Value.ProductSpecification.ModelNumber != firstServo.ProductSpecification.ModelNumber) { throw (new Exception("Mixed model numbers are not supported")); } } // get data log entries for this servo var documents = from document in collection.AsQueryable <Database.Registers>() where document.ServoID == servoID orderby document.TimeStamp descending select document; if (Database.HighFrequencyRequests.X.IsHighFrequencyNow(servoID)) { // It's on high frequency list listOfServosToLog.Add(servoID); } else if (documents.Count() == 0) { // It has never been logged listOfServosToLog.Add(servoID); } } if (port.Servos.Count == 0) { //quit early if this port has no servos return; } //check regular logging (choose oldest) { var staleTimeForRegularUpdates = DateTime.Now - TimeSpan.FromSeconds(Logger.FSettings.Period); var documents = collection.AsQueryable() .OrderByDescending(row => row.TimeStamp) .GroupBy(row => row.ServoID) .Where(group => group.First().TimeStamp < staleTimeForRegularUpdates.ToUniversalTime()) .Select(group => group.Key); //Ideally we don't want to call ToList first as this means we perform the following operation locally var servosWithOldData = documents.Take(Logger.FSettings.MaxServoCount).ToList(); foreach (var servoWithOldData in servosWithOldData) { listOfServosToLog.Add((byte)servoWithOldData); } } // trim any servos which aren't available on this port listOfServosToLog.RemoveAll(servoID => { return(!port.Servos.ContainsKey(servoID)); }); // accumulate data logs var recordedValues = new Dictionary <RegisterType, Dictionary <byte, int> >(); if (listOfServosToLog.Count > 0) { foreach (var registerType in Logger.FSettings.Registers) { var registerInfo = firstServo.Registers[registerType]; if (this.UseGroupSyncRead) { recordedValues.Add(registerType , portIterator.Value.GroupSyncRead(listOfServosToLog , registerInfo.Address , registerInfo.Size)); } else { var values = new Dictionary <byte, int>(); foreach (var servoID in listOfServosToLog) { values.Add(servoID, port.Read(servoID , registerInfo.Address , registerInfo.Size)); } recordedValues.Add(registerType, values); } } } //save data into database per servo foreach (var servoID in listOfServosToLog) { var valuesForServo = new Dictionary <string, int>(); foreach (var registerValuesIterator in recordedValues) { valuesForServo.Add(registerValuesIterator.Key.ToString() , registerValuesIterator.Value[servoID]); } var row = new Database.Registers { ServoID = servoID, TimeStamp = DateTime.Now, RegisterValues = valuesForServo }; collection.InsertOne(row); } //accumulate report log lock (report) { report.Add(String.Format("{0} ({1})", port.Name, port.Address), listOfServosToLog); } }); return(report); }