== Requirements ==
=== 指示灯 ===
*'''故障灯'''
#状态：
#*故障：红灯常亮。
#*正常：灯不亮。
#状态说明：
#*故障：
#**电机堵转。
#**电流检测异常。
*'''电池灯'''
#状态：
#*低电量：红灯常亮。
#*充电中：绿灯闪烁。
#*充电完成：绿灯常亮。
#*正常：灯不亮。
#判断说明：
#*低电量判断：
#**正常工作后的低电压。
#**电机正常工作时拉低电压（低电压判断需要放宽）。
#**电机堵转时拉低电压（低电压判断需要放宽）。
*'''蓝牙灯'''
#状态：
#*无连接：蓝灯闪烁。
#*连接中：蓝灯常亮。
#*非工作状态：灯不亮。
*'''Ready灯'''
#状态：
#*前组件安装完成/丝杆到位：绿灯常亮。
#*注射中：绿灯闪烁。
#*无前组件/完成注射/丝杆没到位：灯不亮。
*'''OK灯'''
#状态：
#*注射完成：绿灯常亮。
#*电机回收丝杆完成后：灯不亮。

=== 蜂鸣器 ===
#状态：
#*前组件安装完成：一声短音。
#*故障：连续3次短音。
#*完成注射：一声长音。
=== 蓝牙数据传输 ===
#状态：
#*故障：上传具体故障说明。
#*注射完成：上传注射完成时间。
=== OTA ===
#过程：
#*使用.img文件通过蓝牙对设备进行空中更新。
#*进入方式：连接蓝牙，进行.img文件通过蓝牙对设备进行空中更新。

=== 蓝牙协议 ===
#服务特征部分：
#*服务2UUID：00000000-1111-2222-2222-888888888888
#**特征1UUID：11111111-0000-0000-0000-111111111111
#**属性：用于测试时模拟用户打完针后的时间保存，写入0x12触发一次保存当下时间。
#*服务3UUID：1805
#**特征1：Current Time
#**属性：读取和修改RTC时间。
#**读写时间格式：单次时间为80位16进制数构成。
#***比如0xE6070614093A00040000
#***年：H07E6 == D2022(两位颠倒一下)
#***月：H06 == D6
#***日：H14 == D20
#***时：H09 == D9
#***分：H3A == D58
#***秒：H00 == D0
#***H040000：暂无意义。
#*服务4UUID：180F
#**特征1：Battery Level
#**属性：读取剩余电池含量。
#**读电池含量格式：单次电池含量为8位16进制数构成：
#***比如0x42，代表剩余电量66%。
#*服务5UUID：11111111-0000-0000-0000-222222222222
#**特征1UUID：11111111-0000-0000-0000-000000000002
#**属性：写入一个时间，读取写入时间以下的时间。
#**读时间格式：
#***正在修复错误时间数据：0xff44ff44（不可以进行写时间操作）
#***正在搜索：0xFF11FF11
#***错误指令：0xFF33FF33
#***没搜索到：0xFF55FF55
#***搜索成功：直接读到480字节的时间数据：
#****比如0x0107000101461300
#****秒：H01 == D1
#****分：H07 == D7
#****时：H00 == D0
#****日：H01 == D1
#****月：H01 == D1
#****年（后两个数字）：H46 == D70
#****年（前两个数字）：H13 == D19
#****H00：暂无意义。
#**写时间格式：单次时间为64位16进制数构成。
#***比如：0x0502030101461300
#***秒：H05 == D5
#***分：H02 == D2
#***时：H03 == D3
#***日：H01 == D1
#***月：H01 == D1
#***年（后两个数字）：H46 == D70
#***年（前两个数字）：H13 == D19
#***H00：暂无意义。
#***如果写：0xff000000000000ff
#***读时间将会从头开始读取。
#**特征2UUID：11111111-0000-0000-0000-000000000022
#**属性：读取特定时间是否可以读取的信息。
#**读说明：
#***读取到0xff22ff22，说明内部错误时间修复完成，可以进行正常时间读取。
#***读取到0xff44ff44，说明内部错误时间修复未完成，不可以进行正常时间读取。
#*服务6UUID：11111111-0000-0000-0000-333333333333
#**特征1UUID：11111111-0000-0000-0000-000000000001
#**属性：读写硬件版本信息，支持字符串和16进制数的写入和读出（最大25个字节）。
#**特征2UUID：11111111-0000-0000-0000-000000000011
#**属性：读写软件版本信息，支持字符串和16进制数的写入和读出（最大25个字节）。
#**特征3UUID：11111111-0000-0000-0000-000000000111
#**属性：读写序列号信息，支持字符串和16进制数的写入和读出（最大25个字节）。
#*服务7UUID：11111111-0000-0000-0000-444444444444
#**特征1UUID：11111111-0000-0000-0000-000000001111
#**属性：读写厂商信息和设备型号信息，支持字符串和16进制数的写入和读出（最大50个字节）。
#*服务8UUID：11111111-0000-0000-0000-555555555555
#**特征1UUID：11111111-0000-0000-0000-000000055555
#**属性：读电池状态，支持16进制数的读出。
#**读说明：
#***H27：正常上电状态。
#***H23：恒流状态。
#***H22：恒压状态。
#***H21：充电完成状态。
#***例如：0x2700:H27说明电池正在正常工作,H00暂无意义。
#**特征2UUID：11111111-0000-0000-0000-000000066666
#**属性：写命令进行恢复出场设置；读命令判断是否初始化完成。
#**写说明：
#***0xff88ff88：开始初始化。
#**读说明：
#***0x00000000：初始化完成。
#***0xff88ff88：初始化未完成。
#*服务9UUID：11111111-0000-0000-0000-777777777777
#**特征1UUID：11111111-0000-0000-0000-000000088888
#**属性：完成遥控模式的一系列蓝牙操作。
#***如果写：0xee0000000000ee，代表模拟组装上上组件。
#***如果写：0xdd0000000000dd，代表模拟下压针筒。
#***如果写：0xcc0000000000cc，代表模拟RESET。
#***如果写：0xbb0000000000bb，代表模拟抬起针筒。
#**特征2UUID：11111111-0000-0000-0000-000000099999
#**属性：读遥控模式返回值。
#***如果读到：0xee000000ee，说明模拟组装上上组件命令发送成功。
#***如果读到：0xdd000000dd，说明模拟下压针筒命令发送成功。
#***如果读到：0xcc000000cc，说明模拟RESET命令发送成功。
#***如果读到：0xbb000000bb，说明模拟抬起针筒命令发送成功。
#***如果读到：0x0000000000，说明已经读取完成清空了。
#**特征3UUID：11111111-0000-0000-0000-0000000aaaaa
#**属性：设置开关debug模式。
#**写说明：
#***H1：进入debug模式。
#***H0：进入正常打针模式。
#**读说明：
#***H1：在debug模式中。
#***H0：在正常打针模式中。
#**特征4UUID：11111111-0000-0000-0000-0000000bbbbb
#**属性：读取当前注射笔错误码。
#**读说明：
#***H00：无错误。
#***H01：错误：电量低。
#***H02：错误：电机复位不成功。
#***H03：错误：注射次数超出。
#***H04：错误：注射锁止时间状态锁止。
#***H05：错误：超液。
#***H06：错误：电机卡死。
#***H07：错误：空瓶。
#***H08： 错误：超瓶。
#***H09： 错误：下压堵转后电机位置不正确。

=== 流程图 ===
[[Image:ESIM流程图v1.0.2.jpg]]