Commit 66d91c45 by Wyh

7.24 修改打印邏輯

parent 2fd4d7af
......@@ -44,7 +44,7 @@ android {
/**
* 版本号
*/
schemaVersion 9
schemaVersion 10
/**
* greendao输出dao的数据库操作实体类文件夹(相对路径 包名+自定义路径名称,包将创建于包名的直接路径下)
*/
......
......@@ -36,6 +36,8 @@ public class PrinterDeviceBean implements Serializable {
private String noteContent;//備註
private Long printerDeviceDefaultId;
private int printerDeviceType;//打印機類型 1:網絡打印 2:本地打印(N5,Sunmi手持打印) 3:USB打印 4:藍牙打印
/**
* 飛單1打印機id
*/
......@@ -45,19 +47,19 @@ public class PrinterDeviceBean implements Serializable {
*/
private Long flyPrinterDeviceId2;
private int foodIsBold;//食品是否加粗 1是 2否
private int foodIsBold;//食品是否加粗 0預設 1是 2否
private String foodFont;
private String foodFont;//食品字體大小 0預設
private int foodIsItalic;//食品是否斜體 1是 2否
private int foodIsItalic;//食品是否斜體 0預設 1是 2否
private int modifierIsBold;//細項是否加粗 1是 2否
private int modifierIsBold;//細項是否加粗 0預設 1是 2否
private String modifierFont;//細項字號
private String modifierFont;//細項字號 0預設
private int modifierIsItalic;//細項是否斜體 1是 2否
private int modifierIsItalic;//細項是否斜體 0預設 1是 2否
private int numberIsFlip;//數量大於1顔色是否翻轉 1是 2否
private int numberIsFlip;//數量大於1顔色是否翻轉 0預設 1是 2否
@Generated(hash = 626885316)
......@@ -70,9 +72,8 @@ public class PrinterDeviceBean implements Serializable {
this.paperSpecification = paperSpecification;
}
@Generated(hash = 1637885194)
public PrinterDeviceBean(Long id, Long dbid, String name, Integer restaurantId, String ip, Long uid, Integer port, Integer type, Long printerModelId, String paperSpecification, int lineFontStop, String printerName, String model, String noteContent, Long printerDeviceDefaultId, Long flyPrinterDeviceId, Long flyPrinterDeviceId2, int foodIsBold, String foodFont, int foodIsItalic, int modifierIsBold, String modifierFont, int modifierIsItalic,
int numberIsFlip) {
@Generated(hash = 23385471)
public PrinterDeviceBean(Long id, Long dbid, String name, Integer restaurantId, String ip, Long uid, Integer port, Integer type, Long printerModelId, String paperSpecification, int lineFontStop, String printerName, String model, String noteContent, Long printerDeviceDefaultId, int printerDeviceType, Long flyPrinterDeviceId, Long flyPrinterDeviceId2, int foodIsBold, String foodFont, int foodIsItalic, int modifierIsBold, String modifierFont, int modifierIsItalic, int numberIsFlip) {
this.id = id;
this.dbid = dbid;
this.name = name;
......@@ -88,6 +89,7 @@ public class PrinterDeviceBean implements Serializable {
this.model = model;
this.noteContent = noteContent;
this.printerDeviceDefaultId = printerDeviceDefaultId;
this.printerDeviceType = printerDeviceType;
this.flyPrinterDeviceId = flyPrinterDeviceId;
this.flyPrinterDeviceId2 = flyPrinterDeviceId2;
this.foodIsBold = foodIsBold;
......@@ -297,4 +299,14 @@ public class PrinterDeviceBean implements Serializable {
public void setLineFontStop(int lineFontStop) {
this.lineFontStop = lineFontStop;
}
public int getPrinterDeviceType() {
return printerDeviceType;
}
public void setPrinterDeviceType(int printerDeviceType) {
this.printerDeviceType = printerDeviceType;
}
}
......@@ -14,10 +14,10 @@ import org.greenrobot.greendao.identityscope.IdentityScopeType;
// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
/**
* Master of DAO (schema version 9): knows all DAOs.
* Master of DAO (schema version 10): knows all DAOs.
*/
public class DaoMaster extends AbstractDaoMaster {
public static final int SCHEMA_VERSION = 9;
public static final int SCHEMA_VERSION = 10;
/** Creates underlying database table using DAOs. */
public static void createAllTables(Database db, boolean ifNotExists) {
......
......@@ -20,6 +20,7 @@ import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
......@@ -28,6 +29,9 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import static com.gingersoft.gsa.cloud.print.PrinterUtils.binaryStrToHexString;
import static com.gingersoft.gsa.cloud.print.PrinterUtils.hexListToByte;
/**
* 打印机写入器
......@@ -436,6 +440,136 @@ public abstract class PrinterWriter {
}
/**
* 解码图片
*
* @param image 图片
* @param parting 高度分割值
* @return 数据流
*/
public static byte[] decodeBitmapToDataList(Bitmap image, int parting) {
if (parting <= 0 || parting > 255)
parting = 255;
if (image == null)
return null;
final int width = image.getWidth();
final int height = image.getHeight();
if (width <= 0 || height <= 0)
return null;
if (width > 2040) {
// 8位9针,宽度限制2040像素(但一般纸张都没法打印那么宽,但并不影响打印)
final float scale = 2040 / (float) width;
Matrix matrix = new Matrix();
matrix.postScale(scale, scale);
Bitmap resizeImage;
try {
resizeImage = Bitmap.createBitmap(image, 0, 0, width, height, matrix, true);
} catch (OutOfMemoryError e) {
return null;
}
resizeImage.recycle();
return decodeBitmapToDataList(resizeImage, parting);
}
// 宽命令
String widthHexString = Integer.toHexString(width % 8 == 0 ? width / 8 : (width / 8 + 1));
if (widthHexString.length() > 2) {
// 超过2040像素才会到达这里
return null;
} else if (widthHexString.length() == 1) {
widthHexString = "0" + widthHexString;
}
widthHexString += "00";
// 每行字节数(除以8,不足补0)
String zeroStr = "";
int zeroCount = width % 8;
if (zeroCount > 0) {
for (int i = 0; i < (8 - zeroCount); i++) {
//noinspection StringConcatenationInLoop
zeroStr += "0";
}
}
ArrayList<String> commandList = new ArrayList<>();
// 高度每parting像素进行一次分割
int time = height % parting == 0 ? height / parting : (height / parting + 1);// 循环打印次数
for (int t = 0; t < time; t++) {
int partHeight = t == time - 1 ? height % parting : parting;// 分段高度
// 高命令
String heightHexString = Integer.toHexString(partHeight);
if (heightHexString.length() > 2) {
// 超过255像素才会到达这里
return null;
} else if (heightHexString.length() == 1) {
heightHexString = "0" + heightHexString;
}
heightHexString += "00";
// 宽高指令
String commandHexString = "1D763000";
commandList.add(commandHexString + widthHexString + heightHexString);
ArrayList<String> list = new ArrayList<>(); //binaryString list
StringBuilder sb = new StringBuilder();
// 像素二值化,非黑即白
for (int i = 0; i < partHeight; i++) {
sb.delete(0, sb.length());
for (int j = 0; j < width; j++) {
// 实际在图片中的高度
int startHeight = t * parting + i;
//得到当前像素的值
int color = image.getPixel(j, startHeight);
int red, green, blue;
if (image.hasAlpha()) {
//得到alpha通道的值
int alpha = Color.alpha(color);
//得到图像的像素RGB的值
red = Color.red(color);
green = Color.green(color);
blue = Color.blue(color);
final float offset = alpha / 255.0f;
// 根据透明度将白色与原色叠加
red = 0xFF + (int) Math.ceil((red - 0xFF) * offset);
green = 0xFF + (int) Math.ceil((green - 0xFF) * offset);
blue = 0xFF + (int) Math.ceil((blue - 0xFF) * offset);
} else {
//得到图像的像素RGB的值
red = Color.red(color);
green = Color.green(color);
blue = Color.blue(color);
}
// 接近白色改为白色。其余黑色
if (red > 160 && green > 160 && blue > 160)
sb.append("0");
else
sb.append("1");
}
// 每一行结束时,补充剩余的0
if (zeroCount > 0) {
sb.append(zeroStr);
}
list.add(sb.toString());
}
// binaryStr每8位调用一次转换方法,再拼合
ArrayList<String> bmpHexList = new ArrayList<>();
for (String binaryStr : list) {
sb.delete(0, sb.length());
for (int i = 0; i < binaryStr.length(); i += 8) {
String str = binaryStr.substring(i, i + 8);
// 2进制转成16进制
String hexString = binaryStrToHexString(str);
sb.append(hexString);
}
bmpHexList.add(sb.toString());
}
// 数据指令
commandList.addAll(bmpHexList);
}
return hexListToByte(commandList);
}
/**
* 缩放图片
*
* @param image 图片
......
......@@ -21,10 +21,14 @@ public class BillMethodAdapter extends BaseQuickAdapter<PayMethod, BaseViewHolde
@Override
protected void convert(BaseViewHolder helper, PayMethod item) {
if (item != null) {
QMUIAlphaTextView tv_bill_method_name = helper.getView(R.id.tv_bill_method_name);
if(item.getPayName() != null) {
tv_bill_method_name.setText(item.getPayName());
}
tv_bill_method_name.setTextSize(item.getPayModeSize());
tv_bill_method_name.setTextColor(item.getPayModeTextColor());
}
}
}
......@@ -31,8 +31,11 @@ public class BillMoneyAdapter extends BaseQuickAdapter<PayMethod, BaseViewHolder
ImageView iv_bill_delete = helper.getView(R.id.iv_bill_delete);
TextView tv_bill_method_name = helper.getView(R.id.tv_bill_method_name);
TextView tv_bill_money = helper.getView(R.id.tv_bill_money);
if (datasBean != null) {
tv_bill_method_name.setText(datasBean.getPayName());
} else {
tv_bill_method_name.setText("");
}
if (datasBean.getPayMoney() < 0) {
tv_bill_money.setText("-" + cashStr + Math.abs(datasBean.getPayMoney()));
......
......@@ -105,7 +105,7 @@ public class OrderPayView extends LinearLayout {
mBillMoneyList.clear();
// if (!mBillMoneyList.contains(method)) {
double differenceMoney = getDifferenceMoney();
if (differenceMoney > -1) {
if (differenceMoney > -1 && method != null) {
//補足差額
method.setPayMoney(differenceMoney);
}
......@@ -270,8 +270,10 @@ public class OrderPayView extends LinearLayout {
public double getBillMoney() {
double totalMoney = 0.0;
for (PayMethod method : mBillMoneyList) {
if (method != null) {
totalMoney = MoneyUtil.sum(totalMoney, method.getPayMoney());
}
}
return totalMoney;
}
......
......@@ -11,6 +11,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.billy.cc.core.component.CC;
import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils;
......@@ -89,6 +90,7 @@ public class SwitchServerActivity extends BaseActivity<SwitchServerPresenter> im
});
switchServer.setOnClickListener(v -> {
GsaCloudApplication.isLogin = false;
GsaCloudApplication.clearMemberInfo();
System.exit(0);
});
}
......
......@@ -71,7 +71,7 @@
android:layout_height="@dimen/head_height"
android:layout_margin="@dimen/dp_20"
android:background="@color/theme_color"
android:text="切換環境"
android:text="清除用戶信息"
android:textColor="@color/white"
android:textSize="@dimen/sp_16" />
</LinearLayout>
\ No newline at end of file
......@@ -132,6 +132,14 @@ public class NewMainPresenter extends BasePresenter<NewMainContract.Model, NewMa
//清空用戶信息
GsaCloudApplication.clearMemberInfo();
}
@Override
public void onError(Throwable t) {
super.onError(t);
mRootView.loginOut();
//清空用戶信息
GsaCloudApplication.clearMemberInfo();
}
});
}
......
......@@ -249,24 +249,25 @@ public class NewMainActivity extends BaseFragmentActivity<NewMainPresenter> impl
// if (!BuildConfig.DEBUG) {
functions.add(new Function((long) 150, 0, 5, "點餐", 0, 0));
if (BuildConfig.DEBUG) {
functions.add(new Function((long) 138, 150, 5, "餐檯模式", R.drawable.ic_dining_table_mode, 0));
}
functions.add(new Function((long) 139, 150, 5, "外送/自取", R.drawable.ic_delivery_mode, 0));
functions.add(new Function((long) 140, 150, 5, "外賣模式", R.drawable.ic_outsourcing_model_close, 0));
functions.add(new Function((long) 141, 150, 5, "預點餐模式", R.drawable.ic_pre_order_mode_close, 1));
// functions.add(new Function((long) 140, 150, 5, "外賣模式", R.drawable.ic_outsourcing_model_close, 0));
// functions.add(new Function((long) 141, 150, 5, "預點餐模式", R.drawable.ic_pre_order_mode_close, 1));
functions.add(new Function((long) 151, 0, 5, "管理", 0, 0));
functions.add(new Function((long) 142, 151, 5, "賬單管理", R.drawable.ic_meals_menu_management, 0));
functions.add(new Function((long) 142, 151, 5, "外賣接單", R.drawable.ic_takeaway_orders, 0));
functions.add(new Function((long) 143, 151, 5, "餐檯管理", R.drawable.ic_dining_table_management, 0));
// functions.add(new Function((long) 142, 151, 5, "賬單管理", R.drawable.ic_meals_menu_management, 0));
// functions.add(new Function((long) 143, 151, 5, "餐檯管理", R.drawable.ic_dining_table_management, 0));
functions.add(new Function((long) 144, 151, 5, "打印管理", R.drawable.ic_print_management, 0));
// functions.add(new Function((long) 145, 151, 5, "支付管理", R.drawable.ic_pay_management_close, 1));
// functions.add(new Function((long) 146, 151, 5, "折扣管理", R.drawable.ic_discount_management_close, 1));
functions.add(new Function((long) 147, 151, 5, "沽清管理", R.drawable.ic_sell_off_manger, 0));
// functions.add(new Function((long) 147, 151, 5, "沽清管理", R.drawable.ic_sell_off_manger, 0));
functions.add(new Function((long) 152, 0, 5, "員工", 0, 0));
functions.add(new Function((long) 147, 152, 5, "員工管理", R.drawable.ic_staff_management_close, 1));
functions.add(new Function((long) 148, 152, 5, "權限管理", R.drawable.ic_authority_management_close, 1));
functions.add(new Function((long) 149, 152, 5, "操作記錄", R.drawable.ic_operation_record_close, 1));
// functions.add(new Function((long) 152, 0, 5, "員工", 0, 0));
// functions.add(new Function((long) 147, 152, 5, "員工管理", R.drawable.ic_staff_management_close, 1));
// functions.add(new Function((long) 148, 152, 5, "權限管理", R.drawable.ic_authority_management_close, 1));
// functions.add(new Function((long) 149, 152, 5, "操作記錄", R.drawable.ic_operation_record_close, 1));
// } else {
// functions.addAll(FunctionManager.getDefault().getFunctionByResModule(this, ComponentMain.main.class, ComponentMain.main.order, "order"));
// functions.addAll(FunctionManager.getDefault().getFunctionByResModule(this, ComponentMain.main.class, ComponentMain.main.manager, "manager"));
......
......@@ -287,7 +287,7 @@ class PageViewModel(private val repository: WeatherRepository) : ViewModel() {
//獲取配送設置,查看當前單是否是第三方物流
for (i in 0 until data.list.size) {
if (data.list[i].distributionType == dataBean.deliveryMode) {
third = data.list[i].type == 1
third = data.list[i].type != 0
break
}
}
......
......@@ -3,6 +3,7 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.BLUETOOTH" />
<application>
<activity
android:name=".mvp.ui.activity.PrintActivity"
......
......@@ -2,15 +2,14 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.joe.print">
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name="com.gingersoft.gsa.cloud.base.application.GsaCloudApplication"
android:allowBackup="true"
......
package com.joe.print.mvp.presenter;
import android.app.Application;
import android.content.Context;
import android.util.Log;
import com.gingersoft.gsa.cloud.base.common.bean.BaseResult;
import com.gingersoft.gsa.cloud.base.common.bean.PrinterManger.PrinterManager;
import com.gingersoft.gsa.cloud.base.utils.JsonUtils;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.database.bean.PrintCurrencyBean;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.gingersoft.gsa.cloud.database.bean.PrinterListBean;
import com.gingersoft.gsa.cloud.database.utils.PrintCurrencyDaoUtils;
import com.gingersoft.gsa.cloud.database.utils.PrinterDeviceDaoUtils;
import com.jess.arms.di.scope.ActivityScope;
import com.jess.arms.http.imageloader.ImageLoader;
import com.jess.arms.integration.AppManager;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.utils.RxLifecycleUtils;
import com.joe.print.mvp.contract.PrintContract;
import com.joe.print.mvp.model.bean.PrjBean;
import com.joe.print.mvp.print.PrintBill;
import com.joe.print.mvp.print.PrintCleanMachine;
import com.joe.print.mvp.print.PrintInstruction;
import com.joe.print.mvp.print.PrintOtherOrder;
import com.joe.print.mvp.print.PrintOtherOrderClosing;
import com.joe.print.mvp.print.PrintPrjKitchen;
import com.joe.print.mvp.print.PrintServe;
import com.joe.print.mvp.print.PrintSlip;
import com.joe.print.mvp.print.PrintTest;
import com.joe.print.mvp.print.PrinterRoot;
import com.joe.print.mvp.print.utils.MyPrintUtils;
import java.util.List;
......@@ -24,6 +41,8 @@ import io.reactivex.schedulers.Schedulers;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber;
import static com.joe.print.mvp.print.PrinterRoot.PRINT_TEST;
/**
* ================================================
......@@ -48,6 +67,11 @@ public class PrintPresenter extends BasePresenter<PrintContract.Model, PrintCont
@Inject
AppManager mAppManager;
//通用配置
private PrintCurrencyBean printCurrencyBean;
//默認打印機
private PrinterDeviceBean printerDeviceBean;
@Inject
public PrintPresenter(PrintContract.Model model, PrintContract.View rootView) {
super(model, rootView);
......@@ -80,7 +104,7 @@ public class PrintPresenter extends BasePresenter<PrintContract.Model, PrintCont
public void onNext(BaseResult baseResult) {
if (baseResult.isSuccess()) {
PrinterListBean deviceBeans = JsonUtils.parseObject(baseResult.getData(), PrinterListBean.class);
if(deviceBeans != null){
if (deviceBeans != null) {
//有打印機,返回true
PrinterManager.getPrinterManager().setDeviceBeans(deviceBeans.getList());
mRootView.showPrinterList(deviceBeans.getList());
......@@ -99,4 +123,75 @@ public class PrintPresenter extends BasePresenter<PrintContract.Model, PrintCont
}
});
}
public List<PrinterDeviceBean> getAllPrintList(Context context) {
PrinterDeviceDaoUtils printerDeviceDaoUtils = new PrinterDeviceDaoUtils(context);
return printerDeviceDaoUtils.queryAllPrinterDeviceBean();
}
/**
* 通過類型獲取打印通用配置
*
* @param context
* @param type 1:堂食,2:外送
* @return
*/
public PrintCurrencyBean getPrintCurrencyBeanByType(Context context, int type) {
PrintCurrencyDaoUtils printCurrencyDaoUtils = new PrintCurrencyDaoUtils(context);
List<PrintCurrencyBean> printCurrencyBeans = printCurrencyDaoUtils.queryAllPrintCurrencyBean();
for (PrintCurrencyBean printCurrencyBean : printCurrencyBeans) {
if (printCurrencyBean.getType() == type) {
return printCurrencyBean;
}
}
return null;
}
public PrinterDeviceBean getDefaultPrintInList(List<PrinterDeviceBean> printerDeviceBeans, String printDeviceName) {
if (printerDeviceBeans != null) {
for (PrinterDeviceBean printerDeviceBean : printerDeviceBeans) {
if (printerDeviceBean.getPrinterDeviceDefaultId() != null) {
//默認打印機
this.printerDeviceBean = printerDeviceBean;
return this.printerDeviceBean;
}
}
//沒有設置默認打印機,取用戶最近使用的打印機
for (PrinterDeviceBean printerDeviceBean : printerDeviceBeans) {
if (printDeviceName != null && printDeviceName.equals(printerDeviceBean.getName())) {
this.printerDeviceBean = printerDeviceBean;
return this.printerDeviceBean;
}
}
//沒有設置默認打印機,也沒有最近使用的打印機,並且如果打印機數量為1,就取這一台
if (printerDeviceBeans.size() == 1) {
return printerDeviceBeans.get(0);
}
}
return printerDeviceBean;
}
public PrinterRoot getPrinterByType(int type) {
if (type == PrinterRoot.PRINT_TEST) {
return new PrintTest();
} else if (type == PrinterRoot.PRINT_SERVE) {
return new PrintServe();
} else if (type == PrinterRoot.PRINT_SLIP) {
return new PrintSlip();
} else if (type == PrinterRoot.PRINT_BILL) {
return new PrintBill();
} else if (type == PrinterRoot.PRINT_KITCHEN) {
return new PrintPrjKitchen();
} else if (type == PrinterRoot.PRINT_CLEAN_MACHINE) {
return new PrintCleanMachine();
} else if (type == PrinterRoot.PRINT_OTHER_ORDER) {
return new PrintOtherOrder();
} else if (type == PrinterRoot.PRINT_INSTRUCTION) {
return new PrintInstruction();
} else if (type == PrinterRoot.PRINT_OTHER_CLOSING) {
return new PrintOtherOrderClosing();
}
return null;
}
}
......@@ -485,16 +485,13 @@ public class EpsonPrint implements ReceiveListener {
public void onPtrReceive(Printer printer, int i, PrinterStatusInfo printerStatusInfo, String s) {
this.mPrinter = printer;
mPrinter.clearCommandBuffer();
Log.e(TAG, "1111回調,還剩下:" + bitmaps.size() + "未打印,連接狀態:" + printerStatusInfo.getConnection());
resetCount = 5;
Log.e(TAG, "2222打印成功,還剩下:" + bitmaps.size() + "未打印" + s);
if (timerDisposable != null && !timerDisposable.isDisposed()) {
timerDisposable.dispose();
}
if (bitmaps.size() > 0) {
bitmaps.remove(0);
}
Log.e(TAG, "3333打印完成,還剩下:" + bitmaps.size() + "未打印");
if (bitmaps.size() > 0) {
// startTimer(2);
printData(ipAddress, bitmaps.get(0));
......
......@@ -22,6 +22,8 @@ import com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage;
import com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage;
import com.gingersoft.gsa.cloud.base.utils.MoneyUtil;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.base.utils.view.ImageUtils;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.joe.print.R;
import java.math.BigDecimal;
......@@ -36,7 +38,7 @@ import java.util.Map;
public class PrintBill extends PrinterRoot {
@Override
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext) {
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext, PrinterDeviceBean deviceBean) {
Map<String, List<Bitmap>> bitmapMaps = new HashMap<>();
List<Bitmap> bitmaps = new ArrayList<>();
bitmaps.add(getServeBitmap(mContext));
......@@ -49,7 +51,6 @@ public class PrintBill extends PrinterRoot {
return 1;
}
/**
* 獲取"結賬單"圖片
*
......@@ -93,7 +94,7 @@ public class PrintBill extends PrinterRoot {
List<BillingBean> billingBeans = new ArrayList<>();
//添加合計項
billingBeans.add(new BillingBean("合計",MyOrderManage.getInstance().getWholeAmount()));
billingBeans.add(new BillingBean("合計", MyOrderManage.getInstance().getWholeAmount()));
//添加其他金額項
if (MyOrderManage.getInstance().getOrderMoneyList().size() > 0) {
for (BillOrderMoney item : MyOrderManage.getInstance().getOrderMoneyList()) {
......@@ -132,4 +133,58 @@ public class PrintBill extends PrinterRoot {
// ivBarCode.setImageBitmap(BitmapUtil.generateBitmap("12312112131", 2, 450, 150));
return viewToBitmap(context, view);
}
private Bitmap getBitmap(Context mContext, PrinterDeviceBean deviceBean) {
List<OrderDetail> foodList = MyOrderManage.getInstance().getOrderFoodList();
TableBean.DataBean tableBean = OpenTableManage.getDefault().getTableBean();
LinearLayout layout = new LinearLayout(mContext);
layout.setOrientation(LinearLayout.VERTICAL);
//訂單頭
layout.addView(getHeader(mContext));
layout.addView(getLine(mContext));
//訂單信息
String tableName = "餐檯:" + tableBean.getTableName();
String peopleNum = OpenTableManage.getDefault().getPeopleNumber() + "";
String orderNum = null;
if (MyOrderManage.getInstance().getOrderId() != -1) {
orderNum = MyOrderManage.getInstance().getOrderId() + "";
}
String createTime = TimeUtils.parseTimeRepeat(tableBean.getCreateTime(), TimeUtils.DEFAULT_DATE_FORMAT);
layout.addView(getDiningTableOrderInfo(mContext, tableName, peopleNum, orderNum, createTime));
layout.addView(getLine(mContext));
//食品信息
layout.addView(getDiningFoodList(mContext, foodList));
layout.addView(getHalfLine(mContext));
//訂單金額信息
List<BillingBean> billingBeans = new ArrayList<>();
//添加合計項
billingBeans.add(new BillingBean("合計", MyOrderManage.getInstance().getWholeAmount()));
//添加其他金額項
if (MyOrderManage.getInstance().getOrderMoneyList().size() > 0) {
for (BillOrderMoney item : MyOrderManage.getInstance().getOrderMoneyList()) {
billingBeans.add(new BillingBean(item.getTitle(), item.getMoney()));
}
}
layout.addView(getDiningBillInfo(mContext, billingBeans));
layout.addView(getHalfLine(mContext));
BigDecimal totalAmount = new BigDecimal(0);
for (OrderDetail OrderDetail : MyOrderManage.getInstance().getOrderFoodList()) {
totalAmount = MoneyUtil.sum(totalAmount, OrderDetail.getPrice());
}
layout.addView(getAmountText(mContext, "總金額:" + totalAmount));
// layout.addView();
layout.addView(getLine(mContext));
layout.addView(getDiningBillPayMethod(mContext, MyOrderManage.getInstance().getBillMoney()));
layout.addView(getLine(mContext));
return zoomBitmap(deviceBean, viewToBitmap(mContext, layout));
}
}
......@@ -5,6 +5,7 @@ import android.graphics.Bitmap;
import android.view.View;
import com.gingersoft.gsa.cloud.base.utils.PrintTransitUtils;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import java.util.ArrayList;
import java.util.HashMap;
......@@ -17,7 +18,7 @@ import java.util.Map;
public class PrintCleanMachine extends PrinterRoot {
@Override
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext) {
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext, PrinterDeviceBean deviceBean) {
Map<String, List<Bitmap>> bitmapMaps = new HashMap<>();
List<Bitmap> bitmaps = new ArrayList<>();
bitmaps.add(getServeBitmap(mContext));
......
......@@ -3,6 +3,8 @@ package com.joe.print.mvp.print;
import android.content.Context;
import android.graphics.Bitmap;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import java.util.List;
import java.util.Map;
......@@ -12,7 +14,7 @@ import java.util.Map;
public class PrintInstruction extends PrinterRoot {
@Override
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext) {
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext, PrinterDeviceBean deviceBean) {
return null;
}
......
......@@ -16,6 +16,7 @@ import com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage;
import com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage;
import com.gingersoft.gsa.cloud.base.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.joe.print.R;
import java.util.ArrayList;
......@@ -30,7 +31,7 @@ import java.util.Objects;
public class PrintKitchen extends PrinterRoot {
@Override
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext) {
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext, PrinterDeviceBean deviceBean) {
Map<String, List<Bitmap>> bitmapMaps = new HashMap<>();
List<OrderDetail> orderDetails = MyOrderManage.getInstance().getNewFoodList();
if (orderDetails != null) {
......
......@@ -17,6 +17,7 @@ import com.gingersoft.gsa.cloud.base.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.constans.ExpandConstant;
import com.gingersoft.gsa.cloud.database.bean.ExpandInfo;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.gingersoft.gsa.cloud.database.utils.ExpandInfoDaoUtils;
import com.gingersoft.gsa.cloud.print.bean.OrderDetails;
import com.joe.print.R;
......@@ -34,7 +35,7 @@ public class PrintOtherOrder extends PrinterRoot {
@Override
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext) {
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext, PrinterDeviceBean deviceBean) {
OrderDetails.DataBean dataBean = MyOrderManage.getDataBean();
if (dataBean != null) {
Map<String, List<Bitmap>> bitmapMaps = new HashMap<>();
......
......@@ -15,6 +15,7 @@ import com.gingersoft.gsa.cloud.base.utils.MoneyUtil;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.constans.ExpandConstant;
import com.gingersoft.gsa.cloud.database.bean.ExpandInfo;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.gingersoft.gsa.cloud.database.utils.ExpandInfoDaoUtils;
import com.gingersoft.gsa.cloud.print.bean.OrderDetails;
import com.joe.print.R;
......@@ -33,7 +34,7 @@ import java.util.Map;
public class PrintOtherOrderClosing extends PrinterRoot {
@Override
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext) {
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext, PrinterDeviceBean deviceBean) {
OrderDetails.DataBean dataBean = MyOrderManage.getDataBean();
if (dataBean != null) {
Map<String, List<Bitmap>> bitmapMaps = new HashMap<>();
......
......@@ -12,6 +12,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.joe.print.R;
import com.joe.print.mvp.model.bean.PrjBean;
import com.joe.print.mvp.ui.adapter.KitChenPrjPrintFoodAdapter;
......@@ -29,7 +30,7 @@ public class PrintPrjKitchen extends PrinterRoot {
private static Map<String, List<PrjBean.DataBean.Bean>> prjMap;
@Override
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext) {
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext, PrinterDeviceBean deviceBean) {
Map<String, List<Bitmap>> bitmapMaps = new HashMap<>();
//通過打印位置生成多張用於打印的bitmap
for (Map.Entry<String, List<PrjBean.DataBean.Bean>> entry : getPrjMap().entrySet()) {
......
......@@ -19,6 +19,7 @@ import com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage;
import com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage;
import com.gingersoft.gsa.cloud.base.utils.MoneyUtil;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.joe.print.R;
import java.math.BigDecimal;
......@@ -33,7 +34,7 @@ import java.util.Map;
public class PrintServe extends PrinterRoot {
@Override
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext) {
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext, PrinterDeviceBean deviceBean) {
Map<String, List<Bitmap>> bitmapMaps = new HashMap<>();
List<Bitmap> bitmaps = new ArrayList<>();
bitmaps.add(getServeBitmap(mContext));
......
......@@ -21,6 +21,7 @@ import com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage;
import com.gingersoft.gsa.cloud.base.utils.MoneyUtil;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.constans.AppConstans;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.joe.print.R;
import java.math.BigDecimal;
......@@ -36,12 +37,12 @@ import java.util.Map;
public class PrintSlip extends PrinterRoot {
@Override
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext) {
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext, PrinterDeviceBean deviceBean) {
List<Bitmap> bitmaps = new ArrayList<>();
bitmaps.add(getServeBitmap(mContext));
//這裡可能還需要加上廚房單的內容,有未送單的食品時。
PrintKitchen kitchen = new PrintKitchen();
Map<String, List<Bitmap>> bitmapMaps = new HashMap<>(kitchen.getPrintBitmap(mContext));
Map<String, List<Bitmap>> bitmapMaps = new HashMap<>(kitchen.getPrintBitmap(mContext, deviceBean));
if (bitmapMaps.size() == 0) {
bitmapMaps.put("", bitmaps);
} else {
......@@ -92,7 +93,7 @@ public class PrintSlip extends PrinterRoot {
List<BillingBean> billingBeans = new ArrayList<>();
//添加合計項
billingBeans.add(new BillingBean("合計",MyOrderManage.getInstance().getWholeAmount()));
billingBeans.add(new BillingBean("合計", MyOrderManage.getInstance().getWholeAmount()));
//添加其他金額項
if (MyOrderManage.getInstance().getOrderMoneyList().size() > 0) {
for (BillOrderMoney item : MyOrderManage.getInstance().getOrderMoneyList()) {
......
......@@ -7,6 +7,7 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.joe.print.R;
import java.util.ArrayList;
......@@ -21,7 +22,7 @@ public class PrintTest extends PrinterRoot {
@Override
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext) {
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext, PrinterDeviceBean deviceBean) {
Map<String, List<Bitmap>> bitmapMaps = new HashMap<>();
List<Bitmap> bitmaps = new ArrayList<>();
bitmaps.add(getTestPrintBitmap(mContext));
......@@ -41,7 +42,7 @@ public class PrintTest extends PrinterRoot {
* @param context
* @return
*/
private Bitmap getTestPrintBitmap(Context context) {
public Bitmap getTestPrintBitmap(Context context) {
View view = LinearLayout.inflate(context, R.layout.print_test, null);
TextView tvTime = view.findViewById(R.id.tv_test_print_now_time);
tvTime.setText("時間:" + TimeUtils.getCurrentDate(TimeUtils.DEFAULT_DATE_FORMAT));
......
package com.joe.print.mvp.print.bluetooth;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Handler;
import android.os.Message;
import com.joe.print.mvp.print.common.SendCallback;
import com.joe.print.mvp.print.common.SendResultCode;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.ref.WeakReference;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class BluetoothPrint {
private static final String TAG = "BluetoothPrint";
private static final String SPP_UUID = "00001101-0000-1000-8000-00805F9B34FB";
private static BluetoothPrint INSTANCE;
private SendCallback sendCallback;
private UUID uuid;
private MyHandler myHandler;
private final ExecutorService threadPool;
private BluetoothPrint(SendCallback sendCallback) {
this.uuid = UUID.fromString(SPP_UUID);
this.myHandler = new MyHandler(this);
this.sendCallback = sendCallback;
this.threadPool = Executors.newFixedThreadPool(3);
}
public static BluetoothPrint getInstance(SendCallback sendCallback) {
if (INSTANCE == null) {
synchronized (BluetoothPrint.class) {
if (INSTANCE == null) {
INSTANCE = new BluetoothPrint(sendCallback);
}
}
}
return INSTANCE;
}
public void sendPrintCommand(BluetoothDevice device, byte[] bytes) {
SendCommandThread thread = new SendCommandThread(device, bytes);
threadPool.execute(thread);
}
private class SendCommandThread extends Thread {
private BluetoothDevice device;
private byte[] bytes;
private BluetoothSocket socket;
public SendCommandThread(BluetoothDevice device, byte[] bytes) {
this.device = device;
this.bytes = bytes;
}
@Override
public void run() {
try {
socket = device.createRfcommSocketToServiceRecord(uuid);
socket.connect();
OutputStream os = socket.getOutputStream();
os.write(bytes);
os.flush();
os.close();
sendStatus(device.getName(), SendResultCode.SEND_SUCCESS);
} catch (IOException e) {
e.printStackTrace();
sendStatus(device.getName(), SendResultCode.SEND_FAILED);
}
}
}
private void sendStatus(String ip, int code) {
Message msg = Message.obtain();
msg.what = code;
msg.obj = ip;
myHandler.sendMessage(msg);
}
private static class MyHandler extends Handler {
private WeakReference<BluetoothPrint> reference;
public MyHandler(BluetoothPrint manager) {
this.reference = new WeakReference<>(manager);
}
@Override
public void handleMessage(Message msg) {
BluetoothPrint manager = reference.get();
if (manager != null) {
manager.sendCallback.onCallback(msg.what, (String) msg.obj);
}
}
}
}
package com.joe.print.mvp.print.serial;
public interface ReadCallback {
void onReading(String s);
}
package com.joe.print.mvp.print.serial;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import com.joe.print.mvp.print.serial.utils.SerialPort;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.security.InvalidParameterException;
import java.util.Arrays;
public class SerialPortRead {
private SerialPort serialPort;
private InputStream is;
private boolean isReading = false;
private ReadCallback callback;
private MyHandler myHandler;
public void open(String path, int baudRate, ReadCallback callback) {
try {
this.myHandler = new MyHandler(this);
this.callback = callback;
this.isReading = true;
this.serialPort = new SerialPort(new File(path), baudRate, 0);
this.is = serialPort.getInputStream();
new ReadThread(is).start();
} catch (SecurityException e) {
callback.onReading("SecurityException");
//DisplayError(R.string.error_security);
} catch (IOException e) {
callback.onReading("IOException");
//DisplayError(R.string.error_unknown);
} catch (InvalidParameterException e) {
callback.onReading("InvalidParameterException");
//DisplayError(R.string.error_configuration);
}
}
private class ReadThread extends Thread {
private InputStream is;
public ReadThread(InputStream is) {
this.is = is;
}
@Override
public void run() {
while (isReading) {
long id = Thread.currentThread().getId();
Log.d("thread", "id =" + id);
try {
if (is == null) return;
String s;
byte[] line = readLine(is);
if (line[0] == 87) {
s = readWENTEC(line);
} else {
s = readDaHua(line);
}
sendMessage(s);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private String readDaHua(byte[] line) {
try {
String s = ASCII2HexString(line, 22).substring(0, 5).trim();
double b = Double.parseDouble(s) / 1000;
return String.valueOf(b);
} catch (NumberFormatException e) {
e.printStackTrace();
}
return "0.000";
}
private byte[] readLine(InputStream is) throws IOException {
//5518 000 000\n\r
//WGT:1 5.570P 0.000\r\n
byte[] line = new byte[22];
byte[] buffer = new byte[2];
int index = 0;
byte[] _r = new byte[1];//13
byte[] _n = new byte[1];//10
for (; ; ) {
if (is.read(buffer, 0, 1) != -1) {
line[index] = buffer[0];
index++;
if (buffer[0] == 13) {
_r[0] = buffer[0];
}
if (buffer[0] == 10) {
_n[0] = buffer[0];
}
boolean isEnd = _r[0] == 13 && _n[0] == 10;
if (index >= 22 || isEnd) {
break;
}
} else {
break;
}
}
Log.d("byteline", Arrays.toString(line));
return line;
}
private String readWENTEC(byte[] line) throws IOException {
Log.d("line=", Arrays.toString(line));
byte[] buf = new byte[20];
if (line[0] == 'W') {
byte status = line[4];
byte[] net_weight = new byte[7];
byte sep = 'P';
byte[] tare_weight = new byte[7];
System.arraycopy(line, 5, net_weight, 0, 6);
System.arraycopy(line, 12, tare_weight, 0, 6);
buf[0] = status;
for (int i = 0; i < 6; i++) {
buf[i + 1] = net_weight[i];
}
buf[7] = sep;
for (int j = 0; j < 6; j++) {
buf[j + 8] = tare_weight[j];
}
}
Log.d("WINTEC:", ASCII2HexString(line, line.length));
String a = ASCII2HexString(buf, 20).substring(0, 1);
String b = ASCII2HexString(buf, 20).substring(1, 7);
String c = ASCII2HexString(buf, 20).substring(8, 14);
Log.d("WINTEC:", "a=" + a + ", b=" + b + ", c=" + c);
return b;
}
public String ASCII2HexString(byte[] src, int n) {
char[] data = new char[n];
for (int i = 0; i < src.length; i++) {
data[i] = (char) ((int) (src[i]));
}
return new String(data);
}
private static class MyHandler extends Handler {
private WeakReference<SerialPortRead> weakReference;
public MyHandler(SerialPortRead read) {
this.weakReference = new WeakReference<>(read);
}
@Override
public void handleMessage(Message msg) {
SerialPortRead read = weakReference.get();
if (read != null && read.callback != null) {
read.callback.onReading((String) msg.obj);
}
}
}
private void sendMessage(String s) {
if (myHandler == null) return;
Message msg = new Message();
msg.obj = s;
myHandler.sendMessage(msg);
}
public void close() {
isReading = false;
try {
if (is != null) {
is.close();
}
if (serialPort != null) {
serialPort.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.joe.print.mvp.print.serial;
import com.joe.print.mvp.print.serial.utils.SerialPort;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.security.InvalidParameterException;
public class SerialPortWrite {
private SerialPort serialPort;
private OutputStream os;
public void open(String path, int baudRate) {
try {
serialPort = new SerialPort(new File(path), baudRate, 0);
os = serialPort.getOutputStream();
} catch (SecurityException e) {
//DisplayError(R.string.error_security);
} catch (IOException e) {
//DisplayError(R.string.error_unknown);
} catch (InvalidParameterException e) {
//DisplayError(R.string.error_configuration);
}
}
// public void write(String price, WriteType type) {
// try {
// if (os == null) return;
// int[] command = getCommand(price, type);
// byte[] bytes = new byte[command.length];
// for (int i = 0; i < command.length; i++) {
// bytes[i] = (byte) command[i];
// }
// os.write(bytes);
// os.flush();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
public void close() {
try {
if (os != null) {
os.close();
}
if (serialPort != null) {
serialPort.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
// private int[] getCommand(String price, WriteType type) {
// List<Integer> commands = new ArrayList<>();
// //找零
// if (type == TYPE_CHARGE) {
// commands.add(0X1B);
// commands.add(0X73);
// commands.add(0X34);
// commands.add(0X1B);
// commands.add(0X51);
// commands.add(0X41);
// //总计
// } else if (type == TYPE_TOTAL) {
// commands.add(0X1B);
// commands.add(0X73);
// commands.add(0X32);
// commands.add(0X1B);
// commands.add(0X51);
// commands.add(0X41);
// //全暗
// } else if (type == TYPE_CLEAR) {
// commands.add(0X1B);
// commands.add(0X73);
// commands.add(0X30);
// commands.add(0X1B);
// commands.add(0X51);
// commands.add(0X41);
// for (int i = 0; i < 7; i++) {
// commands.add(0X20);
// }
// commands.add(0x0D);
// int[] intArray = new int[commands.size()];
// for (int i = 0; i < intArray.length; i++) {
// intArray[i] = commands.get(i);
// }
//
// return intArray;
// }
//
// String str = price;
// for (int i = 0; i < str.length(); i++) {
// String temp = str.substring(i, i + 1);
// if (temp.equals(".")) {
// commands.add(0X2E);
// }
// if (temp.equals("0")) {
// commands.add(0X30);
// }
// if (temp.equals("1")) {
// commands.add(0X31);
// }
// if (temp.equals("2")) {
// commands.add(0X32);
// }
// if (temp.equals("3")) {
// commands.add(0X33);
// }
// if (temp.equals("4")) {
// commands.add(0X34);
// }
// if (temp.equals("5")) {
// commands.add(0X35);
// }
// if (temp.equals("6")) {
// commands.add(0X36);
// }
// if (temp.equals("7")) {
// commands.add(0X37);
// }
// if (temp.equals("8")) {
// commands.add(0X38);
// }
// if (temp.equals("9")) {
// commands.add(0X39);
// }
//
// }
// for (int i = 0; i < 8 - str.length(); i++) {
// commands.add(0X20);
// }
// commands.add(0X0D);
//
// int[] intArray = new int[commands.size()];
// for (int i = 0; i < intArray.length; i++) {
// intArray[i] = commands.get(i);
// }
//
// return intArray;
// }
public enum WriteType {
TYPE_CHARGE,
TYPE_TOTAL,
TYPE_CLEAR,
}
}
/*
* Copyright 2009 Cedric Priscal
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.joe.print.mvp.print.serial.utils;
import android.util.Log;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class SerialPort {
private static final String TAG = "SerialPort";
/*
* Do not remove or rename the field mFd: it is used by native method close();
*/
private FileDescriptor mFd;
private FileInputStream mFileInputStream;
private FileOutputStream mFileOutputStream;
public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException {
/* Check access permission */
if (!device.canRead() || !device.canWrite()) {
try {
/* Missing read/write permission, trying to chmod the file */
Process su;
su = Runtime.getRuntime().exec("/system/bin/su");
String cmd = "chmod 666 " + device.getAbsolutePath() + "\n"
+ "exit\n";
su.getOutputStream().write(cmd.getBytes());
if ((su.waitFor() != 0) || !device.canRead()
|| !device.canWrite()) {
throw new SecurityException();
}
} catch (Exception e) {
e.printStackTrace();
throw new SecurityException();
}
}
mFd = open(device.getAbsolutePath(), baudrate, flags);
if (mFd == null) {
Log.e(TAG, "native open returns null");
throw new IOException();
}
mFileInputStream = new FileInputStream(mFd);
mFileOutputStream = new FileOutputStream(mFd);
}
// Getters and setters
public InputStream getInputStream() {
return mFileInputStream;
}
public OutputStream getOutputStream() {
return mFileOutputStream;
}
// JNI
private native static FileDescriptor open(String path, int baudrate, int flags);
public native void close();
static {
System.loadLibrary("serial_port");
}
}
package com.joe.print.mvp.print.usb;
import java.io.UnsupportedEncodingException;
import java.util.Vector;
public class EscCommand {
private Vector<Byte> command;
public EscCommand() {
this.command = new Vector<>(4096, 1024);
}
public void addArrayToCommand(byte[] array) {
for (byte anArray : array) {
this.command.add(anArray);
}
}
private void addStrToCommand(String str) {
byte[] bs = null;
if (!str.equals("")) {
try {
bs = str.getBytes("GB2312");
} catch (UnsupportedEncodingException var4) {
var4.printStackTrace();
}
if (bs != null) {
for (byte b : bs) {
this.command.add(b);
}
}
}
}
/**
* 添加文本
*
* @param text 文本
*/
public void addText(String text) {
this.addStrToCommand(text);
}
/**
* 添加空行
*
* @param n 行数
*/
public void addPrintAndFeedLines(byte n) {
byte[] command = new byte[]{27, 100, n};
this.addArrayToCommand(command);
}
/**
* 切纸命令
*/
public void addCutPaper() {
byte[] bytes = new byte[]{(byte) 29, (byte) 86, (byte) 0};
this.addArrayToCommand(bytes);
}
public void addCleanCache() {
byte[] bytes = {(byte) 27, (byte) 74, (byte) 0};
this.addArrayToCommand(bytes);
}
//0 居左 1居中 2居右
public void addSelectJustification(int just) {
byte[] command = new byte[]{27, 97, (byte) just};
this.addArrayToCommand(command);
}
/**
* 获取打印命令
*
* @return byte[] 打印命令
*/
public byte[] getByteArrayCommand() {
return convertToByteArray(getCommand());
}
public Vector<Byte> getCommand() {
return this.command;
}
private byte[] convertToByteArray(Vector<Byte> vector) {
if (vector == null || vector.isEmpty())
return new byte[0];
Byte[] bytes = vector.toArray(new Byte[vector.size()]);
return toPrimitive(bytes);
}
private byte[] toPrimitive(Byte[] array) {
if (array == null) {
return null;
} else if (array.length == 0) {
return new byte[0];
} else {
byte[] result = new byte[array.length];
for (int i = 0; i < array.length; ++i) {
result[i] = array[i];
}
return result;
}
}
}
package com.joe.print.mvp.print.utils;
package com.joe.print.mvp.print.usb;
import android.content.Context;
import android.hardware.usb.UsbDeviceConnection;
......
package com.joe.print.mvp.print.utils;
package com.joe.print.mvp.print.usb;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
......
package com.joe.print.mvp.print.utils;
package com.joe.print.mvp.print.usb;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical">
<LinearLayout
android:id="@+id/layout_dining_table"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_print_model_dining_table"
style="@style/Print_text_style"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
tools:text="餐檯:1111" />
<TextView
android:id="@+id/tv_print_model_people"
style="@style/Print_text_style"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
tools:text="人數:10"/>
</LinearLayout>
<TextView
android:id="@+id/tv_print_model_order_number"
style="@style/Print_text_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="單號:42345" />
<TextView
android:id="@+id/tv_print_model_data"
style="@style/Print_text_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="下單時間:2020-05-06 12:11:23" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:id="@+id/tv_thank_you_text"
style="@style/Print_text_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
tools:text="Thank you!" />
<TextView
android:id="@+id/tv_checkout_time"
style="@style/Print_text_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="2020-01-09 上午 11:16:15" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
style="@style/Print_text_style"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:maxLines="1" />
<TextView
style="@style/Print_text_style"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:maxLines="1"
android:text="@string/print_split_line" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical">
<TextView
android:id="@+id/print_brand_name"
style="@style/Print_text_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:gravity="center"
tools:text="品牌名" />
<TextView
android:id="@+id/print_restaurant_name"
style="@style/Print_text_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center"
tools:text="餐廳名" />
</LinearLayout>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment