กลับมาหัดเขียน win32 API อีกครั้ง หลังจากมาเขียน Qt อยู่นาน (เมื่อ 15-16 ปีก่อน บ้ามากถึงขนาดไปสอบจนได้ cer MCSD Visual C++ มา แล้วหลังจากนั้นไม่นานมันก็ออก .net มา ฮือ ฮือ) เป็นโปรแกรมเล็กๆตัวนึง ทำอะไรไปบ้าง จะมาเล่าให้ฟังครับ อิอิ
requirement คือต้องการโปรแกรมที่เอาไปดักจับข้อมูลจากเครื่องสแกนบาร์โค้ด โดยที่ระบบเค้าก็ทำงานไปปกติ โดยข้อมูลจะเอาไปล็อกไว้ผ่านทาง TCP
จริงๆ SI ก็หาโซลูชั่นได้แล้วใช้แอพสองตัวช่วยกันแต่ติดที่ลิขสิทธิ์เพราะต้องไปลงใน POS หลายเครื่องก็หลายเงินอยู่ ก็เลยต้องหาทางเขียนเอา
ปัญหาที่ต้องหาวิธีแก้คือ ดักจับข้อมูลเฉพาะบาร์โค้ด ไม่ไปยุ่งกับการทำงานเดิม และส่งข้อมูลผ่าน TCP
เรื่องแรกก็ต้องหาทางรู้ก่อนว่าจะดักจับ data จาก HID ตัวไหน(ที่มันเป็น barcode scanner)
เรื่องดักจับข้อมูล ตอนแรกว่าจะใช้ hooking ก็เลยหาวิธีที่สะดวกกว่าได้ เพราะ ใช้ hooking คุ้นๆว่าตัว anti ไวรัส มักจะฟ้อง
เรื่องตัวโปรแกรม ก็ทำให้มันไม่มีหน้าตา(GUI) จะได้ไม่ไปเกะกะหน้าจอเค้า รับแต่ windows message ได้อย่างเดียวพอ จะทำเป็น service ก็ยุ่งยากไป
เรื่องสร้าง tcp server คอยส่ง data ให้ client เนื่องจากอยากให้มันเป็น async เลยใช้แบบ WSAASYNCSELECT ไม่ต้องมี thread ให้ยุ่งยาก รองรับ client ตัวเดียว สบายไป
เรื่องปวดหัวสุดท้ายอยู่ที่ data เนี่ยละ มันเข้ามาเป็นแบบเสมือนเรากด keyboard (virtual key) ลองนึกถึงการกด shift หรือ ctrl ตามด้วย key แล้วต้องแปลงข้อมูลเป็น char array ส่งผ่านเน็ตเวอร์ค อันนี้ก็หาทางแปลงไปมั่วๆ ออกมาได้
ทีนี้โปรแกรมตัวมันเล็กทำงานน้อยๆก็เลยจะไม่ใช้ Qt จะได้สะดวกตอนเอาไป install เลยกลับไปเขียน VC++ เพียวๆ ที่ไม่ได้เขียนนานมากแล้ว
เสร็จละครับ โปรแแกรมเล็กๆตัวนึง
คลังเก็บผู้เขียน: สี่สิบดีกรี
QChart.js : awesome chart for QML
เนื่องด้วยต้องทำหน้า report สืบต่อเนื่องจากงานที่แล้ว กลายเป็นว่างานนี้ใช้เวลาไปโขอยู่ครับ เผลอๆจะพอๆกับตัวโปรแกรมหลักเลยทีเดียว ดีที่ว่าเจอโปรเจ็คนึงทำออกมาได้สุดยอดครับ ช่วยให้งานนี้ง่ายขึ้นเยอะ เป็นการพอร์ท Chart.js มาเพื่อให้สามารถใช้งานกับ QML ได้ โปรเจ็คนี้มีชื่อว่า QChart.js ครับ ก็ไปหามาลองใช้กันดู
control อีกสองตัวที่อยากพูดถึง ซึ่ง Qt น่าจะเอามาใส่ไว้ในเวอร์ชั่น Community ก็คือ date picker และ tumbler ผมก็ไปหามาใช้จนได้ อิอิ จริงๆ tumbler เนี่ยเคยมีอยู่ใน QML1 บน Qt 4.8 นะถ้าผมจำไม่ผิด เป็นตัวอย่างโค้ดหรืออย่างไรเนี่ยแหละ
ครับ หายไปนาน ก็มีเรื่องมาฝากกันเท่านี้ก่อน ในฐานะ Qt fan club อีกเช่นเคย ฮ่าๆ ผมก็ต้องเรียนรู้ หัดเขียน javascript เพิ่มขึ้นมาอีกอย่างหนึ่ง เพื่อให้ใช้งาน QML ได้อย่างเต็มเม็ดเต็มหน่วย ฟีเจอร์เด็ด พวก animation ของมันผมก็ยังไม่ค่อยคล่อง มีโอกาสจะนำมาเสนอในคราวต่อๆไปครับ
อ้างอิง : https://github.com/jwintz/qchart.js/tree/master
QR code generator and Printing
หลังจากที่ได้เขียนตัวอ่าน QR code ไปแล้ว ก็ถึงคราวต้องทำ ตัว generator ละครับ สร้างขึ้นมาอย่างเดียวไม่พอ ก็ต้องปรินท์ออกมาได้ด้วยถึงจะนำไปใช้ประโยชน์ได้ครับ
ผมใช้ libPrison ในการสร้าง QR ก็สะดวกง่ายดายดีครับ ในส่วนของการปรินท์ Qt ก็ให้ API มาให้ค่อนข้างดีทีเดียว การเรียกใช้ print preview dialog การเพิ่มจำนวนหน้า ทำได้ไม่ยากเลย
เหลือที่จุกจิกกวนใจก็ตรงการกำหนดขนาดและทำการ resize สิ่งที่เราจะวาดให้ตรงกับขนาดของกระดาษที่เราจะพิมพ์นั่นละครับ ผมใช้วิธี resize และ render widget เอาเลย โดยทำ widget ที่มีส่วนประกอบและวาง layout ดังรูป กำหนดขนาดและจำนวนที่จะ render ให้พอดีกับขนาดของกระดาษโดยประมาณเอา
Video Compositing with LibCairo
ในที่สุดก็ได้ฤกษ์เอา BlackMagic DeckLink Studio ออกมาเล่นอะไรสักอย่างสักทีครับ ดองไว้เป็นปีละ จริงๆซอฟแวร์ทำ Cg ฟรีๆก็มี ดูน่าจะดีด้วย นั่นคือ CasparCG ซึ่งรองรับ DeckLink ซะด้วย เพียงแต่มันไม่มีเวอร์ชั่นบน Linux ก็เลยปล่อยผ่านไปก่อน
วันนี้จึงได้ทำการทดลองเขียนโปรแกรม เอาภาพวิดิโอจาก webcam USB นี่ละ เพราะรอ กล้อง SDI 720p จากจีนอยู่ยังไม่มาสักที ไม่งั้นคงได้ทดสอบการ์ด DeckLink ในการรับอินพุตด้วยแล้ว ซึ่งการ์ดในตระกูล DeckLink นั้นมี driver รองรับสามารถใช้กับ Linux ได้เกือบทุกรุ่นครับ แม้กระทั่งรุ่นเล็กราคาไม่กี่พันบาท จึงเป็นทางเลือกที่ีดีทางหนึงในการเอามาใช้งาน
ส่วนประกอบหลักของโปรแกรมก็คือ GStreamer ครับ ผมเขียนด้วย C โดยมี Elements หลักๆก็คือ v4l2 source, libcairo และ decklink sink นั่นเอง เพื่อทดสอบว่าเราก็สามารถทำ graphics บน tv แบบง่ายๆได้โดยใช้เครื่องมือไม่ต้องมากมายหรือแพงๆ ตัวอย่างนี้ผมลองใส่ตัวอักษรวิ่งกับนาฬิกาเข้าไป ซึ่งส่วนประกอบของนาฬิกานั้นมาจากไฟล์ svg
ลองนึกถึงการถ่ายทอดสดลง youtube เล่นๆเวลามีกิจกรรมอะไร หรืออยากทำรายการเป็นของตัวเอง แล้วใส่กราฟิกเข้าไปแบบเรียลไทม์ได้ ก็ทำให้ดูโปรขึ้นมากเลยทีเดียว อิอิ (ผมคิดเอาเองนะครับ)
libcairo ค่อนข้างเป็น lib พื้นฐานต้องเหนื่อยเหมือนกันหากอยากได้กราฟิกที่ซับซ้อนเหมือน flash ก็หวังไว้ว่าอีกไม่นาน จะมีปลั๊กอิน QML ทำได้ในลักษณะอย่างนี้เหมือน libcairo ซึ่งก็น่าจะทำให้ทำอะไรได้ง่ายขึ้นอีกไม่น้อยเลยครับ
ทำระบบคาราโอเกะ Karaoke with PCDuino3 Nano
เมื่อทำการทดสอบ 2d/3d ไปแล้ว ทีนี้มาลองทดสอบ multimedia กันบ้างครับ โดยข้อมูลจาก linux-sunxi เค้าบอกว่า เราสามารถเล่นไฟล์มัลติมีเดียได้โดยอาศัย vdpau ผ่านทางโปรแกรม mplayer
แต่เมื่อทดลองใช้งานแล้วปรากฎว่า ตัวที่ทางผู้ผลิต install มาให้นั้น น่าจะเป็นเวอร์ชั่นเก่าครับ ต้องลง mplayer2 จาก repository แทนมันถึงจะไปเรียกใช้ vdpau ได้ แต่ก็ดูเหมือนจะมีปัญหาอีก ตรงนี้คงต้องหาข้อมูลต่อ เพราะหลายๆคนแนะนำให้ไปใช้ mpv ซึ่ง fork มาจาก mplayer แทน
พอดีถนัดใช้งาน gstreamer เลยตัดสินใจลง gstreamer 0.10 และทดสอบใช้งานดู ปรากฎว่าเล่นได้ครับ
ผมทดลองเล่นไฟล์ h.264 1080p โดยไม่ใช้ความสามารถของ hardware decoder ช่วย ก็ไม่สามารถเล่นได้อย่างราบรื่นนะครับ แถมกิน cpu ไปหมดทั้งสองคอร์ เมื่อเปลี่ยนมาใช้ vdpau ช่วย ก็สามารถเล่นได้สบายๆครับ
เมื่อผ่านขั้นตอนทดสอบความสามารถก็มาถึงขั้นตอนการพัฒนาอะไรขึ้นมาบ้าง โดยมีโจทย์มาให้ทำระบบเล่นคาราโอเกะ ครับโดยมีความสามารถในการตัดเสียงร้องออกได้ (กรณีที่ไฟล์ต้นฉบับ ใส่เสียงร้องไว้ channel หนึ่งนะครับ) ก็เลยลองทำโดยการใช้วิธี ตัดเสียงจาก channel เดิม ออก แล้วใส่ เสียงจากอีก channel เข้าไปแทน จึงกลายเป็น mono 2 channels ( LR -> LL or RR ) ทำให้เสียงยังคงออกลำโพงทั้งสองข้างได้
ก็ทดลองทำให้มันสลับไปมาได้ กว่าจะทำเสร็จก็ร้องเล่นเองไปหลายรอบๆ อิอิ
อันนี้ก็เป็นตัวอย่างหนึ่งในการใช้งานบอร์ดนี้นะครับ ข้อดีอย่างที่บอกไป ลดการใช้พลังงาน ลดต้นทุน ได้หลายๆครับ
QR decoder app on Android
คราวก่อน เขียนโปรแกรม QR decoder บน pc ไปแล้ว วันนี้เป็นการทดสอบเอาโปรแกรมไปรันบนเครื่องแอนดรอยด์ จุดที่น่าสนใจคือ การคอมไพล์ zbar library ด้วย ndk ส่วนหนึ่งผมทำตามแนะนำจากเว็บนี้ http://www.blackdogfoundry.com/blog/zbar-bar-code-qr-code-reader-android/ เพื่อให้ได้ libzbar.so และ ฟังก์ชั่นการ decode ภาพออกมา
ส่วนต่อมาคือการเอาไปใช้ ผมเขียนด้วย QML ดัดแปลงจาก https://www.ics.com/blog/qt-5-multimedia-qml-elements#.VCFtHdazCfg ซึ่งจริงๆก็คล้ายๆกับ ใน document ของ Qt เองครับ จุดที่น่าสนใจอีกจุดคือการทำให้ QML สามารถเรียกฟังก์ชั่น decode ใน C++ ได้
และส่วนสุดท้ายครับ คือการ deploy หรือการนำโปรแกรมขึ้นไปรันบนอุปกรณ์ที่เป็น Android จริงๆ ซึ่งประเด็นอยู่ที่การนำเอา libzbar.so ใส่เข้าไปด้วย ก็ศึกษาได้จาก http://www.kdab.com/qt-android-episode-3/
การเขียนโปรแกรมครั้งเดียวแล้วสามารถรันได้หลายๆแพลตฟอร์มด้วย Qt เป็นอะไรที่เจ๋งจริงๆเลยครับ อิอิ
Machine Vision
วันก่อนได้มีโอกาสทำชุดเดโม machine vision ด้วย Linux, Qt, OpenCV ครับ เลยมีโอกาสได้เปรียบเทียบการใช้งานระหว่างกล้อง usb webcam ธรรมดา กับ กล้องที่ใช้ในงานอุตสาหกรรม
ผมคิดว่าส่วนที่แตกต่างกันมันก็คือเรื่องของ hardware นั่นละครับ เพื่อให้ได้ภาพที่ดีที่สุดเอาไปประมวลผล ซึ่งก็จะทำให้ลดเวลาในการทำ pre-processing ไปได้เยอะ ซึ่งตรงนี้สำคัญมากครับ เพราะแต่ละขั้นตอนหมายถึงเวลาที่ต้องใช้ cpu ประมวลผล ถ้าใช้ขั้นตอนมากก็เสียเวลามาก อาจชดเชยด้วยการใช้คอมสเป็คสูงๆ แต่ก็ไม่แน่ว่าจะช่วยได้เสมอไป ที่สำคัญงานส่วนใหญ่ต้องการความเร็วในการประมวลซะด้วยสิ ดูได้จากเสป็คของกล้องที่มีการรองรับ fps สูงๆ ระดับ 100 fps ขึ้นไป แต่ถามว่าจะทำยังงัยเพื่อให้ประมวลผลแล้วยังได้เฟรมเรทที่ระดับนี้อยู่ ซึ่งกล้องอุตสาหกรรมก็สามารถตอบโจทย์ตรงนี้ได้(ราคาก็สูงกว่ามาก) แต่ถ้าเพื่อการศึกษาหรือทดลอง OpenCV ผมว่าใช้กล้องธรรมดาก็พอได้ครับ
อีกเรื่องคือการ support Linux ของกล้องยี่ห้อต่างๆ มันไม่ใช่แค่ driver ยังต้องรวมถึง sdk ด้วย อย่างที่ผมได้ทดลองทำเดโม เป็นการใช้งานกล้อง Basler ที่มี interface แบบ GigE ก็จะมี pylon sdk มาให้ซึ่งเป็น c++ framework ก็ต้องนั่งศึกษากันไป หรืออย่างของ Imaging Source ก็ค่อนข้างจะสนับสนุนระบบพื้นฐานของ Linux โดยทั่วไปไม่ต้องลง driver ให้ยุ่งยาก เช่น interface USB ก็ใช้ uvc driver กับ v4l2 เนี่ยแหละ แถมยังมี gstreamer plugin ให้ใช้ด้วย ซึ่งส่วนตัวค่อนข้างประทับใจ
อย่างไรก็ดี หากเราได้ภาพมาแล้วเรื่อง api ของกล้องคงไม่ใช่ประเด็นแล้วครับ อย่างกล้องที่ผมได้มีโอกาสใช้งานทำเดโม ก็คือของ Basler ซึ่งใช้ interface แบบ GigE ก็เสียเวลาศึกษาและเขียนโมดูลเพื่อจะเอาภาพออกมาจากกล้องส่งต่อให้ OpenCV เพิ่มขึ้นนิดหน่อย
อีกส่วนหนึ่งก็คือ GUI ครับ เมื่อตะกี้เราพูดถึงการนำภาพจากกล้องผ่าน api ของมันมาส่งให้ OpenCv แน่นอนก็ต้องมีการ copy memory หรือก็อปปี้เฟรมมา ในระหว่างการทำ image processing เรายังอาจต้องมีการ copy ภาพทั้ง frame อีก รวมถึงเมื่อส่งต่อให้ GUI มาวาดทำการแสดงผล อย่างเช่นที่ผมทำไป อย่างน้อยก็มีการ copy จาก api ของกล้องมาเป็น cv::Mat และในขั้นตอนสุดท้ายอยากเอาไปแสดงผล ก็ต้อง copy เป็น QImage สำหรับ Qt อีกที จากที่ลองทำ ซึ่งใช้ thread และ buffer เพื่อแยกระหว่าง การรับภาพเข้ามา และ การประมวลผล ก็ยังดูว่าใช้ cpu มากพอควร
สิ่งที่อยากทำต่อไปคือ ทดลองเอา gpu เข้ามาช่วยทั้งในเรื่องของการแสดงผลและการทำ image processing เช่น OpenGL, cuda หรือ OpenCL ซึ่ง OpenCV ก็ดูจะ support ตรงนี้ด้วย คงต้องไปศึกษาเพิ่มเติมก่อนครับ
ก็ประมาณนี้ จากการที่ได้กลับมาทำ image processing อยู่สามสี่วัน หลังจากไม่ได้ทำมานานหลายปี
Streaming Server : beta version
ตัว beta เสร็จละครับ ลองดูการทำงานของมันจากวิดิโอดูนะครับ แผนงานต่อไป คือ ทำ โปรแกรม signage ฝั่ง client ให้เนียนๆ ใช้งานง่าย
Linux DVR demo program
ความเดิมจากตอนที่ แนะนำ ฮาร์ดแวร์ซึ่งก็คือ DVR card จาก Adlink และ Yuan ไปแล้ว วันนี้จะมาเดโมให้ดูกับโปรแกรมที่เพิ่งเขียนขึ้นมาใหม่ครับ ( เขียนตอนหยุดปีใหม่นี่เอง เสร็จตอนเวลาข้ามเที่ยงคืนวันสิ้นปีมาหน่อยเดียว อิอิ ) โดยโปรแกรมนี้รันบน Kubuntu ด้วยเครื่อง VIA VB8001 จับคู่กับ Yuan ตัวเก่านั่นแล
จริงๆ ตอนแรกจะเขียนเรื่อง การเขียนโปรแกรมด้วย DBUS ที่เคยเกริ่นเอาไว้เมื่อนานมาแล้ว ก็เลยเอาโปรแกรมที่เขียนแล้วใช้ DBUS มาโชว์ให้ดูด้วย จะได้เห็นภาพการใช้งานได้ง่ายขึ้น ก็เลยยกยอดเอาไปตอนหน้าละกัน อิอิ สำหรับการเขียนโปรแกรม
ระบบนี้ประกอบด้วยสองโปรแกรม ตัวแรกรันเป็น backend รับสัญญาณภาพจาก DVR มาทั้ง 4 แชนแนล โปรแกรมตัวที่สอง คือตัวแสดงผลภาพที่ส่งมาจากโปรแกรม backend และรอรับอินพุตจากคีย์บอร์ด ที่สามารถกดคีย์เพื่อเลือกดูทีละแชนแนลก็ได้ หรือ ดูรวม 4 แชนแนลก็ได้ โดยผมใช้ DBUS ตรงนี้แหละ เมื่อมีการกดคีย์บอร์ดในโปรแกรมแสดงผล ก็จะเป็นการเรียกเมธอดแบบข้ามโปรเซสไปที่โปรแกรม backend เพื่อเป็นการเลือกแชนแนลของสัญญาณภาพจะที่ส่งออกมา ผมใช้วิธีนี้เพราะเดี๋ยวจะเอาไปไว้ควบคุมโปรแกรมที่ใช้บันทึกวิดิโอด้วย
ก็ดูผลลัพธ์ของตัวโปรแกรมทั้งสองเอาละกันครับ จริงๆ ผมทดลองเอา module GPS + บอร์ด Arduino ใช้ส่งตำแหน่ง ความเร็ว ออกมาได้แล้ว ( อันนี้ไม่ได้เขียนโปรแกรมเองเลย เอาโค้ดเค้ามาใช้ทั้งหมด แค่ออกแรงบัดกรีนิดหน่อย ) ว่าจะเอามาเขียน overlay ทับลงบนภาพวิดิโอ แต่ขอยกไว้ตอนต่อๆไปละกัน เพราะโมดูล GPS ที่ว่ามันของถูกๆจากบ้านหม้อ พอเข้าบ้านแล้วมั่วเลย (แต่ลองบนรถตอนขากลับมาจากต่างจังหวัด ก็ถูกต้องรวดเร็วดีนะ)
หมายเหตุ : ผมขอแก้หน่อย ชอบบอกว่า DBUS คล้าย DCOM อยู่เรื่อย จริงๆแล้วยังไม่ใช่นะครับ ยังไม่ถึงขนาดนั้น ถ้าให้เจาะจงจริงๆ มันเหมือน COM แบบ out of process มากกว่าครับ
DVR card
ช่วงนี้เรื่องกล้องวงจรปีดกำลังบูม จริงๆมันก็บูมมานานแล้วเหมือนกัน แต่เพราะมีข่าวว่าจับโจรได้เพราะกล้องอยู่เนืองๆจึงทำให้ยังขายกันได้อยู่ แม้ว่าจะมีผู้ขายเพิ่มขึ้นมามากมายหลายเจ้า
ส่วนตัวผมนั้นเล่นเรื่องนี้มาสามสี่ปีแล้วเพราะมีคนมาจ้างทำระบบน่ะครับ แต่จะเน้นเรื่อง image processing มากกว่าการติดตั้งใช้งานปรกติทั่วไป ดังนั้นการซื้อมาเป็นตัวเครื่องเลยจึงไม่ใช่ตัวเลือกของผม อีกตัวเลือกหนึ่ง นั่นคือ การใช้เป็น pci card มาเสียบเข้ากับ pc เพื่อใช้ pc เป็น DVR (Digital Video Recorder) จึงดูเหมาะสมกว่า
วันนี้จึงมาแนะนำกันว่า ไอ้เจ้าการ์ดใบนี้ ซึ่งในตลาดนั่นหาซื้อได้ในราคาตั้งแต่หลักพันต้นๆไปจนถึงหลักหมื่นนั้น อะไรที่ทำให้ราคามันเป็นอย่างนั้นไปได้
ตามรูปเลยครับ ท่านลองส่องการ์ดของท่านดูว่ามีอะไรบ้าง ส่วนใหญ่วางเลย์เอาท์มาคล้ายๆกันละครับ ก็เริ่มด้วยตัวที่ทำหน้าที่เป็น video decoder ไอ้เจ้าชิพตัวนี้ก็จะทำหน้าที่รับสัญญาณ analog จากกล้อง cctv หรือ tv หรือจากเครื่องเล่นวิดิโอก็ได้ครับ แปลงเป็นสัญญาณ digital จะ sampling กันกี่บิตก็แล้วแต่รุ่นและยี่ห้อ โดยทั่วไปเมื่อชิพตัวนี้นำมาใช้กับ dvr ก็จะรับได้ 1 channel ขนาด D1 ตัวอย่างชิพที่เห็นได้ตามท้องตลาดทั่วไปก็เช่น ของ Conexant BT878 หรือ NXP SAA7130 ถ้าเป็นชิพพวกนี้ก็ดูได้เลยว่าถ้าต้องการ full frame rate แบบ realtime จากกล้องกี่ตัว ก็ต้องมีชิพนี้จำนวนเท่านั้นแหละ (แต่ก็อาจมียกเว้นที่รวมมาเป็นชิพตัวเดียวใหญ่ๆสำหรับหลายๆ channel เลยก็เคยเห็นเหมือนกัน) เมื่อเป็นเช่นนั้นก็ต้องมีชิพตัวต่อไปขึ้นมาทำหน้าที่ให้การ์ด pci หนึ่งใบเห็นเป็นเหมือนมี pci เท่าจำนวนกล้อง เจ้าตัวนี้เรียกว่า pci bridge นั่นเอง เจ้าตัวนี้ที่ใช้กันก็คงจะเป็น PLX หรือ P ตัวเดียวของ Pericom
ส่วนที่เป็น option เพิ่มเข้าทำให้ราคามันต่างกันออกไปนั้นน่าจะอยู่ที่ ชิพประมวลผลพิเศษ FPGA ที่แต่ละเจ้าใส่โปรแกรมเข้าไปเพื่อให้การ์ดมีความสามารถมากขึ้นเช่น บีบอัดและเข้ารหัสเป็น H.264 โดยที่ไม่ต้องไปพึ่งพา cpu ของ pc นั่นเอง ตัวนี้ที่เคยเห็นก็ของเจ้าใหญ่ XILINX นั่นเอง
ก็คงพอเห็นภาพและเป็นประโยชน์ในการเลือกซื้อและใช้งานนะครับ หวังว่าคงช่วยให้ท่านเสียเงินไปอย่างคุ้มค่ามากขึ้น