1 คะแนน โดย GN⁺ 2025-05-25 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • rotary_dial_kmod เปลี่ยน หน้าปัดหมุนของโทรศัพท์ ให้เป็นอุปกรณ์อินพุต evdev ของ Linux ทำให้จัดการอินพุตจากการหมุนหน้าปัดได้เหมือนแป้นตัวเลข
  • วิธีทำงานคือการเชื่อมต่อ สวิตช์ BUSY/PULSE เข้ากับขา GPIO ของ SoC และเนื่องจากเป็นหน้าสัมผัสเชิงกล จึงต้องจัดการการเด้งของสัญญาณ
  • ชื่อหน้าสัมผัส ความยาวพัลส์ และการเข้ารหัสตัวเลขอาจแตกต่างกันไปตามประเทศและผู้ผลิต จึงสำคัญที่จะต้องตรวจสอบการเดินสายจริงและป้ายกำกับ
  • ผู้ใช้ต้องตั้งค่าโหนด rotary-dial รวมถึง pulse-gpios และ busy-gpios ใน devicetree จากนั้นบิลด์และโหลดเป็น เคอร์เนลโมดูลนอกทรี
  • แม้ไม่มีฮาร์ดแวร์จริง ก็สามารถรันการทดสอบแบบ end-to-end ใน VM สำหรับพัฒนา ได้ โดยควบคุม GPIO แบบ BUSY/PULSE ที่อิงกับ gpio-sim

แปลงหน้าปัดหมุนเป็นอุปกรณ์อินพุต evdev

  • rotary_dial_kmod เป็นไดรเวอร์เคอร์เนล Linux ที่เปลี่ยนหน้าปัดหมุนของโทรศัพท์ให้เป็น อุปกรณ์อินพุต evdev
  • ออกแบบโดยคำนึงถึงสถานการณ์ต่อไปนี้
    • กรณีที่ชอบ การหมุนเลขที่ช้ากว่า แป้นตัวเลข
    • กรณีที่ต้องการใช้โทรศัพท์หมุนหน้าปัดรุ่นเก่าในสภาพแวดล้อมดิจิทัล
    • กรณีที่ต้องการตัวอย่างไดรเวอร์แบบง่าย ๆ ซึ่งมีสภาพแวดล้อมพัฒนาและทดสอบ end-to-end บน VM โดยไม่ต้องมีฮาร์ดแวร์จริง
    • กรณีการใช้งานสร้างสรรค์อื่น ๆ

การเดินสายและการทำงานของสัญญาณ

  • โปรเจกต์นี้มองหน้าปัดหมุนเป็นอุปกรณ์ที่ประกอบด้วยสวิตช์สองตัวคือ BUSY และ PULSE
    • BUSY เป็น normally open
    • PULSE เป็น normally closed
    • สวิตช์ทั้งสองเชื่อมต่อกับขา GPIO ของ SoC ที่รัน embedded Linux ผ่านตัวต้านทาน pull-up
  • เมื่อหมุนหน้าปัดไป สวิตช์ BUSY จะปิด และขา busy จะถูกขับเป็น low
  • ระหว่างที่หน้าปัดหมุนกลับสู่ตำแหน่งเดิม สวิตช์ PULSE จะเปิดซ้ำ ๆ และขา pulse จะถูกขับเป็น high
  • เนื่องจากเป็นสวิตช์เชิงกล จึงอาจเกิด การเด้งของสัญญาณ ได้

ความแตกต่างตามประเทศและผู้ผลิต

  • การระบุหน้าสัมผัสของสวิตช์อาจแตกต่างกันไปตามประเทศและผู้ผลิต หรืออาจไม่มีระบุไว้เลย
    • ในเยอรมนี สวิตช์ BUSY เรียกว่า nsa
    • ในเยอรมนี สวิตช์ PULSE เรียกว่า nsi
  • หากไม่แน่ใจเรื่องการจัดขา ให้ค่อย ๆ ขยับหน้าปัดและใช้ตัวทดสอบความต่อเนื่องของมัลติมิเตอร์เพื่อตรวจสอบการตอบสนองของสวิตช์
  • duty cycle และระยะเวลาของสัญญาณพัลส์ก็แตกต่างกันไปตามประเทศและผู้ผลิต
    • ตัวอย่างในเยอรมนี สวิตช์ PULSE จะ เปิด 62ms และปิด 38ms ต่อหนึ่งพัลส์
  • โดยส่วนใหญ่ พัลส์ 1~9 ครั้งจะตรงกับตัวเลข 1~9 และพัลส์ 10 ครั้งจะตรงกับ 0
  • บางประเทศใช้การเข้ารหัสต่างออกไป เช่น ตัวอย่างในสวีเดน พัลส์ 1 ครั้งคือ 0 และพัลส์ 10 ครั้งคือ 9
  • หากไม่แน่ใจ ควรตรวจสอบป้ายกำกับบนหน้าปัด

