Files

801 lines
33 KiB
C#
Raw Permalink Normal View History

2025-12-11 09:52:50 +08:00
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using TStudyDigitalPen.AP;
using Newtonsoft.Json;
using System.Threading.Tasks;
using System.Web;
using System.Threading;
using System.Drawing.Imaging;
using System.IO;
using System.Text.Json;
using Fleck;
using System.Security.Policy;
using System.Net.Http;
using System.Xml.Linq;
namespace WindowsFormsApp
{
2025-12-11 10:34:27 +08:00
public partial class InteractiveClassroomLocalDataScan : Form
2025-12-11 09:52:50 +08:00
{
static DigitalPenAP digitalPenAP;
static List<SR_Pen_coordinate> Penesult = new List<SR_Pen_coordinate>();
static List<string> penList = new List<string>();
static object obj = new object();
public static long ClassID=0;
public static string apiUrl = "";
//DigitalPenAP对象负责与点阵笔通信接收数据发送指令
//所有已连接笔的绘制窗口
Dictionary<string, PenDraw> AllPenDrawsDic = new Dictionary<string, PenDraw>();
2025-12-11 10:34:27 +08:00
public InteractiveClassroomLocalDataScan()
2025-12-11 09:52:50 +08:00
{
InitializeComponent();
// 加载 XML 文件
XDocument xdoc = XDocument.Load("roomconfig.xml");
// 读取 AppName 节点内容
ClassID = Convert.ToInt64(xdoc.Element("Root")?.Element("Settings")?.Element("ClassID").Value);//房间号
apiUrl = xdoc.Element("Root")?.Element("Settings")?.Element("apiUrl").Value;
SaveDataOperater.DeletePenStatus();
//SaveDataOperater.DropAllPenTable();
WriteData();
2025-12-11 10:34:27 +08:00
this.Text = "互动课堂数据采集";
2025-12-11 09:52:50 +08:00
}
public static async void WriteData()
{
while (true)
{
if (Penesult.Count > 0)
{
try
{
GetPenDataInSql();
}
catch
{
}
//Console.WriteLine(Penesult.Count);
}
await Task.Delay(500);
}
}
private static void GetPenDataInSql()
{
lock (obj)
{
StringBuilder sb = new StringBuilder();
var newList = penList.ToList();
foreach (string penNo in newList)
{
List<SR_Pen_coordinate> lt = Penesult.FindAll(c => c.penSerial == penNo);
if (lt.Count > 0)
{
foreach (SR_Pen_coordinate sr in lt)
{
sb.Append($@"INSERT INTO {"\"" + sr.penSerial + "\""} VALUES('{sr.penSerial}','{sr.pageSerial}',{sr.penType},{sr.cx},{sr.cy},{sr.force},{sr.flag},{sr.time},'{DateTime.Now}')");
}
}
Penesult.RemoveAll(c => c.penSerial == penNo);
}
if (sb.ToString() != "")
{
SaveDataOperater.InsertIntoTable(sb.ToString());
}
}
}
private void InitPen()
{
//获取DigitalPenAP实例
digitalPenAP = DigitalPenAP.GetInstance(certificates.MyLicense.Bytes);
#region
//绑定坐标事件
digitalPenAP.PenCoordinate += digitalPenAP_PenCoordinate;
//绑定笔连接事件
digitalPenAP.PenConnected += digitalPenAP_PenConnected;
//绑定笔断开事件
digitalPenAP.PenDisconnect += digitalPenAP_PenDisconnect;
//绑定落笔事件
digitalPenAP.PenDown += digitalPenAP_PenDown;
//绑定抬笔事件
digitalPenAP.PenUp += digitalPenAP_PenUp;
//绑定笔信息事件
digitalPenAP.PenInfo += DigitalPenAP_PenInfo;
//绑定获取笔时间事件
digitalPenAP.PenRTC += DigitalPenAP_PenRTC;
//绑定蓝牙断连原因事件
digitalPenAP.PenBluetoothDisconnectionReason += digitalPenAP_PenBluetoothDisconnectionReason;
//绑定设置笔名字结果事件
digitalPenAP.PenSetName += digitalPenAP_PenSetName;
//绑定获取笔名字事件
digitalPenAP.PenPenGetName += digitalPenAP_PenGetName;
//绑定设置指示灯结果事件
digitalPenAP.PenPenSetLed += digitalPenAP_PenSetLed;
//绑定设置指示灯临时状态结果事件
digitalPenAP.PenPenSetLedTemporary += digitalPenAP_PenSetLedTemporary;
//绑定获取指示灯结果事件
digitalPenAP.PenGetLed += digitalPenAP_PenGetLed;
//绑定设置笔超时关机时间结果事件
digitalPenAP.PenSetShutDownTime += digitalPenAP_PenSetShutDownTime;
//绑定设置蜂鸣器结果事件
digitalPenAP.PenSetBuzzer += digitalPenAP_PenSetBuzzer;
//绑定获取笔超时关机时间事件
digitalPenAP.PenGetShutDown += digitalPenAP_PenGetShutDown;
//绑定获取笔迹分布事件
digitalPenAP.PenGetHandwriting += digitalPenAP_PenGetHandwriting;
//绑定电量上报事件
digitalPenAP.ReceivePenBatteryChanged += digitalPenAP_ReceivePenBatteryChanged;
#endregion
//开启AP接收笔数据
//此函数在程序初始化时调用一次即可
//系统会自己创建该文件目录以及在里面下自动生成log.txt; 最终 例D:/a/demoLog/log.txt 、D:/a/demoLog/log.1.txt - D:/a/demoLog/log.*.txt
char[] filePath = "D:/a/demoLog".ToCharArray();
//第一个参数为0表示不生成指定路径的log1表示生成
//该日志会记录笔迹数据长度最好是放大一些不要超出unsigned int示例一个文件最大10MB,最后参数标志该日志文件最多有n个log.*.txt所以最终最大可存储10MB * 11log.txt + log.*.txt的信息量最新的数据
ERROR_CODE rc = digitalPenAP.Start(false, filePath, 10 * 1024 * 1024, 10);
//判断返回值是否正确
if (rc != ERROR_CODE.ERROR_OK)
{
MessageBox.Show("初始化失败" + rc.ToString());
}
else
{
}
timer1.Start();
timer2.Start();
}
private static string RTCToTimeString(ulong rtc)
{
DateTime dt = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
TimeSpan timeSpan = new TimeSpan((long)rtc * 1000);
DateTime now = dt.AddMilliseconds(rtc);
return now.ToString("yyyy-MM-dd HH:mm:ss");
}
//笔时间 响应GetPenRTC函数
private void DigitalPenAP_PenRTC(ulong time, string penSerial, int penType, ulong rtc)
{
MessageBox.Show(RTCToTimeString(rtc), penSerial);
}
//笔连接事件
//收到此事件说明点阵笔已经连接此时调用GetPenData函数就可以正常获取点阵笔数据
private void digitalPenAP_PenConnected(ulong time, string penSerial, int penType)
{
string x = penSerial;
penList.Add(penSerial);
SaveDataOperater.AddSqlTable(penSerial, ClassID);
SaveDataOperater.UpdatePenStatus(penSerial, 1);
//务必调用此函数获取笔数据
digitalPenAP.GetPenData(penSerial);
if (AllPenDrawsDic.ContainsKey(penSerial) == false)
{
var item = contextMenuStrip1.Items[0] as ToolStripDropDownItem;
ToolStripItem subItem = new ToolStripMenuItem(penSerial);
subItem.Click += SubItem_Click;
subItem.Tag = "Info";
item.DropDownItems.Add(subItem);
item = contextMenuStrip1.Items[1] as ToolStripDropDownItem;
subItem = new ToolStripMenuItem(penSerial);
subItem.Click += SubItem_Click;
subItem.Tag = "Mem";
item.DropDownItems.Add(subItem);
item = contextMenuStrip1.Items[2] as ToolStripDropDownItem;
subItem = new ToolStripMenuItem(penSerial);
subItem.Click += SubItem_Click;
subItem.Tag = "GetRtc";
item.DropDownItems.Add(subItem);
item = contextMenuStrip1.Items[3] as ToolStripDropDownItem;
subItem = new ToolStripMenuItem(penSerial);
subItem.Click += SubItem_Click;
subItem.Tag = "SetRtc";
item.DropDownItems.Add(subItem);
item = contextMenuStrip1.Items[4] as ToolStripDropDownItem;
subItem = new ToolStripMenuItem(penSerial);
subItem.Click += SubItem_Click;
subItem.Tag = "SetPenName";
item.DropDownItems.Add(subItem);
item = contextMenuStrip1.Items[5] as ToolStripDropDownItem;
subItem = new ToolStripMenuItem(penSerial);
subItem.Click += SubItem_Click;
subItem.Tag = "GetPenName";
item.DropDownItems.Add(subItem);
item = contextMenuStrip1.Items[6] as ToolStripDropDownItem;
subItem = new ToolStripMenuItem(penSerial);
subItem.Click += SubItem_Click;
subItem.Tag = "SetPenLed";
item.DropDownItems.Add(subItem);
item = contextMenuStrip1.Items[7] as ToolStripDropDownItem;
subItem = new ToolStripMenuItem(penSerial);
subItem.Click += SubItem_Click;
subItem.Tag = "SetPenLedTemporary";
item.DropDownItems.Add(subItem);
item = contextMenuStrip1.Items[8] as ToolStripDropDownItem;
subItem = new ToolStripMenuItem(penSerial);
subItem.Click += SubItem_Click;
subItem.Tag = "GetPenLed";
item.DropDownItems.Add(subItem);
item = contextMenuStrip1.Items[9] as ToolStripDropDownItem;
subItem = new ToolStripMenuItem(penSerial);
subItem.Click += SubItem_Click;
subItem.Tag = "SetPenBuzzer";
item.DropDownItems.Add(subItem);
item = contextMenuStrip1.Items[10] as ToolStripDropDownItem;
subItem = new ToolStripMenuItem(penSerial);
subItem.Click += SubItem_Click;
subItem.Tag = "SetdownTime";
item.DropDownItems.Add(subItem);
item = contextMenuStrip1.Items[11] as ToolStripDropDownItem;
subItem = new ToolStripMenuItem(penSerial);
subItem.Click += SubItem_Click;
subItem.Tag = "GetdownTime";
item.DropDownItems.Add(subItem);
item = contextMenuStrip1.Items[12] as ToolStripDropDownItem;
subItem = new ToolStripMenuItem(penSerial);
subItem.Click += SubItem_Click;
subItem.Tag = "GetHandwritingDistribution";
item.DropDownItems.Add(subItem);
AddPen(penSerial);
}
}
private void AddPen(string penserial)
{
if (this.InvokeRequired)
{
Action<string> action = new Action<string>(AddPen);
this.Invoke(action, new object[] { penserial });
}
else
{
//PenDraw penDraw = new PenDraw(penserial);
//flowLayoutPanel1.Controls.Add(penDraw);
//AllPenDrawsDic.Add(penserial, penDraw);
}
}
private void DigitalPenAP_PenInfo(ulong time, string penSerial, int penType,string penMac, int batteryPercent, int memoryPercent, int memoryUsedInBytes, string hw, string sw)
{
//Debug.WriteLine($"{penSerial} {penMac} {batteryPercent} {memoryPercent} {memoryUsedInBytes}");
}
private async void Form1_Load(object sender, EventArgs e)
{
InitPen();
}
private static readonly object splLock = new object();
private static readonly int maxCount = 500;
void ProcessBusinessData(string taskName,string[] penList)
{
}
private const int CANVAS_WIDTH = 800;
private const int CANVAS_HEIGHT = 600;
private const int MARGIN = 50;
private void digitalPenAP_PenDisconnect(ulong time, string penSerial, int penType)
{
try
{
SaveDataOperater.UpdatePenStatus(penSerial, 0);
}
catch
{
}
//penList.Remove(penSerial);
}
hdwrdist_list_t p_list = new hdwrdist_list_t();
private void SubItem_Click(object sender, EventArgs e)
{
ToolStripMenuItem item = sender as ToolStripMenuItem;
switch (item.Tag.ToString()) {
case "Info":
digitalPenAP.GetPenInfo(item.Text);
break;
case "Mem":
digitalPenAP.ClearPenMemory(item.Text);
break;
case "GetRtc":
digitalPenAP.GetPenRTC(item.Text);
break;
case "SetRtc":
{
Form form = new Form();
form.Text = "设置时间";
DateTimePicker dateTimePicker = new DateTimePicker();
dateTimePicker.Format = DateTimePickerFormat.Custom;
dateTimePicker.CustomFormat = "yyyy-MM-dd HH:mm:ss";
dateTimePicker.MinDate = new DateTime(2018, 1, 1);
dateTimePicker.Dock = DockStyle.Fill;
form.Controls.Add(dateTimePicker);
form.StartPosition = FormStartPosition.CenterParent;
form.ShowDialog();
DateTime result = dateTimePicker.Value;
TimeSpan ts = result - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
var rtc = Convert.ToUInt64(ts.TotalSeconds * 1000);
digitalPenAP.SetPenRTC(item.Text, rtc);
}
break;
case "SetPenName": //设置笔名
{
FrmSetPenName frmSetPenName = new FrmSetPenName("SetPenName", item.Text);
frmSetPenName.SpeedChangeClickEvent += FrmSetPenName_SpeedChangeClickEvent;
if (DialogResult.OK == frmSetPenName.ShowDialog()) {
}
}
break;
case "GetPenName": //获取笔名
{
digitalPenAP.GetCurrentPenNameExpose(item.Text);
}
break;
case "SetPenLed": //设置指示灯
{
FrmSetPenName frmSetPenName = new FrmSetPenName("SetPenLed", item.Text);
frmSetPenName.SpeedChangeClickEvent += FrmSetPenName_SpeedChangeClickEvent;
if (DialogResult.OK == frmSetPenName.ShowDialog())
{
}
}
break;
case "SetPenLedTemporary": //设置临时指示灯
{
FrmSetPenName frmSetPenName = new FrmSetPenName("SetPenLedTemporary", item.Text);
frmSetPenName.SpeedChangeClickEvent += FrmSetPenName_SpeedChangeClickEvent;
if (DialogResult.OK == frmSetPenName.ShowDialog())
{
}
}
break;
case "GetPenLed": //获取指示灯
{
digitalPenAP.GetCurrentPenLedExpose(item.Text);
}
break;
case "SetPenBuzzer": //设置蜂鸣器
{
FrmSetPenName frmSetPenName = new FrmSetPenName("SetPenBuzzer", item.Text);
frmSetPenName.SpeedChangeClickEvent += FrmSetPenName_SpeedChangeClickEvent;
if (DialogResult.OK == frmSetPenName.ShowDialog())
{
}
}
break;
case "SetdownTime": //设置关机时间
{
FrmSetPenName frmSetPenName = new FrmSetPenName("SetdownTime", item.Text);
frmSetPenName.SpeedChangeClickEvent += FrmSetPenName_SpeedChangeClickEvent;
if (DialogResult.OK == frmSetPenName.ShowDialog())
{
}
}
break;
case "GetdownTime": //获取关机时间
{
digitalPenAP.GetShutdownTimeExpose(item.Text);
}
break;
case "GetHandwritingDistribution": //获取笔迹分布时间
{
hdwrdist_set_ts_t p_ts = new hdwrdist_set_ts_t
{
is_get_all = true,
st_rtc = (uint)GetCurrentRtc(),
day = 9,
};
var list = new hdwrdist_list_unit_t[480];
for (int i = 0; i < 480; i++)
{
var ht = new hdwrdist_list_unit_t { hdwr_evt_cnt = 0, rtc = 0 };
list[i] = ht;
}
p_list.list_cnt = 0;
p_list.list = list;
digitalPenAP.GetCurrentHandwritingDistributionExpose(item.Text, ref p_ts, ref p_list);
}
break;
}
}
private void FrmSetPenName_SpeedChangeClickEvent(string name,string penserial, string speedStr,string speedType,int interval= 0, int buzzcount = 0, int onoff = 0, int oncevalid = 0)
{
if (name== "SetPenName")
{
digitalPenAP.SetCurrentPenNameExpose(penserial, speedStr);
}
else if (name == "SetPenLed"|| name == "SetPenLedTemporary")
{
var ledstate = LED_STATE_E.BLUE_LIGHT_ON;
var ledtype = LED_TYPE_E.BLE_CONNECT_LED;
switch (speedStr)
{
case "BLUE_LIGHT_ON":
ledstate=LED_STATE_E.BLUE_LIGHT_ON;break;
case "BLUE_LIGHT_FLASHING":
ledstate = LED_STATE_E.BLUE_LIGHT_FLASHING; break;
case "GREEN_LIGHT_ON":
ledstate = LED_STATE_E.GREEN_LIGHT_ON; break;
case "GREEN_LIGHT_FLASHING":
ledstate = LED_STATE_E.GREEN_LIGHT_FLASHING; break;
case "RED_LIGHT_ON":
ledstate = LED_STATE_E.RED_LIGHT_ON; break;
case "RED_LIGHT_FLASHING":
ledstate = LED_STATE_E.RED_LIGHT_FLASHING; break;
case "YELLOW_LIGHT_ON":
ledstate = LED_STATE_E.YELLOW_LIGHT_ON; break;
case "YELLOW_LIGHT_FLASHING":
ledstate = LED_STATE_E.YELLOW_LIGHT_FLASHING; break;
case "PINK_LIGHT_ON":
ledstate = LED_STATE_E.PINK_LIGHT_ON; break;
case "PINK_LIGHT_FLASHING":
ledstate = LED_STATE_E.PINK_LIGHT_FLASHING; break;
case "LIGHT_BLUE_LIGHT_ON":
ledstate = LED_STATE_E.LIGHT_BLUE_LIGHT_ON; break;
case "LIGHT_BLUE_LIGHT_FLASHING":
ledstate = LED_STATE_E.LIGHT_BLUE_LIGHT_FLASHING; break;
case "WHITE_LIGHT_ON":
ledstate = LED_STATE_E.WHITE_LIGHT_ON; break;
case "WHITE_LIGHT_FLASHING":
ledstate = LED_STATE_E.WHITE_LIGHT_FLASHING; break;
}
switch (speedType)
{
case "POWER_ON_LED":
ledtype = LED_TYPE_E.POWER_ON_LED; break;
case "BLE_CONNECT_LED":
ledtype = LED_TYPE_E.BLE_CONNECT_LED; break;
case "LOW_POWER_WARNING_LED":
ledtype = LED_TYPE_E.LOW_POWER_WARNING_LED; break;
case "CHARGING_LED":
ledtype = LED_TYPE_E.CHARGING_LED; break;
case "STORAGE_FULL_LED":
ledtype = LED_TYPE_E.STORAGE_FULL_LED; break;
}
if (name == "SetPenLed")
{
led_list_unit_s led_List_Unit_S = new led_list_unit_s
{
state = (byte)ledstate,
type = (byte)ledtype
};
digitalPenAP.SetCurrentPenLedExpose(penserial, ref led_List_Unit_S);
}
else
{
led_tmp_state_s led_tmp_state = new led_tmp_state_s
{
type = (byte)ledtype,
state = (byte)ledstate,
is_enable = buzzcount==1?true:false,
is_contd = onoff == 1 ? true : false,
time_sec =(byte)interval,
};
digitalPenAP.SetCurrentPenLedTemporaryExpose(penserial, ref led_tmp_state);
}
}
else if(name == "SetdownTime")
{
digitalPenAP.SetShutdownTimeExpose(penserial,(ushort)Convert.ToInt32(speedStr));
}
else if (name == "SetPenBuzzer")
{
tsdpen_buzzer_set_t tsdpen_Buzzer_Set_T = new tsdpen_buzzer_set_t
{
onoff = (uint)onoff,
buzz_freq =(uint)Convert.ToInt32(speedStr),
buzz_time = (uint)Convert.ToInt32(speedType),
buzz_interval_ms = (uint)interval,
once_buzz_count =(uint)buzzcount,
once_valid =(uint)oncevalid
};
digitalPenAP.SetCurrentPenBuzzerExpose(penserial, ref tsdpen_Buzzer_Set_T);
}
}
private void digitalPenAP_PenDown(ulong time, string penSerial, int penType)
{
//if (AllPenDrawsDic.ContainsKey(penSerial) == true)
//{
// AllPenDrawsDic[penSerial].OnPenDown(time, penSerial, penType);
SR_Pen_coordinate sr = new SR_Pen_coordinate();
sr.penSerial = penSerial;
sr.cy = 0;
sr.cx = 0;
sr.time = time;
sr.force = 0;
sr.flag = 0;
Penesult.Add(sr);
//}
}
private WebSocketServer _server;
private List<IWebSocketConnection> _allSockets;
private bool _isRunning = false;
public void socketGo() {
_allSockets = new List<IWebSocketConnection>();
_server = new WebSocketServer("ws://0.0.0.0:9000");
_server.Start(socket =>
{
socket.OnOpen = () =>
{
_allSockets.Add(socket);
};
socket.OnClose = () =>
{
_allSockets.Remove(socket);
};
socket.OnMessage = message =>
{
//socket.Send($"服务器收到:{message}");
};
});
}
private async void digitalPenAP_PenUp(ulong time, string penSerial, int penType)
{
//if (AllPenDrawsDic.ContainsKey(penSerial) == true)
// {
// AllPenDrawsDic[penSerial].OnPenUp(time, penSerial, penType);
SR_Pen_coordinate sr = new SR_Pen_coordinate();
sr.penSerial = penSerial;
sr.cy = 0;
sr.cx = 0;
sr.time = time;
sr.force = 0;
sr.flag = 2;
Penesult.Add(sr);
//}
}
private void digitalPenAP_PenCoordinate(ulong time, string penSerial, int penType, string pageSerial, int cx, int cy, ushort force)
{
//if (AllPenDrawsDic.ContainsKey(penSerial) == true)
//{
//AllPenDrawsDic[penSerial].OnPenCoordinate(time, penSerial, penType, pageSerial, cx, cy, force);
//}
SR_Pen_coordinate sr = new SR_Pen_coordinate();
sr.penSerial = penSerial;
sr.pageSerial = pageSerial;
//sr.cy = cy / (4600 / 400);
//sr.cx = cx / (4600 / 400);
sr.cy = cy;
sr.cx = cx;
sr.time = time;
sr.force = force;
sr.flag = 1;
Penesult.Add(sr);
}
//蓝牙断开的原因事件的回调函数
private static void digitalPenAP_PenBluetoothDisconnectionReason(string penSerial,ref tsdpen_rsp_bluetooth_disconnection_reason_t evt)
{
//Console.WriteLine("Pen_BluetoothDisconnectionReason:\t{0}\t{1}", penSerial, JsonConvert.SerializeObject(evt));
}
//设置笔名事件的回调函数
private static void digitalPenAP_PenSetName(string penSerial, ref tsdpen_rsp_set_pen_name_t evt)
{
//MessageBox.Show(string.Format("Pen_SetName:\nPenSerial:\t{0}\nres:\t{1}", penSerial, evt.res));
}
//获取笔名事件的回调函数
private static void digitalPenAP_PenGetName(string penSerial, ref tsdpen_rsp_get_pen_name_t evt)
{
var name = System.Text.Encoding.Default.GetString(evt.name, 0, evt.name.Length);
//MessageBox.Show(string.Format("Pen_PenGetName:\nPenSerial:\t{0}\nres:\t{1}\nname:\t{2}", penSerial, evt.res, name));
}
//设置指示灯事件的回调函数
private static void digitalPenAP_PenSetLed(string penSerial, ref tsdpen_rsp_set_pen_led_state_t evt)
{
//Console.WriteLine("Pen_PenSetLed:\t{0}\t{1}", penSerial, JsonConvert.SerializeObject(evt));
//MessageBox.Show(string.Format("PenSetLed:\nPenSerial:\t{0}\nres:\t{1}", penSerial, evt.res));
}
//设置临时指示灯事件的回调函数
private static void digitalPenAP_PenSetLedTemporary(string penSerial, ref tsdpen_rsp_set_pen_led_state_t evt)
{
//Console.WriteLine("Pen_PenSetLedTemporary:\t{0}\t{1}", penSerial, JsonConvert.SerializeObject(evt));
//MessageBox.Show(string.Format("Pen_PenSetLedTemporary:\nPenSerial:\t{0}\nres:\t{1}", penSerial, evt.res));
}
//获取指示灯信息事件的回调函数
private static void digitalPenAP_PenGetLed(string penSerial, ref tsdpen_rsp_get_pen_led_state_t evt)
{
//Console.WriteLine("Pen_GetLed:\t{0}\t{1}", penSerial, JsonConvert.SerializeObject(evt));
//MessageBox.Show(string.Format("Pen_GetLed:\nPenSerial:\t{0}\nres:\t{1}\n{2}", penSerial, evt.res, JsonConvert.SerializeObject(evt.details)));
}
//设置定时关机时间事件的回调函数
private static void digitalPenAP_PenSetShutDownTime(string penSerial, ref tsdpen_rsp_set_timeout_val_t evt)
{
//Console.WriteLine("Pen_SetShutDownTime:\t{0}\t{1}", penSerial, JsonConvert.SerializeObject(evt));
//MessageBox.Show(string.Format("Pen_SetShutDownTime:\nPenSerial:\t{0}\nres:\t{1}", penSerial, evt.res));
}
//设置蜂鸣器事件的回调函数
private static void digitalPenAP_PenSetBuzzer(string penSerial, ref tsdpen_rsp_set_buzzer_t evt)
{
//MessageBox.Show(string.Format("Pen_SetBuzzer:\nPenSerial:\t{0}\nres:\t{1}", penSerial, evt.res));
}
//获取定时关机时间事件的回调函数
private static void digitalPenAP_PenGetShutDown(string penSerial, ref tsdpen_rsp_get_timeout_val_t evt)
{
//MessageBox.Show(string.Format("Pen_GetShutDown:\nPenSerial:\t{0}\nres:\t{1}\ntime:\t{2}", penSerial, evt.res, evt.ttv));
}
//获取笔迹分布时间的回调函数
private static void digitalPenAP_PenGetHandwriting(string penSerial, ref tsdpen_rsp_get_pen_hdwrdist_t evt)
{
//MessageBox.Show(string.Format("Pen_GetHandwriting:\nPenSerial:\t{0}\nres:\t{1}\np_list:\t{2}", penSerial, evt.res, JsonConvert.SerializeObject(evt.p_list) ));
}
//电量上报事件
private static void digitalPenAP_ReceivePenBatteryChanged(string penSerial, ref tsdpen_battery_changed_t evt)
{
var set = JsonConvert.SerializeObject(evt);
try
{
SaveDataOperater.UpdatePenCharge(penSerial, evt.charge);
}
catch {
}
//Console.WriteLine("Pen_BatteryChanged:\t{0}\t{1}", penSerial, JsonConvert.SerializeObject(evt));
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
digitalPenAP.Stop();
}
private static ulong GetCurrentRtc()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToUInt64(ts.TotalSeconds * 1000);
}
private void flowLayoutPanel1_Paint(object sender, PaintEventArgs e)
{
}
/// <summary>
/// 点阵笔上报电量
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void timer1_Tick(object sender, EventArgs e)
{
List<PenStatus> lt = SaveDataOperater.GetAllPenStatus();
var jsonContent = System.Text.Json.JsonSerializer.Serialize(lt);
try
{
using (HttpClient client = new HttpClient())
{
var content = new StringContent(jsonContent, Encoding.UTF8, "application/json");
2025-12-11 10:34:27 +08:00
HttpResponseMessage response = await client.PostAsync(WindowsFormsApp.InteractiveClassroomLocalDataScan.apiUrl + "/sdk/v1/dotmatrix/pen/report", content);
2025-12-11 09:52:50 +08:00
response.EnsureSuccessStatusCode();
ServerResult sr = JsonConvert.DeserializeObject<ServerResult>(await response.Content.ReadAsStringAsync());
}
}
catch
{
}
}
/// <summary>
/// 获取用户列表数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void timer2_Tick(object sender, EventArgs e)
{
GetDataToServer();
}
private async void GetDataToServer()
{
try
{
//拉取用户ID
using (HttpClient client = new HttpClient())
{
var content = new StringContent("", Encoding.UTF8, "application/json");
2025-12-11 10:34:27 +08:00
HttpResponseMessage response = await client.GetAsync(WindowsFormsApp.InteractiveClassroomLocalDataScan.apiUrl + "/sdk/v1/class/student/pens?classId=" + ClassID);
2025-12-11 09:52:50 +08:00
response.EnsureSuccessStatusCode();
ServerResult sr = JsonConvert.DeserializeObject<ServerResult>(await response.Content.ReadAsStringAsync());
if (sr.success)
{
List<StudentPen> lt = JsonConvert.DeserializeObject<List<StudentPen>>(sr.data.ToString());
SaveDataOperater.DeleteStudentInfo();
if (lt.Count > 0)
SaveDataOperater.AddStudentInfo(lt);
}
}
//拉取模板数据
using (HttpClient client = new HttpClient())
{
var content = new StringContent("", Encoding.UTF8, "application/json");
2025-12-11 10:34:27 +08:00
HttpResponseMessage response = await client.GetAsync(WindowsFormsApp.InteractiveClassroomLocalDataScan.apiUrl + "/sdk/v1/dotmatrix/page/sync");
2025-12-11 09:52:50 +08:00
response.EnsureSuccessStatusCode();
ServerResult sr = JsonConvert.DeserializeObject<ServerResult>(await response.Content.ReadAsStringAsync());
if (sr.success)
{
List<TempListiInfoServer> lt = System.Text.Json.JsonSerializer.Deserialize<List<TempListiInfoServer>>(sr.data.ToString());
SaveDataOperater.DeleteTempListiInfo();
SaveDataOperater.AddTempListiInfo(lt);
}
}
}
catch
{
}
}
private void button1_Click(object sender, EventArgs e)
{
GetDataToServer();
}
}
}