안녕하세요..
아래 중간보고 편의 하이레조(Hi-Res) 버전, 추억의 소55 감성을 이어가는 (부족한) 강좌, Part 3으로 정리해 봅니다^^
https://www.clien.net/service/board/lecture/19164187
지난 편의 하이라이트는 클리에의 전매특허인 조그다이얼을 이용한 스크롤 업다운을 구현한 것이었죠^^
오늘의 핵심은 하이레조 입니다^^ 160x160 답답한 사이즈에서 벗어난 320 x 480 하이레졸루션 모드 진입 ㅋ~
거기에 한 발 더 나아가 다크테마 적용까지.. 이제 클리에로 제품다운 앱을 개발할 수 있는 단계에 진입했네요..
그게… 제품은 저만 쓰겠지만 ㅠㅠ
이번에도 자세한 설명은 지루해 지니까 코드는 첨부하고 결과 위주로 보여드릴께요^^
1. 그래픽 위젯
배터리와 메모리 상태는 간단한 바타입 위젯으로 시각화 해 봤네요.. 참고로 저때의 전압은 소숫점 오류 ㅡ.ㅡ;;
온도는 가라 데이터입니다.. ㅎㅎ

TH55의 놀라운 배터리 성능을 계속 강조해 왔으니, 저 위젯 중에서 배터리 쪽만 좀 자세히 말씀 드리자면,
배터리의 상태값은 팜에서 관리하는 기준으로 시스템함수를 이용해 뽑아 오는데… 아래와 같은 구조로 재구성 해 전역변수로 두었습니다.
// Battery status structure
typedef struct BatteryInfoTag {
UInt16 percent;
UInt16 milliVolts;
Boolean pluggedIn;
UInt16 warnThreshold;
UInt16 criticalThreshold;
Int16 maxTicks;
SysBatteryKind kind;
UInt16 rawInfo;
} BatteryInfoType;
전압(mV), 잔량(%), 외부전원 등이 보이고 특이하게 배터리 타잎이 있는데… 타잎에는 아래와 같은 구분이 있습니다.
static const Char* BatteryKindStr(SysBatteryKind kind)
{
switch (kind) {
case sysBatteryKindAlkaline: return "ALK";
case sysBatteryKindNiCad: return "NiCd";
case sysBatteryKindNiMH: return "NiMH";
case sysBatteryKindLiIon: return "LiIon";
// case sysBatteryKindLiPoly: return "LiPoly";
// case sysBatteryKindUnknown: return "UNK";
default: return "Unknown";
}
}
리튬폴리머부터 컴파일에러가 나는걸 보니 제 라이브러리는 리튬이온까지네요.. 물론, 저것이 동적으로 보내지는 값은 아니고, PDA 펌웨어에 고정된 값입니다. TH55는 리튬이온에 해당하는 값이 박혀 있습니다.
배터리의 동적 변화값으로는 전압과 잔량, 외부전원 정도입니다. 배터리의 상태는 전압과 잔량으로 판별 가능한데, 아래와 같은 기준으로 본다고 합니다. 리튬이온 기준 대략:
전압 상태
4.20V 풀충
4.00V ~80%
3.80V ~50%
3.60V 위험
👉 percent랑 같이 보면 재미있다고 지피티가 수다를 떱니다..
예:
• 74%인데 3.9V면 → 노화
• 74%인데 4.05V면 → 정상
그래서, 코드로 만들어 둡니다.
전압과 잔량 기준으로 두가지 버전..
// Battery Monitor
static const Char* GetBatteryStatus(const BatteryInfoType *batt)
{
if (!batt) return " -- ";
if (batt->pluggedIn) {
if (batt->percent >= 95) return "FULL CHG";
return "CHG ";
}
if (batt->percent >= 95) return "FULL ";
if (batt->percent >= 70) return "GOOD ";
if (batt->percent >= 30) return "MID ";
return "CRITICAL";
}
static const Char* BatteryStateFromVoltage(UInt16 mV)
{
if (mV >= 420) return "FULL";
if (mV >= 400) return "GOOD";
if (mV >= 380) return "MID";
if (mV >= 360) return "LOW";
return "DANGER";
}
프로그램에서의 실제 표시는 잔량 기준으로 하고 있습니다. (이건 배터리 위젯을 터치하면 전압과 잔량 기준이 토글되게 수정^^)
그리고, 이같은 백그라운드로 맥클에서 호출하는 상태(STAT) 명령에 다음과 같이 응답하게 배터리 상태정보 한줄요약을 추가합니다^^

