private static void PicoSay(string sentence, string locale) { try { var wavFile = Path.Combine(Utility.GetTmpFolder(), "_synthesis_tmp.wav"); if (File.Exists(wavFile)) { File.Delete(wavFile); } Process.Start(new ProcessStartInfo(picoPath, " -w " + wavFile + " -l " + locale + " \"" + sentence + "\"") { CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory, UseShellExecute = false }).WaitForExit(); if (File.Exists(wavFile)) { Play(wavFile); } } catch (Exception e) { HomeGenieService.LogError(e); } }
public PackageData AddPackage(string archiveFileName) { // uncompress and verify package content string tempFolder = Path.Combine(Utility.GetTmpFolder(), Path.GetFileNameWithoutExtension(archiveFileName)); Utility.FolderCleanUp(tempFolder); Utility.UncompressZip(archiveFileName, tempFolder); string packageJson = File.ReadAllText(Path.Combine(tempFolder, "package.json")); var packageData = JsonConvert.DeserializeObject <PackageData>(packageJson); // TODO: Data normalization and check string programsDatabase = Path.Combine(tempFolder, "programs.xml"); var serializer1 = new XmlSerializer(typeof(List <ProgramBlock>)); using (var reader = new StreamReader(programsDatabase)) { // verify if package data checksum matches the one in programs.xml file var programs = (List <ProgramBlock>)serializer1.Deserialize(reader); foreach (var prg in packageData.Programs) { // Get the program from programs.xml var p1 = programs.Find((p) => p.Address.ToString() == prg.Hid); if (p1 != null) { p1.PackageInfo.Checksum = Utility.GetObjectChecksum(new { setup = p1.ScriptSetup, source = p1.ScriptSource }); if (p1.PackageInfo.Checksum != prg.Checksum) { //TODO: Integrity check failed, should abort package importing //Console.WriteLine(p1.PackageInfo.Checksum); //Console.WriteLine(prg.Checksum); } } } } // copy the extracted package folder to the repository folder string repositoryFolder = Path.Combine(Utility.GetDataFolder(), "packages", packageData.Repository); if (!Directory.Exists(repositoryFolder)) { Directory.CreateDirectory(repositoryFolder); } string pkgFolder = Path.Combine(repositoryFolder, packageData.Id); if (Directory.Exists(pkgFolder)) { Directory.Delete(pkgFolder, true); } Directory.Move(tempFolder, pkgFolder); return(packageData); }
private static void GoogleVoiceSay(string sentence, string locale) { try { var mp3File = Path.Combine(Utility.GetTmpFolder(), "_synthesis_tmp.mp3"); using (var client = new WebClient()) { client.Encoding = Encoding.UTF8; client.Headers.Add("Referer", "http://translate.google.com"); var audioData = client.DownloadData("http://translate.google.com/translate_tts?ie=UTF-8&tl=" + Uri.EscapeDataString(locale) + "&q=" + Uri.EscapeDataString(sentence) + "&client=homegenie&ts=" + DateTime.UtcNow.Ticks); if (File.Exists(mp3File)) { File.Delete(mp3File); } var stream = File.OpenWrite(mp3File); stream.Write(audioData, 0, audioData.Length); stream.Close(); client.Dispose(); } var wavFile = mp3File.Replace(".mp3", ".wav"); Process.Start(new ProcessStartInfo("lame", "--decode \"" + mp3File + "\" \"" + wavFile + "\"") { CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory, UseShellExecute = false }).WaitForExit(); if (File.Exists(mp3File)) { Play(wavFile); } } catch (Exception e) { HomeGenieService.LogError(e); } }
public ProgramBlock ProgramImport(int newPid, string archiveName, string groupName) { ProgramBlock newProgram; var reader = new StreamReader(archiveName); char[] signature = new char[2]; reader.Read(signature, 0, 2); reader.Close(); if (signature[0] == 'P' && signature[1] == 'K') { // Read and uncompress zip file content (arduino program bundle) string zipFileName = archiveName.Replace(".hgx", ".zip"); if (File.Exists(zipFileName)) { File.Delete(zipFileName); } File.Move(archiveName, zipFileName); string destFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Utility.GetTmpFolder(), "import"); if (Directory.Exists(destFolder)) { Directory.Delete(destFolder, true); } Utility.UncompressZip(zipFileName, destFolder); string bundleFolder = Path.Combine("programs", "arduino", newPid.ToString()); if (Directory.Exists(bundleFolder)) { Directory.Delete(bundleFolder, true); } if (!Directory.Exists(Path.Combine("programs", "arduino"))) { Directory.CreateDirectory(Path.Combine("programs", "arduino")); } Directory.Move(Path.Combine(destFolder, "src"), bundleFolder); reader = new StreamReader(Path.Combine(destFolder, "program.hgx")); } else { reader = new StreamReader(archiveName); } var serializer = new XmlSerializer(typeof(ProgramBlock)); newProgram = (ProgramBlock)serializer.Deserialize(reader); reader.Close(); newProgram.Address = newPid; newProgram.Group = groupName; homegenie.ProgramManager.ProgramAdd(newProgram); newProgram.IsEnabled = false; newProgram.ScriptErrors = ""; newProgram.Engine.SetHost(homegenie); if (newProgram.Type.ToLower() != "arduino") { homegenie.ProgramManager.CompileScript(newProgram); } return(newProgram); }
public string CreatePackage(PackageData package) { string programsFile = Path.Combine(Utility.GetTmpFolder(), "programs.xml"); string modulesFile = Path.Combine(Utility.GetTmpFolder(), "modules.xml"); string groupsFile = Path.Combine(Utility.GetTmpFolder(), "groups.xml"); string schedulesFile = Path.Combine(Utility.GetTmpFolder(), "schedules.xml"); string packageFile = Path.Combine(Utility.GetTmpFolder(), "package.json"); string bundleFile = Path.Combine(Utility.GetTmpFolder(), package.Id + "-" + package.Version + ".zip"); try { // Clean-up File.Delete(programsFile); File.Delete(packageFile); File.Delete(bundleFile); // collect programs and modules bool saveProgramsRequired = false; var packagePrograms = new List <ProgramBlock>(); var packageModules = new List <Module>(); foreach (var item in package.Programs) { if (item.Repository != package.Repository || item.PackageId != package.Id) { // item is an external dependency belonging to some other repository/package continue; } var program = homegenie.ProgramManager.ProgramGet(int.Parse(item.Hid)); if (program != null) { saveProgramsRequired = true; //if (program.PackageInfo.Repository == null) { program.PackageInfo.Repository = package.Repository; } //if (program.PackageInfo.PackageId == null) { program.PackageInfo.PackageId = package.Id; } // update package version only if repository/package id match if (program.PackageInfo.Repository == package.Repository && program.PackageInfo.PackageId == package.Id) { program.PackageInfo.PackageVersion = package.Version; } if (program.PackageInfo.Id == null) { program.PackageInfo.Id = item.Id; } program.PackageInfo.Version = item.Version; program.PackageInfo.Required = item.Required; item.Checksum = program.PackageInfo.Checksum = Utility.GetObjectChecksum(new { setup = program.ScriptSetup, source = program.ScriptSource }); packagePrograms.Add(program); // lookup for modules belonging to this program packageModules.AddRange(homegenie.Modules.FindAll((m) => { var vm = Utility.ModuleParameterGet(m, Properties.VirtualModuleParentId); return((m.Domain == Domains.HomeAutomation_HomeGenie && m.Address == program.Address.ToString()) || (vm != null && vm.Value == program.Address.ToString())); })); } } Utility.UpdateXmlDatabase(packagePrograms, programsFile, null); Utility.UpdateXmlDatabase(packageModules, modulesFile, null); // collect control groups var packageGroups = new List <Group>(); foreach (var item in package.Groups) { var group = homegenie.GetGroups("Control").Find((g) => g.Name == item.Hid); if (group != null) { packageGroups.Add(group); } } Utility.UpdateXmlDatabase(packageGroups, groupsFile, null); // collect schedules var packageSchedules = new List <SchedulerItem>(); foreach (var item in package.Schedules) { var schedule = homegenie.ProgramManager.SchedulerService.Get(item.Hid); if (schedule != null) { packageSchedules.Add(schedule); } } Utility.UpdateXmlDatabase(packageSchedules, schedulesFile, null); // add files to zip bundle File.WriteAllText(packageFile, JsonConvert.SerializeObject(package)); Utility.AddFileToZip(bundleFile, packageFile, "package.json"); Utility.AddFileToZip(bundleFile, programsFile, "programs.xml"); Utility.AddFileToZip(bundleFile, modulesFile, "modules.xml"); Utility.AddFileToZip(bundleFile, groupsFile, "groups.xml"); Utility.AddFileToZip(bundleFile, schedulesFile, "schedules.xml"); // move files to package folder in data/packages string packageFolder = Path.Combine(Utility.GetDataFolder(), "packages", package.Repository, package.Id); Utility.FolderCleanUp(packageFolder); File.Move(packageFile, Path.Combine(packageFolder, "package.json")); File.Move(programsFile, Path.Combine(packageFolder, "programs.xml")); File.Move(modulesFile, Path.Combine(packageFolder, "modules.xml")); File.Move(groupsFile, Path.Combine(packageFolder, "groups.xml")); File.Move(schedulesFile, Path.Combine(packageFolder, "schedules.xml")); // update programs db if required if (saveProgramsRequired) { homegenie.UpdateProgramsDatabase(); } } catch (Exception e) { homegenie.RaiseEvent( Domains.HomeGenie_System, Domains.HomeGenie_PackageInstaller, SourceModule.Master, "HomeGenie Package Installer", Properties.InstallProgressMessage, "= Error: " + e.Message ); return(null); } // TODO: cleanup temp files and folders return(bundleFile); }