วิธีใช้เคอร์เนลโมดูล

  • ไดรเวอร์นี้เป็น เคอร์เนลโมดูลนอกทรี มาตรฐาน
  • ขั้นตอนการใช้งานเริ่มจากสมมติว่ามีสภาพแวดล้อมสำหรับบิลด์เคอร์เนล Linux พร้อมแล้ว และโฮสต์ที่ใช้บิลด์กับโฮสต์เป้าหมายเป็นเครื่องเดียวกัน
  • ในสภาพแวดล้อมจริง มักบิลด์ด้วย cross toolchain ที่ Yocto หรือ Buildroot จัดเตรียมให้
  • ต้องเพิ่มโหนด rotary-dial ใน devicetree
    • พร็อพเพอร์ตี pulse-gpios ผูกกับขา GPIO ของ pulse
    • พร็อพเพอร์ตี busy-gpios ผูกกับขา GPIO ของ busy
    • สามารถเปลี่ยนแมป keycode เริ่มต้นได้ตามต้องการผ่านพร็อพเพอร์ตี linux,keycodes
    • รายละเอียดและตัวอย่างอยู่ใน devicetree binding
  • ตัวแปรสภาพแวดล้อม KDIR ต้องชี้ไปยัง source tree ของเคอร์เนล
  • การบิลด์ ติดตั้ง และโหลดทำได้ด้วยคำสั่งต่อไปนี้
make
make install
modprobe rotary_dial
  • เมื่อโหลดเคอร์เนลโมดูลแล้ว อุปกรณ์อินพุตหน้าปัดหมุนจะปรากฏขึ้น และโดยค่าเริ่มต้นจะทำงานเหมือนแป้นตัวเลขตามการแมป keycode
  • สำหรับการดีบัก สามารถใช้แพ็กเกจ evemu ได้
    • ใช้ evemu-describe เพื่อตรวจสอบคุณสมบัติของอุปกรณ์อินพุต
    • ใช้ evemu-record เพื่อตรวจดูเหตุการณ์จากการหมุนหน้าปัด

VM สำหรับพัฒนาและการจำลอง

  • มี VM สำหรับการพัฒนาไดรเวอร์และการทดสอบ end-to-end
  • เคอร์เนล Linux ใน VM ถูกใช้ แพตช์ devicetree แล้ว
  • devicetree นี้ให้ไลน์ GPIO ของ busy และ pulse ที่จำลองผ่าน gpio-sim
  • สามารถจำลองการโทรด้วยหน้าปัดหมุนได้โดยควบคุมไลน์ GPIO จาก user space
  • ขั้นตอนการใช้ VM มีดังนี้
    • ติดตั้ง Nix package manager
    • เปิดใช้งาน flakes
    • บิลด์ VM ด้วย make vm
    • อาจใช้เวลาสักพัก เพราะต้องบิลด์เคอร์เนลใหม่พร้อมการตั้งค่าแบบกำหนดเองและแพตช์ devicetree
    • รัน VM ด้วย make run-vm
    • หลังเริ่มต้น จะเข้าสู่ระบบในเชลล์สำหรับพัฒนาโดยอัตโนมัติ
  • ใน VM ค่า KDIR จะชี้ไปยังผลลัพธ์การบิลด์เคอร์เนลของ VM จึงสามารถบิลด์ไดรเวอร์ได้ด้วย make เพียงอย่างเดียว
  • บาง target ของ clang-format และ clang-tidy ใช้แค่ผลลัพธ์การบิลด์ไม่พอ และ KDIR ต้องชี้ไปยังซอร์สเคอร์เนลที่ดาวน์โหลดแยกต่างหาก
  • หลังบิลด์แล้ว สามารถโหลดและยกเลิกโหลดไดรเวอร์ได้ด้วย target insmod และ rmmod

