From cc6072d2dc3785c8a2f042cc8f97714bee587ee4 Mon Sep 17 00:00:00 2001 From: dennydai <10000@daihan.me> Date: Thu, 27 Feb 2020 10:51:40 -0500 Subject: [PATCH] initial commit --- .gitignore | 353 ++++++++++++++++++++++ iClicker.sln | 25 ++ iClicker/App.config | 6 + iClicker/Program.cs | 122 ++++++++ iClicker/Properties/AssemblyInfo.cs | 36 +++ iClicker/Properties/Resources.Designer.cs | 63 ++++ iClicker/Properties/Resources.resx | 101 +++++++ iClicker/TextTemplate.ico | Bin 0 -> 43451 bytes iClicker/iClicker.csproj | 103 +++++++ 9 files changed, 809 insertions(+) create mode 100644 .gitignore create mode 100644 iClicker.sln create mode 100644 iClicker/App.config create mode 100644 iClicker/Program.cs create mode 100644 iClicker/Properties/AssemblyInfo.cs create mode 100644 iClicker/Properties/Resources.Designer.cs create mode 100644 iClicker/Properties/Resources.resx create mode 100644 iClicker/TextTemplate.ico create mode 100644 iClicker/iClicker.csproj diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a57fdbb --- /dev/null +++ b/.gitignore @@ -0,0 +1,353 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*[.json, .xml, .info] + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ \ No newline at end of file diff --git a/iClicker.sln b/iClicker.sln new file mode 100644 index 0000000..71ac335 --- /dev/null +++ b/iClicker.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29613.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iClicker", "iClicker\iClicker.csproj", "{F940473E-21CD-4B50-A0C9-FACA9B2C8514}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F940473E-21CD-4B50-A0C9-FACA9B2C8514}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F940473E-21CD-4B50-A0C9-FACA9B2C8514}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F940473E-21CD-4B50-A0C9-FACA9B2C8514}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F940473E-21CD-4B50-A0C9-FACA9B2C8514}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {0E5CE50C-09C4-4BF8-AA95-D564C0DC1915} + EndGlobalSection +EndGlobal diff --git a/iClicker/App.config b/iClicker/App.config new file mode 100644 index 0000000..56efbc7 --- /dev/null +++ b/iClicker/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/iClicker/Program.cs b/iClicker/Program.cs new file mode 100644 index 0000000..22f1457 --- /dev/null +++ b/iClicker/Program.cs @@ -0,0 +1,122 @@ +using System; +using System.Collections; +using System.Drawing; +using System.IO.Ports; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace iClicker { + class Program { + static ArrayList[] answerLists = new ArrayList[5]; + static bool answerListsUpdated = true; + static int mostAnswer; + + static NotifyIcon notifyIcon = new NotifyIcon(); + static bool consoleVisibility = true; + static String channel = "#AA"; + static void Main(String[] args) { + if (args.Length < 1) return; + if (args.Length == 2) channel = "#" + args[1].ToUpper(); + + for (int i = 0; i < 5; i++) answerLists[i] = new ArrayList(); + + // notify icon menu + notifyIcon.Visible = true; + SetConsoleWindowVisibility(false); + notifyIcon.DoubleClick += (s, e) => { consoleVisibility = !consoleVisibility; SetConsoleWindowVisibility(consoleVisibility); }; + var contextMenu = new ContextMenuStrip(); + contextMenu.Items.Add("Reset", null, (s, e) => { for (int i = 0; i < 5; i++) answerLists[i].Clear(); answerListsUpdated = true; }); + contextMenu.Items.Add("Exit", null, (s, e) => { Application.Exit(); }); + notifyIcon.ContextMenuStrip = contextMenu; + + SerialPort mySerialPort = new SerialPort(args[0].ToUpper()); + + mySerialPort.BaudRate = 115200; + mySerialPort.Parity = Parity.None; + mySerialPort.StopBits = StopBits.One; + mySerialPort.DataBits = 8; + mySerialPort.Handshake = Handshake.None; + mySerialPort.RtsEnable = true; + mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); + + mySerialPort.Open(); + + mySerialPort.WriteLine(channel); + + System.Timers.Timer timer = new System.Timers.Timer(1000); + timer.Elapsed += async (sender, e) => await Task.Run(() => updateResult()); + timer.Start(); + + Application.Run(); + mySerialPort.Close(); + } + private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { + SerialPort sp = (SerialPort)sender; + String indata = sp.ReadExisting(); + if (indata[0] == '$') { // received answer + char ans = indata[1]; + String id = indata.Substring(2, 8); + if (ans >= 'A' && ans <= 'E') { + for (int i = 0; i < 5; i++) answerLists[i].Remove(id); + answerLists[ans - 'A'].Add(id); + answerListsUpdated = true; + } + } + } + private static void updateResult() { + if (!answerListsUpdated) return; + Console.Clear(); + notifyIcon.Text = ""; + int total = answerLists[0].Count + answerLists[1].Count + answerLists[2].Count + answerLists[3].Count + answerLists[4].Count; + if (total == 0) total = 1; + + mostAnswer = 0; + for (int i = 1; i < 5; i++) + if (answerLists[i].Count > answerLists[mostAnswer].Count) mostAnswer = i; + + for (int i = 0; i < 5; i++) { + if (i == mostAnswer) Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine("{0}: {1}\t{2} {3:F}%", (char)(i + 'A'), answerLists[i].Count, new String('▄', answerLists[i].Count * 50 / total), answerLists[i].Count * 100.0 / total); + if (i == mostAnswer) Console.ForegroundColor = ConsoleColor.White; + } + + for (int i = 0; i < 5; i++) { + if (i == mostAnswer) notifyIcon.Text += String.Format(" - "); + notifyIcon.Text += String.Format("{0}: {1:F}%\n", (char)(i + 'A'), answerLists[i].Count * 100.0 / total); + } + + updateIcon(((char)(mostAnswer + 'A')).ToString(), answerLists[mostAnswer].Count * 100 / total + "%"); + + answerListsUpdated = false; + } + public static void SetConsoleWindowVisibility(bool visible) { + IntPtr hWnd = FindWindow(null, Console.Title); + if (hWnd != IntPtr.Zero) { + if (visible) ShowWindow(hWnd, 1); //1 = SW_SHOWNORMAL + else ShowWindow(hWnd, 0); //0 = SW_HIDE + } + } + + public static void updateIcon(String line1, String line2) { + Font line1Font = new Font("Arial Black", 128, FontStyle.Regular, GraphicsUnit.Pixel); + Font line2Font = new Font("Arial Black", 104, FontStyle.Regular, GraphicsUnit.Pixel); + Brush brushToUse = new SolidBrush(Color.White); + Bitmap bitmapText = new Bitmap(256, 256); + Graphics g = System.Drawing.Graphics.FromImage(bitmapText); + + IntPtr hIcon; + + g.Clear(Color.Transparent); + g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit; + g.DrawString(line1, line1Font, brushToUse, 56, 0); + g.DrawString(line2, line2Font, brushToUse, 0, 140); + hIcon = (bitmapText.GetHicon()); + notifyIcon.Icon = System.Drawing.Icon.FromHandle(hIcon); + } + + [DllImport("user32.dll")] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); + [DllImport("user32.dll")] static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); + + } +} \ No newline at end of file diff --git a/iClicker/Properties/AssemblyInfo.cs b/iClicker/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..f17a779 --- /dev/null +++ b/iClicker/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("iClicker")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("iClicker")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f940473e-21cd-4b50-a0c9-faca9b2c8514")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/iClicker/Properties/Resources.Designer.cs b/iClicker/Properties/Resources.Designer.cs new file mode 100644 index 0000000..6678521 --- /dev/null +++ b/iClicker/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace iClicker.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("iClicker.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/iClicker/Properties/Resources.resx b/iClicker/Properties/Resources.resx new file mode 100644 index 0000000..4fdb1b6 --- /dev/null +++ b/iClicker/Properties/Resources.resx @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/iClicker/TextTemplate.ico b/iClicker/TextTemplate.ico new file mode 100644 index 0000000000000000000000000000000000000000..0925e5623a23db64db9e21e73350fd97c9ecce55 GIT binary patch literal 43451 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 + + + + Debug + AnyCPU + {F940473E-21CD-4B50-A0C9-FACA9B2C8514} + Exe + iClicker + iClicker + v4.7.2 + 512 + true + true + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + + + + + + + + + False + Microsoft .NET Framework 4.7.2 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + \ No newline at end of file