Giới thiệu
Mùa hè vừa qua, tôi đã có một chuyến đi xe đạp qua nước Đức cùng một người bạn, bắt đầu từ biên giới Hà Lan và kết thúc ở Ba Lan. Đây là một chuyến đi tuyệt vời với những cảnh đẹp lịch sử ở các thành phố Hanse (đặc biệt là Wismar), cảnh biển đẹp (Rügen), và những khu vực mà tôi không mấy vui vẻ khi nhắc đến. Trong khi đạp xe, tôi đã nảy ra một ý tưởng: liệu có cách nào để nhanh chóng kiểm tra kết quả bầu cử của đảng AfD không? Với việc sử dụng điện thoại để tra cứu rất mất thời gian và có thể nguy hiểm nếu không dừng lại. May mắn là chúng tôi có GPS xe đạp, và ý tưởng về một ứng dụng ra đời: một ứng dụng cho biết vị trí của bạn và số lượng phiếu bầu của đảng AfD.
Khởi đầu với Monkey C
Khi bắt đầu suy nghĩ về cách hoạt động của ứng dụng, tôi không biết rằng ứng dụng Garmin sử dụng ngôn ngữ có tên là Monkey C. Monkey C là một ngôn ngữ lập trình khá mới, không có nhiều thông tin trực tuyến và được Garmin phát triển dựa trên Java, C++ và JavaScript. Mặc dù có những lý do hợp lý cho việc sử dụng Monkey C (chẳng hạn như quản lý RAM hạn chế và tiết kiệm pin), nhưng tôi vẫn cảm thấy việc này làm cho việc phát triển ứng dụng trở nên khó khăn hơn.
Sử dụng Monkey C và lập trình vibe
Sau chuyến đi, tôi đã tải SDK Monkey C và nhận ra rằng việc lập trình với một ngôn ngữ ít tài liệu sẽ rất khó khăn. Mặc dù tài liệu không hoàn hảo, nhưng tôi đã có thể làm quen với nó bằng cách kết hợp giữa lập trình vibe và tham khảo tài liệu. Monkey C thiếu nhiều tính năng cơ bản mà bạn thường mong đợi ở một ngôn ngữ lập trình, chẳng hạn như không có hàm xử lý CSV hay JSON. Điều này làm cho việc tìm kiếm ví dụ mã hoặc bài viết về Monkey C trở nên khó khăn hơn.
Tổng quan về Monkey C và bắt đầu
Để bắt đầu với Monkey C, bạn cần tải SDK và cài đặt nó trên Visual Studio. Quá trình này khá đơn giản. Khi bạn bắt đầu một dự án Monkey C, hệ thống sẽ yêu cầu bạn chọn một số tùy chọn mà sau đó sẽ được dịch thành tệp manifest XML. Dưới đây là một số tùy chọn mà tôi đã chọn:
- Loại ứng dụng: Widget
- API tối thiểu hỗ trợ: 3.2.0
- Sản phẩm hỗ trợ: Thiết bị Edge (dòng máy tính xe đạp)
- Quyền: Bạn có thể chỉnh sửa sau, nhưng cần chọn
Positioningđể có thể truy cập vị trí GPS.
Tệp được tạo ra sẽ có đuôi .mc và được chia thành 5 phần chính:
| Tên | Mục đích |
|---|---|
function initialize() |
Khởi tạo ứng dụng. Tôi chỉ cần bật chế độ hiển thị |
function onLayout() |
Có thể cho phép bạn tải các bố cục tùy chỉnh |
function onShow() |
Chạy mã khi bạn mở ứng dụng |
function onUpdate() |
Cập nhật màn hình |
function onHide() |
Chạy khi đóng ứng dụng |
Sau một thời gian thử nghiệm, tôi đã làm thành công ứng dụng Hello World đầu tiên của mình bằng cách sử dụng dc.drawText trong hàm onUpdate.
Muốn xây dựng một ứng dụng?
Với mọi thứ đã sẵn sàng, tôi bắt đầu phát triển ứng dụng với các bước như sau:
- Lấy vị trí GPS và thử nghiệm với tệp GPX.
- Lấy bản đồ đa giác của Đức với mỗi khu vực hành chính.
- Lấy kết quả bầu cử theo từng khu vực và đối chiếu với danh sách khu vực.
- Đặt một bộ đếm thời gian để kiểm tra vị trí và hiển thị kết quả trên màn hình.
Có vẻ dễ dàng đúng không? Nhưng tôi đã đánh giá quá cao khả năng bộ nhớ của thiết bị và việc kiểm tra đa giác khó hơn tôi nghĩ. Thực tế là không có nhiều tài liệu cho Monkey C khiến cho việc phát triển trở nên khó khăn hơn.
Lấy vị trí GPS
Tôi đã chỉnh sửa quyền truy cập để cho phép ứng dụng truy cập GPS. Sau đó, tôi bắt đầu theo dõi vị trí GPS trong phần initialize():
monkeyc
Position.enableLocationEvents(Position.LOCATION_CONTINUOUS, method(:onPosition));
Hàm onPosition của tôi sẽ trông như sau:
monkeyc
function onPosition(info as Position.Info) as Void{
if (info.position != null) {
myLocation = info.position.toDegrees();
} else {
System.println("Vị trí GPS không hợp lệ");
}
}
Lấy bản đồ đa giác của Đức
Ban đầu, tôi định sử dụng bản đồ đa giác để kiểm tra xem tọa độ của mình có nằm trong đa giác không. Tuy nhiên, tệp bản đồ quá lớn (hơn 14.000KB sau khi giải nén). Tôi quyết định thay đổi hướng tiếp cận bằng cách lấy tọa độ của tất cả các khu vực hành chính và tìm khu vực gần nhất. Sử dụng phương pháp đơn giản để tính khoảng cách giữa hai tọa độ:
monkeyc
function distanceToCurrent(lat1, lon1, lat2, lon2) {
var dLat = lat1 - lat2;
var dLon = lon1 - lon2;
var distance = Math.sqrt(dLat*dLat + dLon*dLon);
return distance;
}
Lấy kết quả bầu cử
Tôi đã tìm thấy dữ liệu bầu cử Đức, nhưng nó không được phân chia theo từng khu vực hành chính mà theo từng quận bầu cử. Tôi đã sử dụng Python để xử lý dữ liệu này, nó giúp việc làm sạch dữ liệu dễ dàng hơn. Sau khi làm sạch, tôi đã có dữ liệu với định dạng: [tên thành phố, vĩ độ, kinh độ, dân số, tỷ lệ bầu cử của AfD].
Thiết lập bộ đếm thời gian
Bộ đếm thời gian sẽ khởi động khi ứng dụng hiển thị và kiểm tra khu vực gần nhất mỗi 5 giây. Khi ứng dụng bị ẩn, tôi sẽ dừng bộ đếm và giải phóng bộ nhớ.
monkeyc
function onShow() as Void {
myTimer = new Timer.Timer();
myTimer.start(method(:onTick), 5000, true);
}
Kết luận
Ứng dụng hiện đang hoạt động tốt và tôi đã nhận được phản hồi tích cực từ bạn bè. Tôi đã hoàn thiện ứng dụng và gửi lên Garmin để phê duyệt. Qua dự án này, tôi đã học được nhiều điều về Monkey C và cách phát triển ứng dụng trên các thiết bị Garmin. Nếu bạn có ý tưởng cho một ứng dụng tương tự hoặc cần hỗ trợ, hãy tham gia vào cộng đồng phát triển và chia sẻ kinh nghiệm của bạn!
Câu hỏi thường gặp (FAQ)
1. Monkey C là gì?
Monkey C là ngôn ngữ lập trình độc quyền của Garmin cho phát triển ứng dụng trên các thiết bị của họ.
2. Có dễ dàng để bắt đầu với Monkey C không?
Có, nhưng bạn sẽ cần thời gian để làm quen với các tài liệu hạn chế.
3. Làm thế nào để tối ưu hóa ứng dụng Garmin của tôi?
Nên chú ý đến việc quản lý bộ nhớ và tối giản mã nguồn để ứng dụng hoạt động hiệu quả hơn.