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表示不生成指定路径的log, 1表示生成
//该日志会记录笔迹数据, 长度最好是放大一些( 不要超出unsigned int) , 示例一个文件最大10MB,最后参数标志该日志文件最多有n个( log.*.txt) , 所以最终最大可存储10MB * 11( log.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 ( ) ;
}
}
}