rotary_dialer และการทดสอบ

  • rotary_dialer จำลองการหมุนเลขโดยควบคุมไลน์ GPIO
  • บิลด์ด้วยคำสั่งต่อไปนี้
make rotary_dialer
  • ตัวอย่างการหมุนสามพัลส์มีดังนี้
test/rotary_dialer 3
  • เมื่อกลับมาที่เชลล์ ควรเห็นตัวเลข 2 เนื่องจาก devicetree สำหรับจำลองตั้งค่าเป็น การเข้ารหัสแบบสวีเดน
  • ชุดทดสอบสามารถรันได้ใน VM สำหรับพัฒนา
make test
  • การทดสอบจะโหลดเคอร์เนลโมดูลและรันหลายกรณี
    • ตรวจสอบความสามารถของอุปกรณ์อินพุต
    • หลังหมุนตามจำนวนพัลส์ที่กำหนด ตรวจสอบว่า keycode ที่คาดไว้ถูกปล่อยออกมาหรือไม่
    • ตรวจสอบว่าจัดการอินพุตที่ไม่ถูกต้องได้อย่างเหมาะสมหรือไม่

การรวมเข้า mainline

  • คำอธิบายโปรเจกต์จบด้วยมุกว่า แม้อนาคตของการใช้หน้าปัดหมุนเป็นอุปกรณ์อินพุตจะดูสดใส แต่ Linus Torvalds อาจไม่เห็นด้วย

