|
|
@@ -1,4 +1,4 @@
|
|
|
-#include "../pch/pch.h"
|
|
|
+#include "../pch/pch.h"
|
|
|
#include "CPosPrinter.h"
|
|
|
|
|
|
#include <winioctl.h>
|
|
|
@@ -16,20 +16,20 @@ CPosPrinter::~CPosPrinter()
|
|
|
|
|
|
bool CPosPrinter::Init()
|
|
|
{
|
|
|
- //遍历USB设备,找到POS打印机路径
|
|
|
- //设备路径
|
|
|
+ //遍历USB设备,找到POS打印机路径
|
|
|
+ //璁惧�璺�緞
|
|
|
TCHAR * szDevicePath[MAX_DEVICE];
|
|
|
- //设置中文字符
|
|
|
+ //璁剧疆涓�枃瀛楃�
|
|
|
setlocale(LC_CTYPE, "chs");
|
|
|
TCHAR* Port = NULL;
|
|
|
|
|
|
- //分配需要的空间
|
|
|
+ //鍒嗛厤闇€瑕佺殑绌洪棿
|
|
|
for(int i = 0; i < MAX_DEVICE; i++)
|
|
|
{
|
|
|
szDevicePath[i] = new TCHAR[256];
|
|
|
}
|
|
|
|
|
|
- //取设备路径
|
|
|
+ //取设备路径
|
|
|
int nDevice = GetDevicePath((LPGUID)&USB_GUID, szDevicePath);
|
|
|
int i = 0;
|
|
|
|
|
|
@@ -46,7 +46,7 @@ bool CPosPrinter::Init()
|
|
|
|
|
|
if(m_hPort == INVALID_HANDLE_VALUE)
|
|
|
{
|
|
|
- // 打开端口失败
|
|
|
+ // 鎵撳紑绔�彛澶辫触
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
@@ -56,26 +56,276 @@ bool CPosPrinter::Init()
|
|
|
void CPosPrinter::PrintWaimaiOrder(CWaimaiOrder& order)
|
|
|
{
|
|
|
POS_Reset();
|
|
|
- POS_SetMotionUnit(180, 180);
|
|
|
|
|
|
- string shop_name = "#" + order.m_restaurant_number + " " + CLewaimaiString::UTF8ToANSI(order.m_shop_name);
|
|
|
- POS_S_TextOut(shop_name);
|
|
|
+ string shop_name = "#" + order.m_restaurant_number + " " + CLewaimaiString::UTF8ToANSI(order.m_shop_name);
|
|
|
+ POS_TextOut(shop_name, true);
|
|
|
POS_FeedLine();
|
|
|
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ if (order.m_is_selftake == "1")
|
|
|
+ {
|
|
|
+ POS_TextOut("鍒板簵鑷�彇璁㈠崟", false, 1);
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ POS_TextOut("鍙栭�鍙凤細" + CLewaimaiString::UTF8ToANSI(order.m_take_food_code), true, 1);
|
|
|
+ POS_FeedLine();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ POS_TextOut("澶栧崠璁㈠崟", false, 1);
|
|
|
+ POS_FeedLine();
|
|
|
+ }
|
|
|
+
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ if(order.m_is_selftake == "1")
|
|
|
+ {
|
|
|
+ //自取订单,打印自取信息
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //璁㈠崟鏉ユ簮
|
|
|
+ string from_type = "订单来源:" + CLewaimaiString::UTF8ToANSI(order.m_from_type);
|
|
|
+ POS_TextOut(from_type);
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ //订单号
|
|
|
+ string order_no = "璁㈠崟鍙凤細" + CLewaimaiString::UTF8ToANSI(order.m_order_no);
|
|
|
+ POS_TextOut(order_no);
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ //濮撳悕
|
|
|
+ if (order.m_is_selftake != "1")
|
|
|
+ {
|
|
|
+ string name = "姓名:" + CLewaimaiString::UTF8ToANSI(order.m_customer_name);
|
|
|
+ POS_TextOut(name);
|
|
|
+ POS_FeedLine();
|
|
|
+ }
|
|
|
+
|
|
|
+ //鐢佃瘽
|
|
|
+ string phone = "电话:" + CLewaimaiString::UTF8ToANSI(order.m_phone);
|
|
|
+ POS_TextOut(phone);
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ //鍦板潃
|
|
|
+ if (order.m_is_selftake != "1")
|
|
|
+ {
|
|
|
+ string address = "地址:" + CLewaimaiString::UTF8ToANSI(order.m_address);
|
|
|
+ POS_TextOut(address);
|
|
|
+ POS_FeedLine();
|
|
|
+ }
|
|
|
+
|
|
|
+ //棰勮�閫夐」
|
|
|
+ if (order.m_order_field.size() > 1)
|
|
|
+ {
|
|
|
+ for (std::vector<CWaimaiOrderField>::iterator it = order.m_order_field.begin(); it != order.m_order_field.end() - 1; it++)
|
|
|
+ {
|
|
|
+ string order_field = CLewaimaiString::UTF8ToANSI((*it).name) + ":" + CLewaimaiString::UTF8ToANSI((*it).value);
|
|
|
+ POS_TextOut(order_field, false, 0);
|
|
|
+ POS_FeedLine();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //涓嬪崟鏃堕棿
|
|
|
+ string order_date = "下单时间:" + CLewaimaiString::UTF8ToANSI(order.m_order_date);
|
|
|
+ POS_TextOut(order_date);
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ //配送时间
|
|
|
+ if (order.m_is_selftake == "1")
|
|
|
+ {
|
|
|
+ string date = "自取时间:" + CLewaimaiString::UTF8ToANSI(order.m_delivery_date);
|
|
|
+ POS_TextOut(date);
|
|
|
+ POS_FeedLine();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ string date = "閰嶉€佹椂闂达細" + CLewaimaiString::UTF8ToANSI(order.m_delivery_date);
|
|
|
+ POS_TextOut(date);
|
|
|
+ POS_FeedLine();
|
|
|
+ }
|
|
|
+
|
|
|
+ //准备开始打印商品详情
|
|
|
+ string lines = "--------------------------------";
|
|
|
+ POS_TextOut(lines);
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ //鍟嗗搧鏍囬�
|
|
|
+ POS_TextOut("鍟嗗搧 鍗曚环 鏁伴噺 閲戦�");
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ //鍟嗗搧鍐呭�
|
|
|
+ for(std::vector<CWaimaiOrderItem>::iterator it = order.m_order_items.begin(); it != order.m_order_items.end(); it++)
|
|
|
+ {
|
|
|
+ std::string food_name = (*it).m_food_name;
|
|
|
+ std::string food_price = (*it).m_item_price;
|
|
|
+ std::string quantity = (*it).m_quantity;
|
|
|
+
|
|
|
+ //璁$畻鎬讳环
|
|
|
+ double item_price = atof(food_price.c_str()) * atof(quantity.c_str());
|
|
|
+ std::string food_total_price = CLewaimaiString::DoubleToString(item_price, 2);
|
|
|
+
|
|
|
+ food_name = CLewaimaiString::UTF8ToANSI(food_name);
|
|
|
+
|
|
|
+ //先输出商品名字
|
|
|
+ std::vector<string> m_names = HandleFoodname(food_name);
|
|
|
+
|
|
|
+ std::string firstLine = m_names[0];
|
|
|
+ std::string priceShow = HandleFoodItemPrice(food_price);
|
|
|
+ std::string quantityShow = HandleFoodQuantity(quantity);
|
|
|
+ std::string priceTotalShow = HandleFoodTotalPrice(food_total_price);
|
|
|
+
|
|
|
+ std::string firstLineShow = firstLine + priceShow + quantityShow + priceTotalShow;
|
|
|
+
|
|
|
+
|
|
|
+ POS_TextOut(firstLineShow, false, 0);
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ for (std::vector<string>::iterator it = m_names.begin() + 1; it != m_names.end(); it++)
|
|
|
+ {
|
|
|
+ POS_TextOut((*it), false, 0);
|
|
|
+ POS_FeedLine();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //判断是否有备注
|
|
|
+ if (order.m_memo.length() > 0)
|
|
|
+ {
|
|
|
+ POS_FeedLine();
|
|
|
+ string address = "顾客备注:" + CLewaimaiString::UTF8ToANSI(order.m_memo);
|
|
|
+ POS_TextOut(address, false, 0);
|
|
|
+ POS_FeedLine();
|
|
|
+ }
|
|
|
+
|
|
|
+ //缁撴潫鍟嗗搧璇︽儏鎵撳嵃
|
|
|
+ POS_TextOut(lines);
|
|
|
POS_FeedLine();
|
|
|
+
|
|
|
+ //寮€濮嬫墦鍗板叾浠栫殑璐圭敤
|
|
|
+ bool is_other_money = false;
|
|
|
+
|
|
|
+ if (order.m_delivery > 0)
|
|
|
+ {
|
|
|
+ string delivery = "配送费:" + CLewaimaiString::DoubleToString((double)order.m_delivery, 2);
|
|
|
+ POS_TextOut(delivery, false, 0);
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ is_other_money = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (order.m_is_dabao == "1")
|
|
|
+ {
|
|
|
+ string dabao = "鎵撳寘璐癸細" + CLewaimaiString::UTF8ToANSI(order.m_dabao_money);
|
|
|
+ POS_TextOut(dabao, false, 0);
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ is_other_money = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ //寮€濮嬫樉绀哄�鍊兼湇鍔¤垂
|
|
|
+ if (order.m_addservie.size() > 0)
|
|
|
+ {
|
|
|
+ for (std::vector<CWaimaiOrderField>::iterator it = order.m_addservie.begin(); it != order.m_addservie.end(); it++)
|
|
|
+ {
|
|
|
+ string addservice = CLewaimaiString::UTF8ToANSI((*it).name) + ":" + CLewaimaiString::DoubleToString((double)atof((*it).value.c_str()), 2);
|
|
|
+ POS_TextOut(addservice, false, 0);
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ is_other_money = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ is_other_money = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (order.m_discount < 10)
|
|
|
+ {
|
|
|
+ string discount = "打折:" + CLewaimaiString::DoubleToString((double)order.m_discount, 2) + "折";
|
|
|
+ POS_TextOut(discount, false, 0);
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ is_other_money = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (order.m_is_member_discount == "1")
|
|
|
+ {
|
|
|
+ string member_discount = "会员优惠:-" + order.m_member_discount;
|
|
|
+ POS_TextOut(member_discount, false, 0);
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ is_other_money = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (order.m_is_firstcut == "1")
|
|
|
+ {
|
|
|
+ string firstcut = "首单优惠:-" + order.m_firstcut_value;
|
|
|
+ POS_TextOut(firstcut, false, 0);
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ is_other_money = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ //婊″噺
|
|
|
+ string::size_type position = order.m_promotion.find(":");
|
|
|
+ if (position != order.m_promotion.npos)
|
|
|
+ {
|
|
|
+ string promotion_value;
|
|
|
+ promotion_value.assign(order.m_promotion, position + 1);
|
|
|
+
|
|
|
+ string coupon = "满减优惠:-" + CLewaimaiString::DoubleToString((double)(atof(promotion_value.c_str())), 2);
|
|
|
+ POS_TextOut(coupon, false, 0);
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ is_other_money = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (order.m_coupon> 0)
|
|
|
+ {
|
|
|
+ string coupon = "浼樻儬鍒革細-" + CLewaimaiString::DoubleToString((double)order.m_coupon, 2);
|
|
|
+ POS_TextOut(coupon, false, 0);
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ is_other_money = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (atof(order.m_goods_coupon_value.c_str()) > 0.0001)
|
|
|
+ {
|
|
|
+ string coupon = "鍟嗗搧鍒革細-" + order.m_goods_coupon_value;
|
|
|
+ POS_TextOut(coupon, false, 0);
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ is_other_money = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (is_other_money)
|
|
|
+ {
|
|
|
+ POS_TextOut(lines);
|
|
|
+ POS_FeedLine();
|
|
|
+ }
|
|
|
+
|
|
|
+ //鏈€鍚庢樉绀烘€讳环
|
|
|
+ POS_TextOut("鎬昏�锛氾骏" + CLewaimaiString::DoubleToString(order.m_price, 2), false, 2);
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
+ //鏄剧ず浠樻�鏂瑰紡
|
|
|
+ POS_TextOut("支付方式:" + CLewaimaiString::UTF8ToANSI(order.m_pay_type), false, 2);
|
|
|
POS_FeedLine();
|
|
|
-
|
|
|
+
|
|
|
+ POS_FeedLine();
|
|
|
+
|
|
|
POS_CutPaper();
|
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
-//获取CreateFile的USB端口号
|
|
|
+//获取CreateFile的USB端口号
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
-// 根据GUID获得设备路径
|
|
|
-// lpGuid: GUID指针
|
|
|
-// pszDevicePath: 设备路径指针的指针,用于返回找到的路径
|
|
|
-// 返回: 成功得到的设备路径个数,可能不止1个
|
|
|
+// 鏍规嵁GUID鑾峰緱璁惧�璺�緞
|
|
|
+// lpGuid: GUID鎸囬拡
|
|
|
+// pszDevicePath: 设备路径指针的指针,用于返回找到的路径
|
|
|
+// 返回: 成功得到的设备路径个数,可能不止1个
|
|
|
int CPosPrinter::GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath)
|
|
|
{
|
|
|
HDEVINFO hDevInfoSet;
|
|
|
@@ -85,37 +335,37 @@ int CPosPrinter::GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath)
|
|
|
int nCount;
|
|
|
int nTotle;
|
|
|
BOOL bResult;
|
|
|
- wstring strUSBPrint = TEXT("USB 打印支持");
|
|
|
- // 取得一个该GUID相关的设备信息集句柄
|
|
|
+ wstring strUSBPrint = TEXT("USB 鎵撳嵃鏀�寔");
|
|
|
+ // 鍙栧緱涓€涓��GUID鐩稿叧鐨勮�澶囦俊鎭�泦鍙ユ焺
|
|
|
hDevInfoSet = ::SetupDiGetClassDevs(lpGuid, // class GUID
|
|
|
- NULL, // 无关键字
|
|
|
- NULL, // 不指定父窗口句柄
|
|
|
- DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); // 目前存在的设备
|
|
|
+ NULL, // 鏃犲叧閿�瓧
|
|
|
+ NULL, // 涓嶆寚瀹氱埗绐楀彛鍙ユ焺
|
|
|
+ DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); // 目前存在的设备
|
|
|
|
|
|
- // 失败...
|
|
|
+ // 澶辫触...
|
|
|
if(hDevInfoSet == INVALID_HANDLE_VALUE)
|
|
|
{
|
|
|
printf("failed \r\n");
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- // 申请设备接口数据空间
|
|
|
+ // 鐢宠�璁惧�鎺ュ彛鏁版嵁绌洪棿
|
|
|
pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, INTERFACE_DETAIL_SIZE);
|
|
|
pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
|
|
|
nTotle = -1;
|
|
|
nCount = 0;
|
|
|
bResult = TRUE;
|
|
|
|
|
|
- // 设备序号=0,1,2... 逐一测试设备接口,到失败为止
|
|
|
+ // 璁惧�搴忓彿=0,1,2... 閫愪竴娴嬭瘯璁惧�鎺ュ彛锛屽埌澶辫触涓烘�
|
|
|
while(bResult)
|
|
|
{
|
|
|
nTotle++;
|
|
|
spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
|
|
|
- // 枚举符合该GUID的设备接口
|
|
|
+ // 枚举符合该GUID的设备接口
|
|
|
bResult = ::SetupDiEnumDeviceInfo(
|
|
|
- hDevInfoSet, // 设备信息集句柄
|
|
|
- (ULONG)nTotle, // 设备信息集里的设备序号
|
|
|
- &spDevInfoData); // 设备接口信息
|
|
|
+ hDevInfoSet, // 设备信息集句柄
|
|
|
+ (ULONG)nTotle, // 设备信息集里的设备序号
|
|
|
+ &spDevInfoData); // 璁惧�鎺ュ彛淇℃伅
|
|
|
|
|
|
if(bResult)
|
|
|
{
|
|
|
@@ -139,7 +389,7 @@ int CPosPrinter::GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath)
|
|
|
|
|
|
_tprintf(_T("buf = %s \r\n"), buf);
|
|
|
|
|
|
- //是否是要找的设备类型
|
|
|
+ //鏄�惁鏄��鎵剧殑璁惧�绫诲瀷
|
|
|
if(_tcscmp(buf, strUSBPrint.c_str()) != 0)
|
|
|
{
|
|
|
continue;
|
|
|
@@ -147,30 +397,30 @@ int CPosPrinter::GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath)
|
|
|
|
|
|
_tprintf(_T("OK\r\n"));
|
|
|
ifData.cbSize = sizeof(ifData);
|
|
|
- // 枚舉符合該GUID的設備接口
|
|
|
+ // 枚舉符合該GUID的設備接口
|
|
|
bResult = ::SetupDiEnumDeviceInterfaces(
|
|
|
- hDevInfoSet, // 設備信息集句柄
|
|
|
- NULL, // 不需額外的設備描述
|
|
|
+ hDevInfoSet, // 設備信息集句柄
|
|
|
+ NULL, // 不需額外的設備描述
|
|
|
lpGuid, // GUID
|
|
|
- (ULONG)nTotle, // 設備信息集里的設備序號
|
|
|
- &ifData); // 設備接口信息
|
|
|
+ (ULONG)nTotle, // 設備信息集里的設備序號
|
|
|
+ &ifData); // 瑷�倷鎺ュ彛淇℃伅
|
|
|
|
|
|
if(bResult)
|
|
|
{
|
|
|
- // 取得该设备接口的细节(设备路径)
|
|
|
+ // 鍙栧緱璇ヨ�澶囨帴鍙g殑缁嗚妭(璁惧�璺�緞)
|
|
|
bResult = SetupDiGetInterfaceDeviceDetail(
|
|
|
- hDevInfoSet, // 设备信息集句柄
|
|
|
- &ifData, // 设备接口信息
|
|
|
- pDetail, // 设备接口细节(设备路径)
|
|
|
- INTERFACE_DETAIL_SIZE, // 输出缓冲区大小
|
|
|
- NULL, // 不需计算输出缓冲区大小(直接用设定值)
|
|
|
- NULL); // 不需额外的设备描述
|
|
|
+ hDevInfoSet, // 设备信息集句柄
|
|
|
+ &ifData, // 璁惧�鎺ュ彛淇℃伅
|
|
|
+ pDetail, // 璁惧�鎺ュ彛缁嗚妭(璁惧�璺�緞)
|
|
|
+ INTERFACE_DETAIL_SIZE, // 输出缓冲区大小
|
|
|
+ NULL, // 不需计算输出缓冲区大小(直接用设定值)
|
|
|
+ NULL); // 不需额外的设备描述
|
|
|
|
|
|
if(bResult)
|
|
|
{
|
|
|
- // 复制设备路径到输出缓冲区
|
|
|
+ // 澶嶅埗璁惧�璺�緞鍒拌緭鍑虹紦鍐插尯
|
|
|
::_tcscpy_s(pszDevicePath[nCount], 256, pDetail->DevicePath);
|
|
|
- // 调整计数值
|
|
|
+ // 调整计数值
|
|
|
nCount++;
|
|
|
_tprintf(_T("Cnt = %d,pDetail->DevicePath =%s\r\n"), nCount, pDetail->DevicePath);
|
|
|
}
|
|
|
@@ -178,17 +428,17 @@ int CPosPrinter::GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 释放设备接口数据空间
|
|
|
+ // 閲婃斁璁惧�鎺ュ彛鏁版嵁绌洪棿
|
|
|
::GlobalFree(pDetail);
|
|
|
- // 关闭设备信息集句柄
|
|
|
+ // 关闭设备信息集句柄
|
|
|
::SetupDiDestroyDeviceInfoList(hDevInfoSet);
|
|
|
return nCount;
|
|
|
}
|
|
|
|
|
|
-int CPosPrinter::WriteData(string meg)
|
|
|
+int CPosPrinter::WriteData(string msg)
|
|
|
{
|
|
|
DWORD dwWrite;
|
|
|
- return WriteFile(m_hPort, meg.c_str(), (DWORD)meg.length(), &dwWrite, NULL);
|
|
|
+ return WriteFile(m_hPort, msg.c_str(), (DWORD)msg.length(), &dwWrite, NULL);
|
|
|
}
|
|
|
|
|
|
int CPosPrinter::WriteBuf(char *buf, int len)
|
|
|
@@ -199,17 +449,22 @@ int CPosPrinter::WriteBuf(char *buf, int len)
|
|
|
|
|
|
int CPosPrinter::POS_Reset(void)
|
|
|
{
|
|
|
- string s;
|
|
|
- s = "\x1B\x40";
|
|
|
- WriteData(s);
|
|
|
+ char s[2] = {0x1B, 0x40};
|
|
|
+ WriteBuf(s, 2);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
int CPosPrinter::POS_FeedLine(void)
|
|
|
{
|
|
|
- string s;
|
|
|
- s = "\x0A";
|
|
|
- WriteData(s);
|
|
|
+ char s[1] = {0x0A};
|
|
|
+ WriteBuf(s, 1);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int CPosPrinter::POS_Feed(void)
|
|
|
+{
|
|
|
+ char s[3] = { 0x1B, 0x4A, 0x00 };
|
|
|
+ WriteBuf(s, 3);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -223,23 +478,90 @@ int CPosPrinter::POS_SetMotionUnit(int x, int y)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int CPosPrinter::POS_S_TextOut(string &abc)
|
|
|
+int CPosPrinter::POS_SET_MOVE_X()
|
|
|
{
|
|
|
- string s;
|
|
|
- char SetAbsPos[4] = { 0x1B, 0x24, 0x46, 0x00 };
|
|
|
- WriteBuf(SetAbsPos, 4);
|
|
|
- char SelctFontType[3] = { 0x1B, 0x4D, 0x03 };
|
|
|
- WriteBuf(SelctFontType, 3);
|
|
|
- char SelctOutMode[3] = { 0x1D, 0x21, 0x00 };
|
|
|
- WriteBuf(SelctOutMode, 3);
|
|
|
+ char s2[6] = { 0x1B, 0x44, 0x0C, 0x0E, 0x17, 0x00};
|
|
|
+ WriteBuf(s2, 6);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int CPosPrinter::POS_MOVE_X()
|
|
|
+{
|
|
|
+ char s[1] = { 0x09 };
|
|
|
+ WriteBuf(s, 1);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int CPosPrinter::POS_SET_ABS_X(int x, int y)
|
|
|
+{
|
|
|
+ char cx = (char)(x);
|
|
|
+ char cy = (char)(y);
|
|
|
+
|
|
|
+ char s1[4] = { 0x1B, 0x24, cx, cy };
|
|
|
+ WriteBuf(s1, 4);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int CPosPrinter::POS_SET_PRINT_AREA(int x, int y)
|
|
|
+{
|
|
|
+ char cx = (char)(x);
|
|
|
+ char cy = (char)(y);
|
|
|
+
|
|
|
+ char s1[4] = { 0x1D, 0x57, cx, cy };
|
|
|
+ WriteBuf(s1, 4);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ *align_type:0 左对齐 1 居中对齐 2右对齐
|
|
|
+ **/
|
|
|
+int CPosPrinter::POS_TextOut(string abc, bool is_double, int align_type)
|
|
|
+{
|
|
|
+ if(is_double)
|
|
|
+ {
|
|
|
+ char s1[3] = { 0x1B, 0x21, 0x30 };
|
|
|
+ WriteBuf(s1, 3);
|
|
|
+
|
|
|
+ char s2[3] = { 0x1C, 0x21, 0x0c };
|
|
|
+ WriteBuf(s2, 3);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ char s1[3] = { 0x1B, 0x21, 0x00 };
|
|
|
+ WriteBuf(s1, 3);
|
|
|
+
|
|
|
+ char s2[3] = { 0x1C, 0x57, 0x00 };
|
|
|
+ WriteBuf(s2, 3);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(align_type == 0)
|
|
|
+ {
|
|
|
+ char s1[3] = { 0x1B, 0x61, 0x00 };
|
|
|
+ WriteBuf(s1, 3);
|
|
|
+ }
|
|
|
+ else if(align_type == 1)
|
|
|
+ {
|
|
|
+ char s1[3] = { 0x1B, 0x61, 0x01 };
|
|
|
+ WriteBuf(s1, 3);
|
|
|
+ }
|
|
|
+ else if(align_type == 2)
|
|
|
+ {
|
|
|
+ char s1[3] = { 0x1B, 0x61, 0x02 };
|
|
|
+ WriteBuf(s1, 3);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
WriteData(abc);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
int CPosPrinter::POS_CutPaper()
|
|
|
{
|
|
|
- char CutPaperMode[4] = { 0x1D, 0x56, 0x41, 0x00 };
|
|
|
- WriteBuf(CutPaperMode, 4);
|
|
|
+ char s[4] = { 0x1D, 0x56, 0x41, 0x00 };
|
|
|
+ WriteBuf(s, 4);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -254,4 +576,168 @@ int CPosPrinter::POS_OutQRCode()
|
|
|
WriteBuf(QRCode2, 16);
|
|
|
WriteBuf(QRCode3, 8);
|
|
|
return 0;
|
|
|
+}
|
|
|
+
|
|
|
+void CPosPrinter::CalWord(string s, int& nHanzi, int& nZimu)
|
|
|
+{
|
|
|
+ nHanzi = 0;
|
|
|
+ nZimu = 0;
|
|
|
+
|
|
|
+ const char* buffer = s.c_str();
|
|
|
+
|
|
|
+ while(*buffer++ != '\0')
|
|
|
+ {
|
|
|
+ if(!(*buffer >= 0 && *buffer <= 127))
|
|
|
+ {
|
|
|
+ //姹夊瓧
|
|
|
+ buffer++;
|
|
|
+
|
|
|
+ nHanzi++;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //瀛楁瘝
|
|
|
+ nZimu++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+std::vector<std::string>CPosPrinter::HandleFoodname(std::string oldname)
|
|
|
+{
|
|
|
+ std::vector<std::string> newnameArray;
|
|
|
+
|
|
|
+ int nHanzi, nZimu;
|
|
|
+
|
|
|
+ CalWord(oldname, nHanzi, nZimu);
|
|
|
+
|
|
|
+ int nWidth = nHanzi * 2 + nZimu;
|
|
|
+
|
|
|
+ if(nWidth <= 15)
|
|
|
+ {
|
|
|
+ //对于nWidth补空格
|
|
|
+ for (int i = 0; i < 15 - nWidth; i++)
|
|
|
+ {
|
|
|
+ oldname += " ";
|
|
|
+ }
|
|
|
+
|
|
|
+ newnameArray.push_back(oldname);
|
|
|
+
|
|
|
+ return newnameArray;
|
|
|
+ }
|
|
|
+
|
|
|
+ //瀹藉害澶т簬15鐨勬儏鍐碉紝濡傛灉瓒呰繃浜嗭紝灏辫�杩涜�鎹㈣�鎴�彇
|
|
|
+ const char* s = oldname.c_str();
|
|
|
+
|
|
|
+ int nTmp = 0;
|
|
|
+ int nTotal = 0;
|
|
|
+ while (*s++ != '\0')
|
|
|
+ {
|
|
|
+ nTmp++;
|
|
|
+ nTotal++;
|
|
|
+
|
|
|
+ if (!(*(s) >= 0 && *(s) <= 127))
|
|
|
+ {
|
|
|
+ //汉字的情况
|
|
|
+ s++;
|
|
|
+
|
|
|
+ nTmp++;
|
|
|
+ nTotal++;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (nTmp == 15)
|
|
|
+ {
|
|
|
+ //这里开始要换行了
|
|
|
+ string newnameItem;
|
|
|
+ newnameItem.assign(oldname, nTotal - nTmp, nTmp);
|
|
|
+
|
|
|
+ newnameArray.push_back(newnameItem);
|
|
|
+
|
|
|
+ nTmp = 0;
|
|
|
+ }
|
|
|
+ else if (nTmp == 14)
|
|
|
+ {
|
|
|
+ //濡傛灉鏄��14涓�簡锛屽垽鏂�笅涓€涓�槸涓嶆槸涓�枃锛屽�鏋滄槸鐨勮瘽涔熻�鎹㈣�
|
|
|
+ if (!(*(s + 1) >= 0 && *(s + 1) <= 127))
|
|
|
+ {
|
|
|
+ //下一个是中文,也要换行了,补齐一个空格
|
|
|
+ string newnameItem;
|
|
|
+ newnameItem.assign(oldname, nTotal - nTmp, nTmp);
|
|
|
+ newnameItem += " ";
|
|
|
+
|
|
|
+ newnameArray.push_back(newnameItem);
|
|
|
+
|
|
|
+ nTmp = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (nTmp > 0)
|
|
|
+ {
|
|
|
+ //处理分隔后的最后一行
|
|
|
+ string newnameItem;
|
|
|
+ newnameItem.assign(oldname, nTotal - nTmp, nTmp);
|
|
|
+
|
|
|
+ for (int i = 0; i < 15 - nTmp; i++)
|
|
|
+ {
|
|
|
+ newnameItem += " ";
|
|
|
+ }
|
|
|
+
|
|
|
+ newnameArray.push_back(newnameItem);
|
|
|
+ }
|
|
|
+
|
|
|
+ return newnameArray;
|
|
|
+}
|
|
|
+
|
|
|
+std::string CPosPrinter::HandleFoodItemPrice(std::string oldprice)
|
|
|
+{
|
|
|
+ double price = atof(oldprice.c_str());
|
|
|
+
|
|
|
+ if (price < 10.00)
|
|
|
+ {
|
|
|
+ //单位数
|
|
|
+ return " " + oldprice;
|
|
|
+ }
|
|
|
+ else if (price > 9.99 && price < 100.00)
|
|
|
+ {
|
|
|
+ //双位数
|
|
|
+ return " " + oldprice;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return " " + oldprice;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+std::string CPosPrinter::HandleFoodQuantity(std::string oldquantity)
|
|
|
+{
|
|
|
+ int n = atoi(oldquantity.c_str());
|
|
|
+
|
|
|
+ if (n < 10)
|
|
|
+ {
|
|
|
+ return " " + oldquantity;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return " " + oldquantity;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+std::string CPosPrinter::HandleFoodTotalPrice(std::string oldprice)
|
|
|
+{
|
|
|
+ double price = atof(oldprice.c_str());
|
|
|
+
|
|
|
+ if (price < 10.00)
|
|
|
+ {
|
|
|
+ //单位数
|
|
|
+ return " " + oldprice;
|
|
|
+ }
|
|
|
+ else if (price > 9.99 && price < 100.00)
|
|
|
+ {
|
|
|
+ //双位数
|
|
|
+ return " " + oldprice;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return " " + oldprice;
|
|
|
+ }
|
|
|
}
|