2. 텔레메트리
요청에 따라 텔레메트리 데이터를 주기적으로(0.5초) 뿌리게도 해 봤습니다.
--> 맥클 동작 시연화면
혹시 재생이 안된다면 아래 첨부파일 링크에 넣어둔 동영상을 보시면 됩니다.
3. 실크영역 확장
먼저, 160x160 화면에 이전까지 쓰던 텍스트 기반 폼이 아닌 그래픽 윈도우폼을 열고 대략적인 레이아웃을 잡은 다음, 허연 화면 밋밋해 다크테마를 입혀 봅니다 ㅋ~ 방법은 의외로 간단해 백그라운드 컬러와 포어그라운드 컬러를 뒤바꾸면 되요. 그런 후, 하이레조로 가기 전에 저 그래피티 영역(실크라고 하죠^^)부터 확장했습니다. 확장은 성공했는데 아직 제어권 밖입니다..

맨 아래 상태바를 남기거나, 그것까지 제거해 320x480 풀 해상도를 쓸 수도 있는데, 상태바가 있어야 홈버튼으로 런처에 복귀할 수가 있으니 이건 남기기로 합니다. (물로 소55는 백버튼이 있어 큰 문제 없지만요^^)
실크영역을 제거한 다음 위젯에 색깔도 입혀봤는데, 아직코드에 오류가 있어(배터리 퍼센트값이 들어오고 있어서..) 메모리 색상이 빨간색 워닝 레벨입니다. 뭐.. 의도치 않게 레벨 별 컬러 적용이 테스트 됬네요 ㅋ~
4. 하이레조
대망의 하이레조입니다. ㅋ~
먼제 실크를 확장한 화면에서 160x160 기준으로 대략의 레이아웃을 잡아주고... 그리고, 짜잔~

확장이 됩니다^^ 예상대로 위젯은 크기가 1/4로 줄어 1사분면에 표시되네요~
큰위젯은 텍스트 폼에 찍히던 게 오버랩 된거라 의도치 않은 것인데, 크기비교가 자연스럽게 되고 있습니다. 때론 버그도 유용한 역할이 있습니다 ㅋ~
열심 수정중~

근데 폰트는 이상하게 크기가 그대롭니다 ㅎㅎ 그래픽 좌표가 조밀해져도 가독성은 유지해 주는 배려 ㅎㅎ
이건 소니 하이레조폰트로 해결^^ 나머지 레이아웃은 좌표설정 바꿔서 샤샤샥~

160 해상도와 320 해상도로 재배치 한 버전의 비교입니다. 로그창에 찍는 로그만 소니가 제공하는 고해상도용 스몰폰트를 써서 정보량을 늘여놨습니다. 기본폰트로는 9줄, HR폰트로는 15줄이 찍히네요.. 이 과정에서 소니 SDK 헤더들이 제 PRC TOOLS 컴파일러와 호환성 문제를 일으키는데... 지피티가 이걸 제 컴파일러 환경에 맞춰 헤더 대신 코드 초반에 직접 선언으로 넣게 도와줬습니다. 혼자 했으면 엄청 짜증났을 작업을 번개불에 콩구워먹듯 ㅎㅎ
5. 마무리
저기 맥에서 받아본 클리에의 시간 데이터는 제가 프로젝트 시작하면서 처음 풀충전한 날, 클리에 달력으로 04년 1월 1일로부터 경과된 날짜입니다. 한달 반 정도 되었군요 ㅎㅎ

그동안 지피티 도움으로 개발환경 구축부터 기능 살려내기 까지, 나름 개발자 시절 향수를 안고 재미있게 진행 했네요..
일단, 요기서 잠시 휴식기간을 갖고, 다음 편으로는 유니버셜 리모콘이나 OBD2 콘솔에 도전해 볼까 합니다.
중간중간 새로운 진척이 있으면 가끔 찾아 뵐께요^^
한줄요약 : 하이레졸루션과 작은폰트 사용에 성공하다~

관심 있으실 분들을 위해, 언제나 처럼 관련 소스코드는 맨아래 링크로 첨부했습니다.
뭔가 되고 있는것 같은데 어떤 앱이 나올지 쭉 기대해보겠습니다.
보면 지피티도 개발환경 잡거나 시스템 건드리는 라이브러리 호출은 시행착오가 많아 인내가 필요한데, 코딩은 순삭입니다..