1 ความคิดเห็น

 
GN⁺ 2025-05-25
ความคิดเห็นใน Hacker News
  • ช่วงปลายยุค 70 ผมเคยทำตัวหมุนเบอร์โทรศัพท์แบบจานหมุนด้วย เครื่องคิดเลข HP41C
    ต่อรีเลย์รีดแบบ NC เข้ากับบัซเซอร์เพียโซ และใส่หน้าสัมผัส NC แบบอนุกรมเข้ากับสายโทรศัพท์
    ใช้ synthetic programming ที่อาศัย opcode ที่ไม่มีเอกสารกำกับ เพื่อสร้างเสียงบี๊บสั้น ๆ ที่จำเป็นสำหรับพัลส์การหมุนหมายเลข และถ้าป้อนชื่อเป็นตัวอักษร/ตัวเลข ก็สามารถค้นหาเบอร์แล้วโทรออกได้
    ราว 10 ปีก่อน ผมเจอคนชื่อ Keith Jarrett ที่บริษัท และก่อนจะทันได้ถามว่าเขาใช่ Keith Jarrett คนที่เขียน HP-41C Synthetic Programming Manual หรือเปล่า เขาก็บอกว่า “ไม่ใช่ครับ ไม่ใช่นักดนตรี ทุกคนถามแบบนั้นกันหมด”
    พอผมถามจนจบ เขากลับดีใจและประหลาดใจมาก เพราะเขาคือผู้เขียนหนังสือเล่มที่ผมอ่านเมื่อ 35 ปีก่อนจริง ๆ
    https://picclick.com/HP-41-Synthetic-Programming-Made-Easy-b...
    https://www.hpmuseum.org/prog/synth41.htm

    • ผมกับเพื่อนก็เคยทำสิ่งนี้เหมือนกัน และใช้เป็น ตัวโทรด่วน ที่ทำงานได้กับโทรศัพท์ทุกเครื่อง
      ผมยังมีหนังสือคู่มือ synthetic programming ฉบับกระดาษอยู่เลย
      แม้ไม่นับเทคนิคนั้น เครื่องคิดเลขรุ่นนี้ก็เป็นเครื่องมือที่ตั้งโปรแกรมได้ที่ทรงพลังมากตามมาตรฐานต้นยุค 1980
      ผมกับเพื่อนคนเดิมยังเขียนโปรแกรมที่จัดการการคำนวณทั้งหมดในคลาสระดับบัณฑิตศึกษาเรื่องการสร้างแบบจำลอง S-parameter ของการส่งสัญญาณ RF และเมื่อเอาไปอวดอาจารย์ “รางวัล” ที่ได้คือการห้ามใช้โปรแกรมในเครื่องคิดเลขในการสอบทุกครั้ง
      ภายหลังผมถึงได้รู้ว่าระหว่างสาย RF กับสายอิเล็กทรอนิกส์ดิจิทัลในภาควิชาวิศวกรรมไฟฟ้ามี การแย่งชิงอาณาเขต กันอยู่
      เครื่องคิดเลข HP-41CX สอนบทเรียนที่สำคัญที่สุดข้อหนึ่งในหลักสูตรวิศวกรรมไฟฟ้าให้ผม นั่นคือในการตัดสินใจของมนุษย์ เทคโนโลยีมักไม่ใช่ลำดับความสำคัญสูงสุด
    • สงสัยว่าทำโปรแกรมแบบนั้นบนตัวเครื่องคิดเลขเองหรือเปล่า
      ผมเคยทำอะไรคล้าย ๆ กันบน hp49g และภูมิใจกับการเขียนโปรแกรมในสภาพแวดล้อมที่มีข้อจำกัด แต่ถ้าทำบน หน้าจอแสดงผลบรรทัดเดียวของ 41c ได้จริง นั่นคงเป็นความสำเร็จที่ยอดเยี่ยมมาก
  • ขอโปรโมตเล็กน้อยสำหรับคนที่ชอบโทรศัพท์แบบจานหมุน ผมดัดแปลงโทรศัพท์ของตัวเองให้เป็น เฮดเซ็ต Bluetooth ที่ใช้งานได้เต็มรูปแบบ รวมถึงโทรออกด้วยจานหมุนด้วย
    โพสต์ใน HN ไม่ค่อยไปได้สวย แต่ Hackaday นำไปลง
    https://hackaday.com/2024/10/31/bakelite-to-the-future-a-195...
    https://blog.waleson.com/2024/10/bakelite-to-future-1950s-ro...
    การทำโหมดทางเลือกให้กับแป้นตัวเลขแบบจานหมุน Bluetooth ไม่น่าจะยาก
    เหลือแค่ต้องหาเวลาให้ได้

    • เจ๋งดี ทุกวันนี้การใช้ ESP32 คุ้มค่ากว่ามาก แต่ผมก็ยังอยากลองเขียน Linux kernel driver ให้ได้อยู่ดี
  • สมัยที่ iPhone ยังเป็นแค่ข่าวลือ ผมเคยเสนอว่าถ้าใส่ touch wheel แบบ iPod ในตอนนั้นเข้าไป จะเป็นโอกาสดีในการชุบชีวิตหน้าปัดหมุนโทรศัพท์
    ทุกคนในที่ประชุมปฏิเสธอย่างหนักแน่น แต่ตอนนี้ต้องขอบคุณเรื่องนั้น แค่เตรียมกล่อง Linux ก็ใช้ความรู้สึกคลาสสิกแบบจานหมุนได้แล้ว

    • จริง ๆ แล้วไม่ได้มีแค่คุณคนเดียว: https://www.patentlyapple.com/2010/12/apple-wins-patent-for-...
      Steve Jobs ก็ถูกระบุเป็นหนึ่งในผู้ประดิษฐ์ของสิทธิบัตรนี้ด้วย
      ผมกับเพื่อนร่วมงาน Apple อีกคนก็ยื่นสิทธิบัตรที่แทบเหมือนกันในช่วงเวลาไล่เลี่ยกัน และอยู่พักหนึ่ง Apple มีสิทธิบัตรสองฉบับสำหรับการจำลองจานหมุนบน touch wheel
      สิทธิบัตรของผมหมดอายุไปในที่สุด ส่วนสิทธิบัตรของ Steve ได้รับการต่ออายุ
      ผมเสนอไอเดียนี้กับเพื่อนร่วมงานระหว่างมื้อค่ำในซานฟรานซิสโก ตอนที่ดื่มไปค่อนข้างมาก โดยนึกถึงเกมพินบอลเก่า ๆ ที่ให้สัมผัสทางกายภาพดีมากจนรู้สึกเหมือนของจริง
      ผมมองว่าแก่นสำคัญคือการทำ ฟิสิกส์ของหน้าปัดหมุน ให้ผู้ใช้สามารถหมุนไปยังเลขใด ๆ ได้อย่างรวดเร็วด้วยท่าทางที่เหมาะสม
      ตอนที่ผมเสนอไอเดียนี้ ผมยังไม่ได้รับข้อมูลเกี่ยวกับ iPhone แต่เพื่อนร่วมงานส่งเรื่องไปยังคณะกรรมการสิทธิบัตรและได้รับอนุมัติ
      เมื่อดูความคล้ายกับสิทธิบัตรของ Steve ผมคิดว่าคณะกรรมการคงขำกันอยู่ แต่ก็มีความแตกต่างใหญ่พอที่จะไม่ถือว่าซ้ำกัน
      เพียงแต่ดูเหมือนว่าพวกเขาอยากเพิ่มจำนวนสิทธิบัตรเกี่ยวกับ iPhone ให้เป็นส่วนหนึ่งของการตลาดช่วงแรก Steve เองก็พูดตอนเปิดตัว iPhone ว่ามี “สิทธิบัตรมากกว่า 200 ฉบับ” แล้ว
    • ถ้าเคยออก iPod สักรุ่นที่แค่เพิ่มเครือข่ายเซลลูลาร์เข้าไป คงเป็นไทม์ไลน์ที่ตลกมาก
      ใช้อันนี้เป็นอินพุตได้เลย: https://www.youtube.com/watch?v=9BnLbv6QYcA
    • น่าจะมีแอปที่ให้โทรออกด้วยจานหมุนบนหน้าจอสัมผัสอยู่แน่ ๆ
  • ถึงเวลาแล้วที่ใครสักคนควรใช้โทรศัพท์จานหมุนนั้นให้เกิดประโยชน์จริง ๆ แล้วเล่น Dark Souls ให้จบ

    • นึกขึ้นได้ว่าเคยเล่น Soul Calibur ด้วย คอนโทรลเลอร์เบ็ดตกปลา ของ Dreamcast ได้
  • ต้องมี เวอร์ชัน DTMF
    ในออสเตรเลียมีคนทำกล่องเล็กมาก ๆ ที่ทำงานด้วยไฟจากสายโทรศัพท์อย่างเดียว และแปลงพัลส์จากจานหมุนเป็น Touch Tone
    ผมใช้มันทำให้โทรศัพท์จานหมุนยังใช้งานต่อได้เรื่อย ๆ จนกระทั่งเมื่อไม่กี่ปีก่อนย้ายไปอาคารที่ไม่มีสาย POTS เสียดายมาก

    • ต่อเข้ากับ FXS/ATA แล้วทำเป็น โทรศัพท์ VoIP ก็ได้นี่?
      ผมเองก็ยังใช้โทรศัพท์หลายเครื่องแบบนั้นให้ทำงานอยู่ รวมถึงโทรศัพท์ทรงเชิงเทียนจากยุค 1920 ด้วย
  • ดีมาก ชอบ การทำไดรเวอร์แบบขั้นต่ำ แบบนี้
    มันแสดงให้เห็นว่าไดรเวอร์ต้องใช้โค้ดจริง ๆ น้อยแค่ไหน แต่ขณะเดียวกันก็แสดงให้เห็นด้วยว่าถ้าจะทำให้ไดรเวอร์พื้นฐานตัวหนึ่งทำงานได้ ต้องรู้จัก flag และเมธอดของเคอร์เนลมากแค่ไหน
    ตอนที่บอกว่า “ตอนแรกตั้งใจจะเขียนไดรเวอร์ใหม่ด้วย Rust เพื่อดูสถานะของโปรเจกต์ Rust for Linux แต่ไม่นานก็รู้ว่าบายดิ้งที่จำเป็นยังไม่มี และคงต้องรอตรงส่วนนั้นไปก่อน” นั้นน่าสนใจและค่อนข้างน่าผิดหวัง แต่ก็ไม่ได้เกินคาด
    ถ้าบันทึกแนวทางที่ใช้และอุปสรรคที่เจอไว้ น่าจะกลายเป็นบล็อกโพสต์ที่น่าสนใจได้

    • น่าเสียดายที่ตอนนี้มี Rust binding แค่สำหรับ API ของซับซิสเต็ม บางส่วนเท่านั้น เลยยังไปได้ไม่ไกลพอที่จะมีเนื้อหาให้เขียนอย่างมีความหมาย
      ถ้าราวปีหน้าการรองรับโตเต็มที่จนสามารถเขียนใหม่ด้วย Rust ได้ ผมก็ยินดีจะเขียนเล่าประสบการณ์
  • นึกถึงเรื่องเกี่ยวกับโทรศัพท์แบบหมุนเมื่อราว 30 ปีก่อน
    ผมไม่ได้ใช้โทรศัพท์แบบหมุนเอง แต่เกี่ยวข้องกับเครือข่ายโทรศัพท์ที่ยังคงเข้ากันได้กับโทรศัพท์แบบนั้น
    แทนที่จะเล่าซ้ำ ขอแปะลิงก์ไว้ตรงนี้:
    https://news.ycombinator.com/item?id=40391220
    เพื่อกระตุ้นความอยากรู้ เป็นเรื่องที่มีเสียงเคาะประตูดัง ๆ กับคำว่า “San Jose Police! Open up!”

    • เรื่องนั้นคุ้น ๆ จนกำลังจะคอมเมนต์ว่า 112 ถูก redirect ไปที่ 911
      เพราะ 112 หมุนง่ายกว่า แต่ปรากฏว่าตอนเห็นโพสต์นั้นครั้งแรกเมื่อปีก่อน ผมก็เคยคอมเมนต์แบบเดียวกันไปแล้ว
    • เท่าที่ผมรู้ PSTN ทั้งหมดเคยรองรับหรือยังรองรับการหมุนแบบ pulse อยู่
  • นึกถึงตอนที่ Sarah ที่ Connections Museum ใน Seattle เขียนไดรเวอร์ให้ Asterisk soft PBX บนเครื่อง Linux สื่อสารกับ trunk แบบ pre-DTMF ของชุมสายโทรศัพท์เก่าด้วย revertive pulse signaling
    https://www.youtube.com/watch?v=35N5vKKGDy8

  • ในแง่ประวัติศาสตร์ที่พลิกมุมน่าสนใจ โทรศัพท์แบบหมุนของนิวซีแลนด์มีการจับคู่ตัวเลขกับจำนวน pulse กลับด้านกัน
    ที่นั่นจำนวน pulse คือ 10 - ตัวเลข

    • เรื่องนี้มีเหตุผลเชิงเทคนิคลึก ๆ อยู่ด้วย
      ผมน่าจะเป็นหนึ่งในคนที่ยังมีชีวิตอยู่เพียงไม่กี่คนที่รู้เหตุผลนั้น เลยขอแชร์ไว้เพื่อไม่ให้ความรู้นี้สูญหาย
      ในบรรดาชุมสายโทรศัพท์แบบกลไกยุคค่อนข้างแรก ๆ มีสิ่งที่เรียกว่า rotary exchange [0]
      pulse จากโทรศัพท์จะไปต่อคลัตช์ในชุมสายให้ชุดขับหมุนทำงาน และนั่นจะไปขยับอุปกรณ์สวิตชิ่ง
      หนึ่งในปัญหาของ rotary exchange คือแผ่นคลัตช์สึก ทำให้การเชื่อมต่อไม่เสถียร
      ตอนที่ Aotearoa/NZ ตัดสินใจติดตั้ง rotary exchange นั้น มีแผนเลขหมายเดิมอยู่แล้ว
      มีคนฉลาดคนหนึ่งรู้เรื่องปัญหาการสึกหรอ และคำนวณจากแผนเลขหมายเดิมว่า ถ้าตำแหน่ง 1 บนหน้าปัดทำให้เกิด 9 pulse จะลดการสึกของแผ่นโดยรวมได้มาก ทำให้ต้องบำรุงรักษาน้อยลง
      วิธีนี้จึงเริ่มจากตรงนั้น
      อีกข้อที่น่าสนใจคือ เท่าที่ผมรู้ Norway ก็เลือกการจัดแบบเดียวกันสำหรับโทรศัพท์แบบหมุน
      แต่ไม่แน่ใจว่าเป็นด้วยเหตุผลเดียวกันหรือไม่
      [0] https://en.wikipedia.org/wiki/Rotary_system
  • พอดีมีโทรศัพท์แบบหมุนที่ถอดแยกชิ้นส่วนวางอยู่บนโต๊ะ และกำลังกรอ clock spring กลับเข้าไปใหม่ตอนโพสต์นี้ขึ้นมา
    เป็นเรื่องบังเอิญแปลกดี

    • ถามจริง ๆ นะ โทรศัพท์เครื่องนั้นถูกถอดแยกชิ้นส่วนวางอยู่บนโต๊ะมานานแค่ไหนแล้ว?
      ถ้าเหมือนผม ก็น่าจะประมาณ 2 ปีแล้ว