esc.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953
  1. var encode = require("./encoding.js")
  2. var app = getApp();
  3. var jpPrinter = {    
  4. createNew: function() {      
  5. var jpPrinter = {};
  6. var data = [];
  7. var bar = ["UPC-A", "UPC-E", "EAN13", "EAN8", "CODE39", "ITF", "CODABAR", "CODE93", "CODE128"];
  8. jpPrinter.name = "蓝牙打印机";
  9. /**
  10. * ESC @ 初始化打印机
  11. * 清除打印缓冲区数据,打印模式被设为上电时的默认值模式
  12. */
  13. jpPrinter.init = function() {
  14. data.push(27)
  15. data.push(64)
  16. };
  17. /**
  18. *LF 打印并换行
  19. *将打印缓冲区中的数据打印出来,并且按照当前行间距,把打印纸向前推进一行。
  20. */
  21. jpPrinter.setPrint = function () {
  22. data.push(10)
  23. };
  24. /**
  25. * ESC J 打印并走纸n 个单位
  26. * 打印缓冲区数据并走纸[n × 纵向或横向移动单位]英寸。
  27. */
  28. jpPrinter.setPrintAndFeed = function (n) {
  29. data.push(27)
  30. data.push(74)
  31. data.push(n)
  32. };
  33. /**
  34. * ESC d 打印并走纸n 行
  35. * 打印缓冲区里的数据并向前走纸n 行(字符行)
  36. */
  37. jpPrinter.setPrintAndFeedRow = function (n) {
  38. data.push(27)
  39. data.push(100)
  40. data.push(n)
  41. };
  42. /**
  43. * HT 水平定位
  44. *移动打印位置到下一个水平定位点的位置
  45. */
  46. jpPrinter.setHorTab = function () {
  47. data.push(9)
  48. };
  49. /**
  50. * ESC $ 设置绝对打印位置
  51. * 将当前位置设置到距离行首(nL + nH × 256)×(横向或纵向移动单位)处。
  52. * 传入参数为点数
  53. * 1mm=8dot
  54. */
  55. jpPrinter.setAbsolutePrintPosition = function (where) {
  56. data.push(27)
  57. data.push(36)
  58. data.push(parseInt(where % 256))
  59. data.push(parseInt(where / 256))
  60. };
  61. /**
  62. * ESC \ 设置相对横向打印位置
  63. * 以横向或纵向移动单位设置横向相对位移
  64. * 传入参数为点数
  65. * 1mm=8dot
  66. */
  67. jpPrinter.setRelativePrintPositon = function (where) { //设置相对横向打印位置
  68. data.push(27)
  69. data.push(92)
  70. data.push(parseInt(where % 256))
  71. data.push(parseInt(where / 256))
  72. };
  73. /**
  74. * ESC a 选择对齐方式
  75. * 使所有的打印数据按某一指定对齐方式排列。
  76. * n 的取值与对齐方式对应关系如下
  77. * • 当n 为0 时 : 左对齐
  78. * • 当n 为1 时 : 中间对齐
  79. * • 当n 为2 时 右对齐
  80. */
  81. jpPrinter.setSelectJustification = function (which) {
  82. data.push(27)
  83. data.push(97)
  84. data.push(which)
  85. };
  86. /**
  87. * GS L 设置左边距
  88. * 传入参数为点数
  89. * 1mm=8dot
  90. */
  91. jpPrinter.setLeftMargin = function (n) {
  92. data.push(29)
  93. data.push(76)
  94. data.push(parseInt(n % 256))
  95. data.push(parseInt(n / 256))
  96. };
  97. /**
  98. * GS W 设置打印区域宽度
  99. * 传入参数为点数
  100. * 1mm=8dot
  101. */
  102. jpPrinter.setPrintingAreaWidth = function (width) {
  103. data.push(29)
  104. data.push(87)
  105. data.push(parseInt(width % 256))
  106. data.push(parseInt(width / 256))
  107. };
  108. /**
  109. * GS P 设置横向和纵向移动单位
  110. * 传入参数为点数
  111. * 1mm=8dot
  112. */
  113. jpPrinter.setHorizontalAndVertical=function(x,y){
  114. data.push(29)
  115. data.push(80)
  116. data.push(x)
  117. data.push(y)
  118. };
  119. /**
  120. * DLE DC4 实时产生钱箱开启脉冲
  121. * 在指定的钱箱插座引脚产生设定的开启脉冲,引脚由m 指定:
  122. m 连接引脚
  123. 0 钱箱插座引脚2
  124. 1 钱箱插座引脚5
  125. * 脉冲高电平时间为[t × 100 ms],低电平的时间为[t × 100 ms]
  126. */
  127. jpPrinter.setCashboxPulse=function(n,m,t){
  128. data.push(16)
  129. data.push(20)
  130. data.push(n)
  131. data.push(m)
  132. data.push(t)
  133. };
  134. /**
  135. * ESC c 3 选择打印纸传感器以输出缺纸信号
  136. * 传入参数说明
  137. * • 当n 为0 时:关闭纸将尽传感器
  138. * • 当n 为1 时:开启纸将尽传感器
  139. * • 当n 为2 时:开启纸将尽传感器
  140. * • 当n 为3 时:开启纸尽传感器
  141. * • 当n 为4 时:开启纸尽传感器
  142. */
  143. jpPrinter.setPrintPageSignal=function(n){
  144. data.push(27)
  145. data.push(99)
  146. data.push(51)
  147. data.push(n)
  148. };
  149. /**
  150. * ESC c 4 选择打印纸传感器以停止打印
  151. * 传入参数说明
  152. * • 当n 为0 时:禁止纸将尽传感器
  153. * • 当n 为1 时:允许纸将尽传感器
  154. * • 当n 为2 时:允许纸将尽传感器
  155. */
  156. jpPrinter.setSensorToStopPrint = function (n) {
  157. data.push(27)
  158. data.push(99)
  159. data.push(52)
  160. data.push(n)
  161. };
  162. /**
  163. * ESC c 5 允许/禁止按键
  164. * 允许/禁止按键
  165. * 传入参数说明
  166. * • 当n 为0 时,按键起作用。
  167. * • 当n 为1 时,按键被禁止。
  168. */
  169. jpPrinter.setSelectKey = function (n) {
  170. data.push(27)
  171. data.push(99)
  172. data.push(53)
  173. data.push(n)
  174. };
  175. /**
  176. * ESC p 产生钱箱控制脉冲
  177. * 输出由t1 和t2 设定的钱箱开启脉冲到由m 指定的引脚:
  178. * 传入参数说明
  179. * • 当m 为0 时,钱箱插座的引脚2
  180. * • 当m 为1 时,钱箱插座的引脚5
  181. */
  182. jpPrinter.setCashCashboxPulse=function(m,t1,t2){
  183. data.push(27)
  184. data.push(112)
  185. data.push(m)
  186. data.push(t1)
  187. data.push(t2)
  188. };
  189. /**
  190. * ESC = 选择打印机
  191. * 选择打印机,被选择的打印机可以接收主计算机发送的数据
  192. * 传入参数说明
  193. * • 当n 为0 时,打印机禁止
  194. * • 当n 为1 时,打印机允许。
  195. */
  196. jpPrinter.setSelectPrinter=function(n){
  197. data.push(27)
  198. data.push(112)
  199. data.push(n)
  200. };
  201. /**
  202. * ESC 2 设置默认行间距
  203. *选择默认行间距
  204. */
  205. jpPrinter.setDefaultLineSpace=function(){
  206. data.push(27)
  207. data.push(50)
  208. };
  209. /**
  210. * ESC 3 设置行间距
  211. * 传入参数为点数
  212. * 1mm=8dot
  213. */
  214. jpPrinter.setLineSpace = function (n) {
  215. data.push(27)
  216. data.push(51)
  217. data.push(n)
  218. };
  219. /**
  220. * ESC SP 设置字符右间距
  221. * 传入参数为点数
  222. * 1mm=8dot
  223. */
  224. jpPrinter.setCharacterRightSpace=function(n){
  225. data.push(27)
  226. data.push(32)
  227. data.push(n)
  228. };
  229. /**
  230. * ESC ! 选择打印模式
  231. * 传入参数说明
  232. * 根据n 的值设置字符打印模式
  233. */
  234. jpPrinter.setPrintMode = function (mode) { //设置打印模式
  235. data.push(27)
  236. data.push(33)
  237. data.push(mode)
  238. }
  239. /**
  240. * ESC % 选择/取消用户自定义字符
  241. * • 当n 为0 时,不使用用户自定义字符。
  242. * • 当n 为1 时,使用用户自定义字符。
  243. */
  244. jpPrinter.setUserDefinitionCharacter=function(n){
  245. data.push(27)
  246. data.push(37)
  247. data.push(n)
  248. };
  249. /**
  250. * ESC – 选择/取消下划线模式
  251. * 传入参数说明
  252. * • 当n 为0 时:取消下划线模式
  253. * • 当n 为1 时:选择下划线模式(1 点宽)
  254. * • 当n 为2 时:选择下划线模式(2 点宽)
  255. */
  256. jpPrinter.setUnderlineMode=function(n){
  257. data.push(27)
  258. data.push(45)
  259. data.push(n)
  260. };
  261. /**
  262. * ESC ? 取消用户自定义字符
  263. * 传入参数说明
  264. * 取消用户自定义字符中代码为n 的字符。取消后,此字符使用内部字库
  265. */
  266. jpPrinter.setCancleUserDefinitionCharacter = function(n){
  267. data.push(27)
  268. data.push(63)
  269. data.push(n)
  270. };
  271. /**
  272. * ESC E 选择/取消加粗模式
  273. * 传入参数说明
  274. * 当n 为0 时,取消加粗模式。
  275. * 当n 为1 时,选择加粗模式。
  276. */
  277. jpPrinter.setBoldMode=function(n){
  278. data.push(27)
  279. data.push(69)
  280. data.push(n)
  281. };
  282. /**
  283. * ESC G 选择/取消双重打印模式
  284. *传入参数说明
  285. *• 当n 位为0 时,取消双重打印模式。
  286. *• 当n 位为1 时,选择双重打印模式。
  287. */
  288. jpPrinter.setDoublePrintMode=function(n){
  289. data.push(27)
  290. data.push(71)
  291. data.push(n)
  292. };
  293. /**
  294. * ESC M 选择字体
  295. * 传入参数说明
  296. * • 当n 位为0 时, 选择标准ASCII 码字体(12 × 24)
  297. * • 当n 位为1 时, 选择压缩ASCII 码字体(9 × 17))
  298. */
  299. jpPrinter.setSelectFont=function(n){
  300. data.push(27)
  301. data.push(77)
  302. data.push(n)
  303. };
  304. /**
  305. * ESC R 选择国际字符集
  306. * 传入参数说明
  307. * • 当n 位为0 时, 选择美国(默认)
  308. * • 当n 位为1 时, 选择法国
  309. * • 当n 位为2 时, 选择德国
  310. * • 当n 位为3 时, 选择英国
  311. * • 当n 位为4 时, 选择丹麦I
  312. * • 当n 位为5 时, 选择瑞典
  313. * • 当n 位为6 时, 选择意大利
  314. * • 当n 位为7 时, 选择西班牙I
  315. * • 当n 位为8 时, 选择日本
  316. * • 当n 位为9 时, 选择挪威
  317. * • 当n 位为10 时, 选择丹麦II
  318. * • 当n 位为11 时, 选择西班牙II
  319. * • 当n 位为12 时, 选择拉丁美洲
  320. * • 当n 位为13 时, 选择韩国
  321. * • 当n 位为14 时, 选择斯洛维尼亚/克罗帝亚
  322. * • 当n 位为15 时, 选择中国
  323. */
  324. jpPrinter.setInternationalCharacters=function(n){
  325. data.push(27)
  326. data.push(82)
  327. data.push(n)
  328. };
  329. /**
  330. * ESC V 选择/取消顺时针旋转90 度
  331. * 传入参数说明
  332. * • 当n 位为0 时, 取消顺时针旋转90 度模式
  333. * • 当n 位为1 时,选择顺时针旋转90 度模式
  334. */
  335. jpPrinter.setRotate90=function(n){
  336. data.push(27)
  337. data.push(86)
  338. data.push(n)
  339. };
  340. /**
  341. * ESC t 选择字符代码页
  342. * 传入参数说明
  343. * • 当n 位为0 时, 选择PC437 [美国,欧洲标准](默认)
  344. * • 当n 位为1 时, 选择日文片假名
  345. * • 当n 位为2 时, 选择PC850 [多语言]
  346. * • 当n 位为3 时, 选择PC860 [葡萄牙语]
  347. * • 当n 位为4 时, 选择PC863 [加拿大-法语]
  348. * • 当n 位为5 时, 选择PC865 [北欧]
  349. * • 当n 位为6 时, 选择West Europe
  350. * • 当n 位为7 时, 选择Greek
  351. * • 当n 位为8 时, 选择Hebrew
  352. * • 当n 位为9 时, 选择PC755:East Europe
  353. * • 当n 位为10 时, 选择Iran
  354. *
  355. * • 当n 位为16 时, 选择WPC1252
  356. * • 当n 位为17 时, 选择PC866:Cyrillice*2
  357. * • 当n 位为18 时, 选择PC852:Latin2
  358. * • 当n 位为19 时, 选择PC858
  359. * • 当n 位为20 时, 选择Inrall
  360. * • 当n 位为21 时, 选择Latvian
  361. * • 当n 位为22 时, 选择Arabic
  362. * • 当n 位为23 时, 选择PT151,1251
  363. * • 当n 位为24 时, 选择PC747
  364. * • 当n 位为25 时, 选择WPC1257
  365. *
  366. * • 当n 位为27 时, 选择Vietnam
  367. * • 当n 位为28 时, 选择PC864
  368. * • 当n 位为29 时, 选择PC1001
  369. * • 当n 位为30 时, 选择Uygur
  370. *
  371. * • 当n 位为255 时, 选择Uygur
  372. * 打印机支持代码页请以打印机自检测试页为准
  373. */
  374. jpPrinter.setCodePage=function(n){
  375. data.push(27)
  376. data.push(116)
  377. data.push(n)
  378. };
  379. /**
  380. * ESC { 选择/取消倒置打印模式
  381. * 传入参数说明
  382. * • 当n 位为0 时, 选择PC437 [美国,欧洲标准](默认)
  383. * • 当n 位为1 时, 选择日文片假名
  384. */
  385. jpPrinter.setInvertPrintMode = function (n) {
  386. data.push(27)
  387. data.push(123)
  388. data.push(n)
  389. };
  390. /**
  391. * GS ! 选择字符大小
  392. * 传入参数说明
  393. *(1 ≤ 纵向放大倍数≤ 8,1 ≤ 横向放大倍数≤ 8)
  394. *一个byte 有8 位,用0 到2 位选择字符高度,4 到6 位选择字符宽度
  395. * • 当n 位为0 时, 正常
  396. * • 当n 位为16 时,2(倍宽)
  397. * • 当n 位为32 时,3(倍宽)
  398. * • 当n 位为48 时,4(倍宽)
  399. * • 当n 位为64 时,5(倍宽)
  400. * • 当n 位为80 时,6(倍宽)
  401. * • 当n 位为96 时,7(倍宽)
  402. * • 当n 位为112 时,8(倍宽)
  403. *
  404. * • 当n 位为16 时,2(倍高)
  405. * • 当n 位为32 时,3(倍高)
  406. * • 当n 位为48 时,4(倍高)
  407. * • 当n 位为64 时,5(倍高)
  408. * • 当n 位为80 时,6(倍高)
  409. * • 当n 位为96 时,7(倍高)
  410. * • 当n 位为112 时,8(倍高)
  411. * 若需要倍宽倍高,请在同等倍数下相加 如17为倍宽倍高
  412. */
  413. jpPrinter.setCharacterSize=function(n){
  414. data.push(29)
  415. data.push(33)
  416. data.push(n)
  417. };
  418. /**
  419. * GS B 选择/取消黑白反显打印模式
  420. * 传入参数说明
  421. * • 当n 位为0 时,取消反显打印
  422. * • 当n 位为1 时,选择反显打印
  423. */
  424. jpPrinter.setReverseMode=function(n){
  425. data.push(29)
  426. data.push(66)
  427. data.push(n)
  428. };
  429. function convertPartialToBitmap(w, start_y, bith, pitch, res) {
  430. console.log('convert bitmap: ' + w + ', ' + start_y + ', ' + bith + ', ' + pitch);
  431. var bits = new Uint8Array(bith*pitch);
  432. data.push(29) // 0x1D
  433. data.push(118) // 0x76
  434. data.push(48) // 0x30
  435. data.push(0) // 0x00
  436. data.push(parseInt(pitch % 256));
  437. data.push(parseInt(pitch / 256));
  438. data.push(parseInt(bith % 256));
  439. data.push(parseInt(bith / 256));
  440. for (var y = 0; y < bith; y++) {
  441. for (var x = 0; x < w; x++) {
  442. var color = res.data[((y + start_y) * w + x) * 4];
  443. if (color < 128) {
  444. bits[parseInt(y * pitch + x/8)] |= (0x80 >> (x%8));
  445. }
  446. }
  447. }
  448. for(var i=0; i<bits.length; i++) {
  449. data.push(bits[i]);
  450. }
  451. }
  452. /*
  453. 单色图片转成多张bitmap, 高度按BLOCK_SIZE拆分图片
  454. */
  455. function convertToMultiBitmap(res) {
  456. var w = res.width;
  457. var h = res.height;
  458. const BLOCK_SIZE = 128;
  459. var pitch = parseInt((w+7)/8);
  460. var block = parseInt((h + BLOCK_SIZE - 1) / BLOCK_SIZE);
  461. console.log(w + "--" + h);
  462. for(var i=0; i<block; i++) {
  463. var bith = BLOCK_SIZE;
  464. if(i * BLOCK_SIZE + bith > h) {
  465. bith = h - i * BLOCK_SIZE;
  466. }
  467. convertPartialToBitmap(w, i*BLOCK_SIZE, bith, pitch, res);
  468. }
  469. console.log(data);
  470. }
  471. /*
  472. 单色图片整图转成一张bitmap
  473. */
  474. function convertToSingleBitmap(res) {
  475. console.log(res)
  476. var w = res.width;
  477. var h = res.height;
  478. var bitw = parseInt((w+7)/8)*8;
  479. var bith = h;
  480. var pitch = parseInt(bitw / 8);
  481. var bits = new Uint8Array(bith*pitch);
  482. console.log(w + "--" + h);
  483. console.log("bitw="+bitw+", bith="+bith+", pitch="+pitch);
  484. data.push(29) // 0x1D
  485. data.push(118) // 0x76
  486. data.push(48) // 0x30
  487. data.push(0) // 0x00
  488. data.push(parseInt(pitch % 256));
  489. data.push(parseInt(pitch / 256));
  490. data.push(parseInt(bith % 256));
  491. data.push(parseInt(bith / 256));
  492. console.log(res.data.length)
  493. for (var y = 0; y < h; y++) {
  494. for (var x = 0; x < w; x++) {
  495. var color = res.data[(y * w + x) * 4];
  496. if (color < 128) {
  497. bits[parseInt(y * pitch + x/8)] |= (0x80 >> (x%8));
  498. }
  499. }
  500. }
  501. for(var i=0; i<bits.length; i++) {
  502. data.push(bits[i]);
  503. }
  504. }
  505. /**
  506. * GS v 0 打印光栅位图
  507. *
  508. */
  509. jpPrinter.setBitmap = function (res) { //参数,画布的参数
  510. console.log(res)
  511. convertToSingleBitmap(res) // 转成单张位图
  512. //convertToMultiBitmap(res) // 转成多张位图
  513. console.log(data);
  514. };
  515. /**
  516. * GS H 选择HRI 字符的打印位置
  517. * 传入参数说明
  518. * • 当n 位为0 时,不打印
  519. * • 当n 位为1 时,条码上方
  520. * • 当n 位为2 时,条码下方
  521. * • 当n 位为3 时,条码上、下方
  522. */
  523. jpPrinter.setHRIPosition = function (position) {
  524. data.push(29)
  525. data.push(72)
  526. data.push(position)
  527. };
  528. /**
  529. * GS f 选择HRI 使用字体
  530. * 传入参数说明
  531. * • 当n 位为0 时,标准ASCII 码字符(12 × 24)
  532. * • 当n 位为1 时,压缩ASCII 码字符(9 × 17)
  533. */
  534. jpPrinter.setHRIFont = function (font) {
  535. data.push(29)
  536. data.push(102)
  537. data.push(font)
  538. };
  539. /**
  540. * GS h 选择条码高度
  541. * 传入参数说明
  542. * 2 ≤ n ≤ 6
  543. */
  544. jpPrinter.setBarcodeWidth = function (width) {
  545. data.push(29)
  546. data.push(119)
  547. if (width > 6) {
  548. width = 6;
  549. }
  550. if (width < 2) {
  551. width = 1;
  552. }
  553. data.push(width)
  554. };
  555. /**
  556. * GS h 选择条码高度
  557. * 传入参数说明
  558. * 1 ≤ n ≤ 255
  559. */
  560. jpPrinter.setBarcodeHeight = function (height) {
  561. data.push(29)
  562. data.push(104)
  563. data.push(height)
  564. };
  565. /**
  566. * 打印条码128类型
  567. */
  568. jpPrinter.setCode128 = function (content) {
  569. data.push(29)
  570. data.push(107)
  571. data.push(73)
  572. var code = new encode.TextEncoder(
  573. 'gb18030', {
  574. NONSTANDARD_allowLegacyEncoding: true
  575. }).encode(content)
  576. data.push(code.length)
  577. for (var i = 0; i < code.length; ++i) {
  578. data.push(code[i])
  579. }
  580. };
  581. /**
  582. * 打印条码
  583. * 传入参数说明
  584. * t:条码类型
  585. * content:内容
  586. */
  587. jpPrinter.setBarcodeContent = function (t, content) {
  588. var ty = 73;
  589. data.push(29)
  590. data.push(107)
  591. switch (t) {
  592. case bar[0]:
  593. ty = 65;
  594. break;
  595. case bar[1]:
  596. ty = 66;
  597. break;
  598. case bar[2]:
  599. ty = 67;
  600. break;
  601. case bar[3]:
  602. ty = 68;
  603. break;
  604. case bar[4]:
  605. ty = 69;
  606. break;
  607. case bar[5]:
  608. ty = 70;
  609. break;
  610. case bar[6]:
  611. ty = 71;
  612. break;
  613. case bar[7]:
  614. ty = 72;
  615. break;
  616. case bar[8]:
  617. ty = 73;
  618. break;
  619. }
  620. data.push(ty)
  621. data.push(content)
  622. };
  623. /**
  624. * FS ! 设置汉字字符模式
  625. * 传入参数说明
  626. * • 当n 位为0 时,取消倍宽、倍高、取消下划线
  627. * • 当n 位为4 时,选择倍宽
  628. * • 当n 位为8 时,选择倍高
  629. * • 当n 位为128 时,选择下划线
  630. */
  631. jpPrinter.setChineseCharacterMode=function(n){
  632. data.push(28)
  633. data.push(33)
  634. data.push(n)
  635. };
  636. /**
  637. * FS & 选择汉字模式
  638. */
  639. jpPrinter.setSelectChineseCharacter=function(){
  640. data.push(28)
  641. data.push(38)
  642. };
  643. /**
  644. * FS . 取消汉字模式
  645. */
  646. jpPrinter.setCancelChineseCharacter = function () {
  647. data.push(28)
  648. data.push(46)
  649. };
  650. /**
  651. * FS - 选择/取消汉字下划线模式
  652. * 传入参数说明
  653. * • 当n 位为0 时,取消汉字下划线
  654. * • 当n 位为1 时,选择汉字下划线(1 点宽)
  655. * • 当n 位为2 时,选择汉字下划线(2 点宽)
  656. */
  657. jpPrinter.setCancelUnderLine=function(n){
  658. data.push(28)
  659. data.push(45)
  660. data.push(n)
  661. };
  662. /**
  663. * FS S 设置汉字字符左右间距
  664. * 传入参数说明
  665. * 分别将汉字的左间距和右间距设置为n1 和n2
  666. * 传入点数,1mm=8dot
  667. */
  668. jpPrinter.setChineseCharacterSpace=function(n1,n2){
  669. data.push(28)
  670. data.push(83)
  671. data.push(n1)
  672. data.push(n2)
  673. };
  674. /**
  675. * FS W 选择/取消汉字倍高倍宽
  676. * • 当n 的最低位为0,取消汉字倍高倍宽模式。
  677. * • 当n 的最低位为1,选择汉字倍高倍宽模式。
  678. */
  679. jpPrinter.setChineseCharacteHeightWidth=function(n){
  680. data.push(28)
  681. data.push(87)
  682. data.push(n)
  683. };
  684. /**
  685. * GS ( F 设置黑标定位偏移量
  686. * 该命令用于选择黑标定位控制允许,且设置切/撕纸位置或起始打印位置相对于黑标检测的偏移值。该值以点数计算。
  687. * p
  688. * 传入点数
  689. *
  690. * a = 1, 2;
  691. * a=1:设置起始打印位置相对于黑标检测位置的偏移量
  692. * a=2:设置切/撕纸位置相对于黑标检测位置的偏移量
  693. *
  694. * m = 0, 48
  695. * m=0 或48,选择偏移量为前进纸方向计算;
  696. *
  697. * 0 ≤ n ≤ 1700
  698. */
  699. jpPrinter.setBlackMaskOffset = function (p,a,m,n) {
  700. data.push(29)
  701. data.push(40)
  702. data.push(70)
  703. data.push(p%256)
  704. data.push(p/256)
  705. data.push(a)
  706. data.push(m)
  707. data.push(n%256)
  708. data.push(n/256)
  709. };
  710. /**
  711. * GS FF 设置黑标至打印起始位置
  712. */
  713. jpPrinter.setBlackMarkStart = function () {//黑标至打印起始位置
  714. data.push(29)
  715. data.push(12)
  716. };
  717. /**
  718. * GS V 选择切纸模式并切纸
  719. * 半切
  720. */
  721. jpPrinter.setCutter= function () {
  722. data.push(29)
  723. data.push(86)
  724. data.push(1)
  725. } ;
  726. /**
  727. * GS V 选择切纸模式并切纸
  728. * 传入参数说明
  729. * 传入点数,1mm=8dot
  730. * 进纸n 并且半切纸
  731. */
  732. jpPrinter.setCut = function (n) {
  733. data.push(29)
  734. data.push(86)
  735. data.push(101)
  736. data.push(n)
  737. };
  738. /**
  739. * ESC B 打印机来单打印蜂鸣提示
  740. * 传入参数说明
  741. * 1 ≤ n ≤ 9
  742. * 1 ≤ t ≤ 9
  743. * n 是指蜂鸣器鸣叫次数。
  744. * t 是指蜂鸣器鸣每次数鸣叫时间为(t × 50) ms
  745. */
  746. jpPrinter.setSound = function (n, t) { //设置蜂鸣器
  747. data.push(27)
  748. data.push(66)
  749. if (n < 0) {
  750. n = 1;
  751. } else if (n > 9) {
  752. n = 9;
  753. }
  754. if (t < 0) {
  755. t = 1;
  756. } else if (t > 9) {
  757. t = 9;
  758. }
  759. data.push(n)
  760. data.push(t)
  761. };
  762. /**
  763. * ESC C 打印机来单打印蜂鸣提示及报警灯闪烁
  764. * 传入参数说明
  765. * 1 ≤ m ≤ 20,1 ≤ t ≤ 20,0 ≤ n ≤ 3
  766. *
  767. * m:指报警灯闪烁次数或蜂鸣器鸣叫次数
  768. *
  769. * t:指报警灯闪烁间隔时间为(t × 50) ms 或蜂鸣器鸣叫间隔时间为(t × 50) ms
  770. *
  771. * 当n = 0 时,蜂鸣器不鸣叫,同时报警灯不闪烁
  772. * 当n = 1 时,蜂鸣器鸣叫
  773. * 当n = 2 时,报警灯闪烁
  774. * 当n = 3 时,蜂鸣器鸣叫,同时报警灯闪烁
  775. */
  776. jpPrinter.setOrderTip=function(m,t,n){
  777. data.push(27)
  778. data.push(67)
  779. if (m < 0) {
  780. m = 1;
  781. } else if (m > 20) {
  782. n = 20;
  783. }
  784. if (t < 0) {
  785. t = 1;
  786. } else if (t > 20) {
  787. t = 20;
  788. }
  789. if (n < 0) {
  790. n = 1;
  791. } else if (n > 3) {
  792. n = 3;
  793. }
  794. data.push(m)
  795. data.push(t)
  796. data.push(n)
  797. };
  798. /**
  799. * 设置QRCode 模块大小为n dot
  800. * 传入参数说明
  801. * 1 ≤ n ≤ 15
  802. * [默认值] n = 3
  803. */
  804. jpPrinter.setSelectSizeOfModuleForQRCode = function(n) { //设置二维码大小
  805. data.push(29)
  806. data.push(40)
  807. data.push(107)
  808. data.push(3)
  809. data.push(0)
  810. data.push(49)
  811. data.push(67)
  812. if (n > 15) {
  813. n = 15
  814. }
  815. if (n < 1) {
  816. n = 1
  817. }
  818. data.push(n)
  819. };
  820. /**
  821. * 选择QRCode 纠错等级
  822. * 传入参数说明
  823. * n 功能 纠错能力
  824. * 48 选择纠错等级 L 7
  825. * 49 选择纠错等级 M 15
  826. * 50 选择纠错等级 Q 25
  827. * 51 选择纠错等级 H 30
  828. */
  829. jpPrinter.setSelectErrorCorrectionLevelForQRCode = function(n) {
  830. data.push(29)
  831. data.push(40)
  832. data.push(107)
  833. data.push(3)
  834. data.push(0)
  835. data.push(49)
  836. data.push(69)
  837. data.push(n)
  838. };
  839. /**
  840. * 存储QRCode 数据(d1...dk)到符号存储区
  841. */
  842. jpPrinter.setStoreQRCodeData = function(content) {
  843. var code = new encode.TextEncoder(
  844. 'gb18030', {
  845. NONSTANDARD_allowLegacyEncoding: true
  846. }).encode(content)
  847. data.push(29)
  848. data.push(40)
  849. data.push(107)
  850. data.push(parseInt((code.length + 3) % 256))
  851. data.push(parseInt((code.length + 3) / 256))
  852. data.push(49)
  853. data.push(80)
  854. data.push(48)
  855. for (var i = 0; i < code.length; ++i) {
  856. data.push(code[i])
  857. }
  858. };
  859. /**
  860. * 打印QRCode 条码
  861. */
  862. jpPrinter.setPrintQRCode = function() {
  863. data.push(29)
  864. data.push(40)
  865. data.push(107)
  866. data.push(3)
  867. data.push(0)
  868. data.push(49)
  869. data.push(81)
  870. data.push(48)
  871. };
  872. /**
  873. * 设置GB18030编码格式文字
  874. */
  875. jpPrinter.setText = function (content) {
  876. var code = new encode.TextEncoder(
  877. 'gb18030', {
  878. NONSTANDARD_allowLegacyEncoding: true
  879. }).encode(content)
  880. for (var i = 0; i < code.length; ++i) {
  881. data.push(code[i])
  882. }
  883. };
  884. /**
  885. * 添加用户自定义指令
  886. */
  887. jpPrinter.setUserCommand = function (content) { //添加用户指令
  888. data.push(content)
  889. };
  890. jpPrinter.getData = function() { //获取打印数据
  891. return data;
  892. };
  893. jpPrinter.clearData = function () { //获取打印数据
  894. if(data.length>0){
  895. data.clearData
  896. }
  897. };
  898. return jpPrinter; 
  899. },
  900. Query: function() {
  901. var queryStatus = {};
  902. var buf;
  903. var dateView;
  904. queryStatus.getRealtimeStatusTransmission = function(n) { //查询打印机实时状态
  905. /*
  906. n = 1:传送打印机状态
  907. n = 2:传送脱机状态
  908. n = 3:传送错误状态
  909. n = 4:传送纸传感器状态
  910. */
  911. buf = new ArrayBuffer(3)
  912. dateView = new DataView(buf)
  913. dateView.setUint8(0, 16)
  914. dateView.setUint8(1, 4)
  915. dateView.setUint8(2, n)
  916. queryStatus.query(buf)
  917. }
  918. queryStatus.query = function(buf) {
  919. wx.writeBLECharacteristicValue({
  920. deviceId: app.BLEInformation.deviceId,
  921. serviceId: app.BLEInformation.writeServiceId,
  922. characteristicId: app.BLEInformation.writeCharaterId,
  923. value: buf,
  924. success: function(res) {
  925. },
  926. complete: function(res) {
  927. console.log(res)
  928. buf = null
  929. dateView = null;
  930. }
  931. })
  932. }
  933. return queryStatus;
  934. }
  935. };
  936. module.exports.jpPrinter = jpPrinter;