Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ハードウェア対応のリアル.pdf
Search
たまねぎ
May 16, 2023
130
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ハードウェア対応のリアル.pdf
たまねぎ
May 16, 2023
More Decks by たまねぎ
See All by たまねぎ
AIのAIによるAIのための出力評価と改善
chocoyama
3
960
[FlutterKaigi2024] Effective Form 〜Flutterによる複雑なフォーム開発の実践〜
chocoyama
1
13k
iOSDC2023:聴いて話すiOS 現実世界の「音」との連携
chocoyama
1
410
20分でわかる!速習resultBuilder(iOSDC 2022)
chocoyama
7
3.9k
SwiftUIっぽくした話
chocoyama
1
750
SwiftUIとGraphQLでプロダクトの継続的な破壊に立ち向かう
chocoyama
6
2.8k
Featured
See All Featured
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
71
40k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
170
Optimizing for Happiness
mojombo
378
71k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
330
HDC tutorial
michielstock
2
720
Ruling the World: When Life Gets Gamed
codingconduct
0
260
RailsConf 2023
tenderlove
30
1.5k
Transcript
ϋʔυΣΞରԠͷϦΞϧ !@DIPDPZBNB &CJTVNPCJMF
ࣗݾհ w ͨ·Ͷ͗ʢ!@DIPDPZBNBʣ w 4503&4ϨδͷJ04ΞϓϦ։ൃ w ϋʔυΣΞରԠ ॳΊͯΓ࢝Ί͔ͯΒd
ࠓ͢͜ͱ w ϋʔυΣΞରԠͱʁ w ։ൃͷϦΞϧ w ӡ༻ͷϦΞϧ w ςΫϊϩδʔʹΑΔ՝ղܾ
˞શମతʹJ04دΓͷʹͳΓ·͢🙏
ϋʔυΣΞରԠͱʁ
ϝΠϯػͱผͷೖग़ྗͱ࿈ܞ͢ΔରԠ ܾࡁ υϩΞʔ όʔίʔυεΩϟφʔ ΧελϚʔσΟεϓϨΠ #FBDPO ϚΠΫ εϐʔΧʔ ϖϯγϧ Ϛε
ΩʔϘʔυ ΠϠϗϯ ೖྗ ग़ྗ ϓϦϯλʔ εϚʔτϑΥϯ୯ମͰ ղܾͰ͖ͳ͍՝ʹϦʔνͰ͖Δ
4503&4ϨδͷରԠϋʔυΣΞͱػೳ όʔίʔυεΩϟφʔͰɺΞΠςϜΛΧʔτʹՃ Ճͨ͠ΧʔτͷใΛɺΧελϚʔσΟεϓϨΠʹө ܾࡁͰɺܾࡁॲཧΛ࣮ߦ ܾࡁ͕ྃͨ͠จͷϨγʔτΛɺϓϦϯλʔͰग़ྗ
ར༻͍ͯ͠Δٕज़ ར༻ٕज़ ܾࡁ #MVFUPPUI ϓϦϯλʔ υϩΞʔ #MVFUPPUI όʔίʔυεΩϟφʔ #MVFUPPUI
ΧελϚʔσΟεϓϨΠ ʢεϚʔτϑΥϯʣ -PDBM/FUXPSL ղܾͰ͖Δ՝େ͖͍͕ɺ։ൃɾӡ༻ͷίετେ͖͍
։ൃͷϦΞϧ
࣮ϋʔυϧ͕ߴ͍ w ͱͷ࿈ܞ෦Ͱ ϨΠϠʔͳ࣮͕ඞཁ w ଓཧɾ௨৴ॲཧͰͷ ࡉ͔͍έΞ͕େม w
ඇಉظॲཧ͕ଟ͘ɺ ॲཧͷྲྀΕ͕௫ΈͮΒ͍ uint8_t *pos_papercut(cy_printer const printer, size_t *out_len) { if(printer & cy_paper_cut) { INIT_BUF(); size_t nl_len; uint8_t * const newlines = pos_cutter_newlines(printer, &nl_len); if(nl_len > 0) APPEND_BUF(newlines, nl_len); if(CY_PRINTER_TYPE(printer) == cy_sm_desktop_printer) APPEND_BUF_AUTO(POS_LM_CUTPAPER); else APPEND_BUF_AUTO(POS2_CUTPAPER); if(out_len) *out_len = BUF_LEN(); return BUF(); } else return pos_cutter_newlines(printer, out_len); } $ݴޠʹΑΔ࣮ίʔυ
ςετ͕ͮ͠Β͍ w ग़͕ࣾඞཁ w ࣗಈςετͰͷ୲อ͕ͮ͠Β͍ w 04ɾόʔδϣϯ͚ͩͰͳ͘ɺ ϝʔΧʔϋʔυΣΞछผͷ
ֻ͚߹Θͤ૿͑Δ
ӡ༻ͷϦΞϧ
༷ʑͳڥɾछྨͷରԠ͕େม w #MVFUPPUIͷׯব8J'JઃఆʹΑΔҟৗಈ࡞ w ϝʔΧʔʹґଘͨ͠ෆ۩߹ใࠂ w αϙʔτΛΓͮΒ͍
Ϋϥογϡෆ۩߹͕ൃੜ͍͢͠ w τοϓΫϥογϡϋʔυΣΞؔ࿈͕੮ר w ؆୯ʹݪҼΛಛఆͰ͖ͳ͍Ϋϥογϡϩά
ͭΒΈϙΠϯτ·ͱΊ w ࣮ɾอकͷϋʔυϧ͕ߴ͍ w ෆ۩߹͕ى͖ࠩ͋͘͢Δ w ςετίετ͕ߴࣗ͘ಈԽͮ͠Β͍ w αϙʔτΛΓͮΒ͍ ςΫϊϩδʔͰղܾ͠Α͏ʂ
࣮ɾอकͷϋʔυϧΛԼ͛ΔऔΓΈ w ࣄྫɿඇಉظॲཧΛ4XJGU$PODVSSFODZͰ୯७Խ w ࣄྫɿυΩϡϝϯτཧղΛ$IBU(15ͰߴԽ w ࣄྫɿ۪ͳ࣮Λ3FTVMU#VJMEFSͰநԽ
ࣄྫɿඇಉظॲཧΛ4XJGU$PODVSSFODZͰ୯७Խ w ՝ w %FMFHBUF$PNQMFUJPO)BOEMFSϕʔεͷ࣮͕ଟ͍ w ඇಉظॲཧΛ࿈ଓͰߦ͏έʔεଟ͍ w ίʔϧόοΫࠈʹͳΓɺॲཧϑϩʔ͕ಡΈऔΓͮΒ͍ w
5SZ w 4XJGU$PODVSSFODZΛ༻͍࣮ͨʹஔ͖͑ w ίʔυΛ୯७ʹ্͔ΒԼಡΉ͚ͩͰ͍͍ঢ়گʹվળ
detectPaperWidth { guard $0 != PaperWidth.unknown else { // Ϩγʔτ෯ͷऔಘʹࣦഊͨ͠߹ɺ1͚ͩϦτϥΠ͢Δ
_ = detectPaperWidth { update(paperWidth: $0) } return } update(paperWidth: $0) } var paperWidth = await paperWidthDetector.getWidth() if paperWidth == .unknown { // Ϩγʔτ෯ͷऔಘʹࣦഊͨ͠߹ɺ1͚ͩϦτϥΠ͢Δ paperWidth = await paperWidthDetector.getWidth() } update(paperWidth: paperWidth) ωετ͕গͳ͘ɺॲཧͷྲྀΕ͕௫Έ͘͢ͳͬͨ $PNQMFUJPO)BOEMFS%FMFHBUF 4XJGU$PODVSSFODZ ˞ཁΛߜΔͨΊσϑΥϧϝͯ͠·͢ XJUI$IFDLFE$POUJOVBUJPOͰɺ ڧ੍తʹ4XJGU$PODVSSFODZͷܗ
func getWidth() async -> PaperWidth { await withCheckedContinuation { (continuation:
CheckedContinuation<PaperWidth, Never>) in session.listen { inputStream, _ in var input: UInt8 = 0 let inputLength = inputStream.read(&input, maxLength: 4096) if inputLength > 0 { let paperWidth = getPaperWidth( printerModel: printerModel, fromResponseValue: Data(bytes: &input, count: inputLength).ex.toBytes() ) continuation.resume(returning: paperWidth) } } session.write(Data(bytes: cmd, count: cmdLength)) } } ֎͔Βݟͨ࣌BTZODBXBJUͷγϯϓϧͳ*' $PNQMFUJPO)BOEMFSϕʔεͷ۪ͳ࣮ ด͡ࠐΊͯநԽ͢Δ
let print = { printReceiptML(receiptML) _ = cutPaper() completion() }
let supportedVariableWidth = (printerType & cy_variable_paper_width) != 0 if supportedVariableWidth { let continuePrint = { (width: PrinterWidth) in paperWidth = width print() } detectPaperWidth { guard $0 != PrinterWidth.unknown else { _ = detectPaperWidth { continuePrint($0) } return } continuePrint($0) } } else { print() } guard let activePrinter, let receipt = PaymentReceipt(order: order, store: store)?.build(), let image = try? await receipt.image( width: CGFloat(await activePrinter.receiptWidth()) ) else { return } activePrinter.printReceiptImage(image) ϨΨγʔͳ෦ΛϞμϯͳٕज़Ͱϥοϓ ҹ໋ྩΛߦ͏ؔͷαϯϓϧ ॲཧͷྲྀΕ͕͍͘͢ͳΓɺίʔυͷݮͰ͖ͨ
ࣄྫɿυΩϡϝϯτཧղΛ$IBU(15ͰߴԽ ʮग़ྗ͞ΕΔ༻ࢴ෯ͷऔಘʯʹؔ͢ΔϓϦϯλʔͷެࣜυΩϡϝϯτ
ϋʔυΣΞؔ࿈ͷυΩϡϝϯτ w ՝ w ීஈࢀর͢Δ%PDͱ͔͚Εͨ༰ w αοͱཧղ͢Δʹϋʔυϧ͕ߴ͍ w ࣄྫ͕গͳ͘άάͬͯώοτͮ͠Β͍ w
5SZ w άάͬͯμϝͳΒδϐͬͯΈΑ͏
%PDͷҰ෦Λίϐϖͯ͠ ʮΑ͘Θ͔Βͳ͍ͷͰɺΘ͔ΔΑ͏ʹڭ͑ͯʯ ͬͯݴͬͯΈΔ ˠৄࡉͳղઆΛͯ͘͠ΕΔ $IBU(15ͷ׆༻
·ͩΑ͘Θ͔Βͳ͍ͷͰɺ υΩϡϝϯτʹهࡌͷͳ͍ύλʔϯΛྫʹ ༷ͷཧղΛਂΊΑ͏ͱ͢Δ ˠ%PDͷΑ͏ʹҰൠԽͨ͠༰Ͱͳ͘ɺ ʮ"ͷ߹ɺ#ʹͳΔʯͱ͍ͬͨ ۩ମతͳ༷Λڭ͑ͯ͘ΕΔ
ˠ۩ମతͳظ݁ՌΛڭ͑ͯ͘ΕΔ ੩తͳ%PDͰෆՄೳͳΠϯλϥΫςΟϒͳ2"ʹΑΓɺ ཧղ͕ઙ͍෦Λ໌֬ʹ͠ͳ͕Β༷ΛѲͰ͖ͨ ༷͕໌֬ʹͳͬͨͷͰɺ ࠓճͷϢʔεέʔεΛΠϯϓοτ͢Δ͜ͱͰ ͦͷ߹Ͳ͏ͳΔ͔Λฉ͘
ࣄྫɿ۪ͳ࣮Λ3FTVMU#VJMEFSͰநԽ 9.-จࣈྻͷੜΛɺ4XJGU6*ͷΑ͏ͳ*'ͰͰ͖ΔΑ͏ʹͨ͠ SFGʲJ04%$ʳͰΘ͔ΔʂशSFTVMU#VJMEFS
·ͱΊ w ਖ਼ϋʔυΣΞରԠΛͯ͠ΔͱɺͭΒ͍ہ໘ʹʑͿ͔ͭΔ w ϨΠϠʔͳ࣮ϨΨγʔͳ෦Λɺ Ϟμϯͳٕज़ͰิͰ͖Δָ͕͋͠͞Δ w ιϑτΣΞ͚ͩͰ࣮ݱͰ͖ͳ͍ϢʔβʔମݧΛఏڙͰ͖Δ
େม͚ͩͲɺ ໘ന͋͞ΔΑʂ