@jjlmoya/utils-hardware 1.26.0 → 1.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +3 -1
  3. package/src/entries.ts +7 -1
  4. package/src/index.ts +2 -0
  5. package/src/tests/locale_completeness.test.ts +1 -1
  6. package/src/tests/tool_validation.test.ts +1 -1
  7. package/src/tool/mobileSensorTest/bibliography.astro +14 -0
  8. package/src/tool/mobileSensorTest/bibliography.ts +24 -0
  9. package/src/tool/mobileSensorTest/component.astro +241 -0
  10. package/src/tool/mobileSensorTest/entry.ts +29 -0
  11. package/src/tool/mobileSensorTest/i18n/de.ts +186 -0
  12. package/src/tool/mobileSensorTest/i18n/en.ts +186 -0
  13. package/src/tool/mobileSensorTest/i18n/es.ts +186 -0
  14. package/src/tool/mobileSensorTest/i18n/fr.ts +186 -0
  15. package/src/tool/mobileSensorTest/i18n/id.ts +186 -0
  16. package/src/tool/mobileSensorTest/i18n/it.ts +186 -0
  17. package/src/tool/mobileSensorTest/i18n/ja.ts +186 -0
  18. package/src/tool/mobileSensorTest/i18n/ko.ts +186 -0
  19. package/src/tool/mobileSensorTest/i18n/nl.ts +186 -0
  20. package/src/tool/mobileSensorTest/i18n/pl.ts +186 -0
  21. package/src/tool/mobileSensorTest/i18n/pt.ts +186 -0
  22. package/src/tool/mobileSensorTest/i18n/ru.ts +186 -0
  23. package/src/tool/mobileSensorTest/i18n/sv.ts +186 -0
  24. package/src/tool/mobileSensorTest/i18n/tr.ts +186 -0
  25. package/src/tool/mobileSensorTest/i18n/zh.ts +186 -0
  26. package/src/tool/mobileSensorTest/index.ts +11 -0
  27. package/src/tool/mobileSensorTest/logic.ts +39 -0
  28. package/src/tool/mobileSensorTest/mobile-sensor-test.css +460 -0
  29. package/src/tool/mobileSensorTest/seo.astro +15 -0
  30. package/src/tool/mobileSensorTest/ui.ts +31 -0
  31. package/src/tool/usbPowerBudgetCalculator/bibliography.astro +14 -0
  32. package/src/tool/usbPowerBudgetCalculator/bibliography.ts +16 -0
  33. package/src/tool/usbPowerBudgetCalculator/component.astro +266 -0
  34. package/src/tool/usbPowerBudgetCalculator/entry.ts +29 -0
  35. package/src/tool/usbPowerBudgetCalculator/i18n/de.ts +169 -0
  36. package/src/tool/usbPowerBudgetCalculator/i18n/en.ts +169 -0
  37. package/src/tool/usbPowerBudgetCalculator/i18n/es.ts +169 -0
  38. package/src/tool/usbPowerBudgetCalculator/i18n/fr.ts +169 -0
  39. package/src/tool/usbPowerBudgetCalculator/i18n/id.ts +169 -0
  40. package/src/tool/usbPowerBudgetCalculator/i18n/it.ts +169 -0
  41. package/src/tool/usbPowerBudgetCalculator/i18n/ja.ts +169 -0
  42. package/src/tool/usbPowerBudgetCalculator/i18n/ko.ts +169 -0
  43. package/src/tool/usbPowerBudgetCalculator/i18n/nl.ts +169 -0
  44. package/src/tool/usbPowerBudgetCalculator/i18n/pl.ts +169 -0
  45. package/src/tool/usbPowerBudgetCalculator/i18n/pt.ts +169 -0
  46. package/src/tool/usbPowerBudgetCalculator/i18n/ru.ts +169 -0
  47. package/src/tool/usbPowerBudgetCalculator/i18n/sv.ts +169 -0
  48. package/src/tool/usbPowerBudgetCalculator/i18n/tr.ts +169 -0
  49. package/src/tool/usbPowerBudgetCalculator/i18n/zh.ts +169 -0
  50. package/src/tool/usbPowerBudgetCalculator/index.ts +11 -0
  51. package/src/tool/usbPowerBudgetCalculator/logic.ts +81 -0
  52. package/src/tool/usbPowerBudgetCalculator/seo.astro +15 -0
  53. package/src/tool/usbPowerBudgetCalculator/ui.ts +32 -0
  54. package/src/tool/usbPowerBudgetCalculator/usb-power-budget-calculator.css +484 -0
  55. package/src/tools.ts +3 -1
@@ -0,0 +1,186 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { MobileSensorTestUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'mobil-sensor-testi';
7
+ const title = 'Mobil Sensör Testi';
8
+ const description = 'Telefonunuzda jiroskop, ivmeölçer, hareket sensörü ve su terazisi testini çevrimiçi olarak çalıştırarak eğim, dönüş, sapma ve sensör kalibrasyon sorunlarını kontrol edin.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'Telefon jiroskopumu çevrimiçi olarak nasıl test edebilirim?',
13
+ answer: 'Testi telefonda açın, Kalibrasyonu Başlat\'a dokunun, istenirse hareket erişimine izin verin, ardından cihazı döndürün ve eğin. Çalışan bir jiroskop ve yön sensörü, alpha, beta ve gamma değerlerini donma veya ani sıçramalar olmadan düzgün bir şekilde güncellemelidir.',
14
+ },
15
+ {
16
+ question: 'İvmeölçeri bir su terazisi ile test edebilir miyim?',
17
+ answer: 'Evet. Testi başlattıktan sonra telefonu düz bir masaya koyun. Baloncuğun merkeze yakın bir yerde sabitlenmesi ve ivme değerlerinin sabit kalması gerekir. Telefon hareketsizken baloncuk ciddi şekilde kayıyorsa, ivmeölçerin kalibrasyona ihtiyacı olabilir veya kılıf, masa ya da cihaz donanımı müdahale ediyor olabilir.',
18
+ },
19
+ {
20
+ question: 'iPhone neden hareket izni istiyor?',
21
+ answer: 'iPhone ve iPad\'de Safari, web sitelerinin hareket ve yön sensörlerine erişmeden önce bir dokunuş gerektirir. İzin reddedilirse, siz hareket erişimine izin verene kadar test jiroskop veya ivmeölçer verilerini okuyamaz.',
22
+ },
23
+ {
24
+ question: 'Bu, bozuk bir pusulayı onarabilir veya kalibre edebilir mi?',
25
+ answer: 'Hiçbir tarayıcı aracı donanımı onaramaz veya sistem pusula kalibrasyonunu zorlayamaz. Bu test belirtileri tanımlamanıza yardımcı olur: donmuş okumalar, gürültülü hareket, sapma, eksik izin veya sensörleri sunmayan bir tarayıcı.',
26
+ },
27
+ ];
28
+
29
+ const howToData = [
30
+ { name: 'Testi telefonunuzda açın', text: 'Teşhis etmek istediğiniz iPhone, iPad, Android telefon veya tabletin aynısını kullanın. Masaüstü tarayıcıların genellikle sunacak hareket sensörleri yoktur.' },
31
+ { name: 'Hareket erişimine izin verin', text: 'Kalibrasyonu Başlat\'a dokunun ve tarayıcınız gösteriyorsa hareket veya yön izin istemini kabul edin.' },
32
+ { name: 'Eğim ve dönüşü test edin', text: 'Telefonu öne eğin, sola ve sağa yatırın, ardından masanın üzerinde düz bir şekilde döndürün. Alpha, beta, gamma ve ivmedeki yumuşak değişiklikleri izleyin.' },
33
+ { name: 'Düz bir yüzeyde sapmayı kontrol edin', text: 'Telefonu birkaç saniye hareketsiz bırakın. Sağlıklı bir sensör, sürekli gezinmek, ani sıçramalar yapmak veya donmak yerine sabitlenmelidir.' },
34
+ ];
35
+
36
+ const faqSchema: WithContext<FAQPage> = {
37
+ '@context': 'https://schema.org',
38
+ '@type': 'FAQPage',
39
+ mainEntity: faqData.map((item) => ({
40
+ '@type': 'Question',
41
+ name: item.question,
42
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
43
+ })),
44
+ };
45
+
46
+ const howToSchema: WithContext<HowTo> = {
47
+ '@context': 'https://schema.org',
48
+ '@type': 'HowTo',
49
+ name: title,
50
+ description,
51
+ step: howToData.map((step, i) => ({
52
+ '@type': 'HowToStep',
53
+ position: i + 1,
54
+ name: step.name,
55
+ text: step.text,
56
+ })),
57
+ };
58
+
59
+ const appSchema: WithContext<SoftwareApplication> = {
60
+ '@context': 'https://schema.org',
61
+ '@type': 'SoftwareApplication',
62
+ name: title,
63
+ description,
64
+ applicationCategory: 'UtilityApplication',
65
+ operatingSystem: 'All',
66
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
67
+ inLanguage: 'tr',
68
+ };
69
+
70
+ export const content: ToolLocaleContent<MobileSensorTestUI> = {
71
+ slug,
72
+ title,
73
+ description,
74
+ faq: faqData,
75
+ howTo: howToData,
76
+ schemas: [faqSchema, howToSchema, appSchema],
77
+ bibliography,
78
+ seo: [
79
+ { type: 'title', text: 'Telefonlar için çevrimiçi jiroskop ve ivmeölçer testi', level: 2 },
80
+ {
81
+ type: 'paragraph',
82
+ html: 'Bu mobil sensör testini, ekran döndürme yanlış geldiğinde, oyunlar veya AR uygulamaları kaydığında, bir su terazisi uygulaması hatalı göründüğünde, navigasyon yanlış yönü gösterdiğinde veya telefon eğime doğru tepki vermediğinde kullanın. Test, jiroskop, ivmeölçer, dönüş ve su terazisi davranışını canlı olarak gösterir, böylece tarayıcı izin sorununu gerçek bir sensör veya kalibrasyon sorunundan ayırt edebilirsiniz.',
83
+ },
84
+ {
85
+ type: 'stats',
86
+ items: [
87
+ { label: 'Ana arama amacı', value: 'jiroskopu çevrimiçi test et' },
88
+ { label: 'Ayrıca kontrol eder', value: 'ivmeölçer sapması' },
89
+ { label: 'En iyi cihaz', value: 'telefon veya tablet' },
90
+ ],
91
+ },
92
+ { type: 'title', text: 'Her sensör okuması size ne söyler', level: 3 },
93
+ {
94
+ type: 'table',
95
+ headers: ['Okuma', 'Kullanım alanı', 'Uyarı işaretleri'],
96
+ rows: [
97
+ ['Alpha', 'Dikey eksen etrafındaki dönüşü kontrol etme, pusula benzeri hareket ve yön değişiklikleri için kullanışlıdır.', 'Telefon düz döndürüldüğünde değişmez, büyük miktarlarda sıçrar veya sıfırda donar.'],
98
+ ['Beta', 'Ekran döndürme, oyunlar, kamera seviyeleme ve AR kontrolleri için ön-arka eğimi kontrol etme.', 'Yanlış yönde hareket eder, bir değerde takılı kalır veya telefon hareketsizken kaymaya devam eder.'],
99
+ ['Gamma', 'Yatay döndürme, yarış oyunları, su terazisi uygulamaları ve sabitleyiciler için sol-sağ yatışı kontrol etme.', 'Bir taraf farklı tepki verir, değerler gürültülüdür veya baloncuk düz bir masada asla merkeze dönmez.'],
100
+ ['İvme X/Y/Z', 'İvmeölçer tepkisini, sarsıntı algılamayı, yerçekimi yönünü ve hareket kararlılığını kontrol etme.', 'Hareketsizken büyük sıçramalar, harekete tepki yok veya kılıf çıkarıldıktan sonra dengesiz okumalar.'],
101
+ ],
102
+ },
103
+ {
104
+ type: 'diagnostic',
105
+ variant: 'warning',
106
+ title: 'Bu testin teşhis etmeye yardımcı olduğu belirtiler',
107
+ html: '<p>Canlı değerleri kullanarak çalışmayan otomatik döndürme, gecikmeli hissedilen jiroskop, ivmeölçer sapması, pusula kalibrasyon uyarıları, kayan AR takibi, kamera seviye hataları, bir tarafa çeken hareket kontrolleri veya yalnızca yerel uygulamalarda hareket bildiren ancak tarayıcıda bildirmeyen bir telefonu araştırın.</p>',
108
+ },
109
+ { type: 'title', text: 'Jiroskop vs ivmeölçer vs pusula', level: 3 },
110
+ {
111
+ type: 'comparative',
112
+ items: [
113
+ { title: 'Jiroskop', description: 'Dönüş hızını ölçer. AR, oyunlar, kamera sabitleme, hareket kontrolleri ve yumuşak yön değişiklikleri için önemlidir.' },
114
+ { title: 'İvmeölçer', description: 'İvmeyi ve yerçekimi yönünü ölçer. Eğim, sarsıntı algılama, adım algılama ve dijital su terazisi davranışını sağlar.' },
115
+ { title: 'Pusula / manyetometre', description: 'Yönü tahmin etmeye yardımcı olur, ancak mıknatıslar, metal nesneler, araç tutucuları, kılıflar, hoparlörler, dizüstü bilgisayarlar ve yakındaki elektronik cihazlar tarafından bozulabilir.' },
116
+ ],
117
+ },
118
+ { type: 'title', text: 'Sensör kalibrasyonu nasıl düzgün şekilde test edilir', level: 3 },
119
+ {
120
+ type: 'list',
121
+ items: [
122
+ 'Test etmeden önce manyetik kılıfları, MagSafe cüzdanlarını, metal tutucuları, kontrolcü klipslerini ve aksesuarları çıkarın.',
123
+ 'Telefonu sağlam, düz bir masaya koyun ve sapmayı değerlendirmeden önce birkaç saniye bekleyin.',
124
+ 'Telefonu hemen sallamak yerine her eksende yavaşça döndürün.',
125
+ 'Tarayıcı veri göstermiyorsa Safari veya Chrome\'u yerel bir sensör veya pusula uygulamasıyla karşılaştırın.',
126
+ 'Okumalar birden fazla uygulamada donmuşsa cihazı yeniden başlatın ve testi tekrarlayın.',
127
+ ],
128
+ },
129
+ {
130
+ type: 'tip',
131
+ title: 'iPhone ve Android izin notu',
132
+ html: 'iPhone ve iPad\'de Safari, bir dokunuştan sonra hareket ve yön izni isteyebilir. Android\'de Chrome genellikle hareket sensörlerini daha doğrudan sunar, ancak gizlilik ayarları, tarayıcı bayrakları, pil tasarruf modları ve gömülü web görünümleri yine de sensör verilerini engelleyebilir veya azaltabilir.',
133
+ },
134
+ {
135
+ type: 'table',
136
+ headers: ['Sorun', 'Olası neden', 'Sonraki adım'],
137
+ rows: [
138
+ ['Hiçbir değer değişmiyor', 'İzin reddedildi, desteklenmeyen tarayıcı, masaüstü cihaz veya kısıtlı web görünümü.', 'Telefonun kendisinde açın, Safari veya Chrome kullanın, hareket erişimine izin verin ve sayfayı yeniden yükleyin.'],
139
+ ['Baloncuk masada kayıyor', 'Kalibrasyon sorunu, düz olmayan yüzey, kılıf müdahalesi veya ivmeölçer gürültüsü.', 'Kılıfı çıkarın, bilinen düz bir yüzey kullanın, yeniden başlatın ve yerel bir su terazisi uygulamasıyla karşılaştırın.'],
140
+ ['Pusula yönü yanlış', 'Manyetik müdahale veya sistem pusula kalibrasyonu.', 'Metal/elektronikten uzaklaşın ve işletim sisteminin pusula kalibrasyon akışını kullanın.'],
141
+ ['Değerler sıçrıyor veya ani yükseliyor', 'Sensör gürültüsü, hasarlı donanım, agresif tarayıcı kısıtlaması veya ani fiziksel hareket.', 'Hareketsizken test edin, ağır uygulamaları kapatın ve başka bir tarayıcı veya yerel uygulama ile karşılaştırın.'],
142
+ ],
143
+ },
144
+ {
145
+ type: 'summary',
146
+ title: 'Bu test ne işe yarar',
147
+ items: [
148
+ 'Uygulama yüklemeden bir telefon jiroskopunu çevrimiçi test etme.',
149
+ 'Canlı bir su terazisi ile ivmeölçer sapmasını kontrol etme.',
150
+ 'Hareket kontrollerinin donanım, kalibrasyon, izin veya tarayıcı desteği nedeniyle başarısız olup olmadığını bulma.',
151
+ 'Telefonu AR, oyunlar, kamera seviyeleme, navigasyon veya ekran döndürme sorun giderme için hazırlama.',
152
+ ],
153
+ },
154
+ ],
155
+ ui: {
156
+ startButton: 'Kalibrasyonu Başlat',
157
+ permissionHint: 'Hareket sensörlerinin kilidini açmak için bir kez dokunun',
158
+ privacyBadge: 'Yerel sensör verisi',
159
+ privacyCopy: 'Yön ve hareket okumaları bu tarayıcı oturumu içinde kalır.',
160
+ orientationPanel: 'Yön',
161
+ motionPanel: 'Hareket',
162
+ bubblePanel: 'Dijital su terazisi',
163
+ statusReady: 'Sensör izni için hazır',
164
+ statusWaiting: 'Tarayıcı izni bekleniyor',
165
+ statusDenied: 'Sensör erişimi reddedildi veya kullanılamıyor',
166
+ statusUnsupported: 'Hareket sensörleri bu tarayıcı tarafından sunulmuyor',
167
+ statusActive: 'Canlı sensör akışı aktif',
168
+ steadyLabel: 'Sabit',
169
+ movingLabel: 'Hareketli',
170
+ shakingLabel: 'Sallanıyor',
171
+ alphaLabel: 'Alpha',
172
+ betaLabel: 'Beta',
173
+ gammaLabel: 'Gamma',
174
+ accelXLabel: 'X',
175
+ accelYLabel: 'Y',
176
+ accelZLabel: 'Z',
177
+ rotationAlphaLabel: 'Rot A',
178
+ rotationBetaLabel: 'Rot B',
179
+ rotationGammaLabel: 'Rot G',
180
+ levelOffsetLabel: 'Seviye sapması',
181
+ motionMagnitudeLabel: 'Hareket büyüklüğü',
182
+ cubeLabel: '3D cihaz yön küpü',
183
+ bubbleLabel: 'Su terazisi göstergesi',
184
+ calibrationLabel: 'Canlı derece',
185
+ },
186
+ };
@@ -0,0 +1,186 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { MobileSensorTestUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'mobile-sensor-test';
7
+ const title = '手机传感器测试';
8
+ const description = '在手机上运行陀螺仪、加速度计、运动传感器和水平仪在线测试,检查倾斜、旋转、漂移和传感器校准问题。';
9
+
10
+ const faqData = [
11
+ {
12
+ question: '如何在线测试手机陀螺仪?',
13
+ answer: '在手机上打开测试,点击开始校准,如果出现提示则允许运动访问,然后旋转和倾斜设备。正常工作的陀螺仪和方向传感器应平滑更新 alpha、beta 和 gamma,不会冻结或剧烈跳动。',
14
+ },
15
+ {
16
+ question: '可以用水平仪测试加速度计吗?',
17
+ answer: '可以。开始测试后,将手机放在平坦的桌子上。气泡应稳定在中心附近,加速度值应保持稳定。如果手机静止时气泡严重漂移,加速度计可能需要校准,或者保护壳、桌子或设备硬件可能正在产生干扰。',
18
+ },
19
+ {
20
+ question: '为什么 iPhone 会要求运动权限?',
21
+ answer: 'iPhone 和 iPad 上的 Safari 需要用户在点击后才能让网站访问运动和方向传感器。如果权限被拒绝,测试将无法读取陀螺仪或加速度计数据,直到你允许运动访问。',
22
+ },
23
+ {
24
+ question: '这能修复或校准损坏的指南针吗?',
25
+ answer: '没有任何浏览器工具可以修复硬件或强制进行系统指南针校准。此测试可帮助你识别症状:读数卡住、运动嘈杂、漂移、权限缺失或浏览器不暴露传感器。',
26
+ },
27
+ ];
28
+
29
+ const howToData = [
30
+ { name: '在手机上打开测试', text: '使用你想要诊断的同一部 iPhone、iPad、安卓手机或平板电脑。桌面浏览器通常没有运动传感器可供暴露。' },
31
+ { name: '允许运动访问', text: '点击开始校准,如果浏览器显示运动或方向权限提示,请接受。' },
32
+ { name: '测试倾斜和旋转', text: '将手机向前倾斜,左右滚动,然后在桌子上平放旋转。观察 alpha、beta、gamma 和加速度的平滑变化。' },
33
+ { name: '在平坦表面检查漂移', text: '让手机静置几秒钟。健康的传感器应该稳定下来,而不是不断漂移、出现尖峰或冻结。' },
34
+ ];
35
+
36
+ const faqSchema: WithContext<FAQPage> = {
37
+ '@context': 'https://schema.org',
38
+ '@type': 'FAQPage',
39
+ mainEntity: faqData.map((item) => ({
40
+ '@type': 'Question',
41
+ name: item.question,
42
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
43
+ })),
44
+ };
45
+
46
+ const howToSchema: WithContext<HowTo> = {
47
+ '@context': 'https://schema.org',
48
+ '@type': 'HowTo',
49
+ name: title,
50
+ description,
51
+ step: howToData.map((step, i) => ({
52
+ '@type': 'HowToStep',
53
+ position: i + 1,
54
+ name: step.name,
55
+ text: step.text,
56
+ })),
57
+ };
58
+
59
+ const appSchema: WithContext<SoftwareApplication> = {
60
+ '@context': 'https://schema.org',
61
+ '@type': 'SoftwareApplication',
62
+ name: title,
63
+ description,
64
+ applicationCategory: 'UtilityApplication',
65
+ operatingSystem: 'All',
66
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
67
+ inLanguage: 'zh',
68
+ };
69
+
70
+ export const content: ToolLocaleContent<MobileSensorTestUI> = {
71
+ slug,
72
+ title,
73
+ description,
74
+ faq: faqData,
75
+ howTo: howToData,
76
+ schemas: [faqSchema, howToSchema, appSchema],
77
+ bibliography,
78
+ seo: [
79
+ { type: 'title', text: '手机在线陀螺仪和加速度计测试', level: 2 },
80
+ {
81
+ type: 'paragraph',
82
+ html: '当屏幕旋转感觉不对、游戏或 AR 应用出现漂移、水平仪应用看起来不准确、导航指向错误方向或手机对倾斜反应不正确时,使用此手机传感器测试。测试实时显示陀螺仪、加速度计、旋转和水平仪的行为,帮助你区分浏览器权限问题和真正的传感器或校准问题。',
83
+ },
84
+ {
85
+ type: 'stats',
86
+ items: [
87
+ { label: '主要搜索意图', value: '在线测试陀螺仪' },
88
+ { label: '同时检查', value: '加速度计漂移' },
89
+ { label: '最佳设备', value: '手机或平板电脑' },
90
+ ],
91
+ },
92
+ { type: 'title', text: '每个传感器读数告诉你什么', level: 3 },
93
+ {
94
+ type: 'table',
95
+ headers: ['读数', '用途', '警告信号'],
96
+ rows: [
97
+ ['Alpha', '检查绕垂直轴的旋转,用于类似指南针的运动和方向变化。', '手机平放旋转时不变化、大幅跳变或卡在零值。'],
98
+ ['Beta', '检查前后倾斜,用于屏幕旋转、游戏、相机水平和 AR 控制。', '方向错误、卡在一个值上或手机静止时持续漂移。'],
99
+ ['Gamma', '检查左右翻滚,用于横屏旋转、赛车游戏、水平仪应用和稳定器。', '一侧反应不同、数值嘈杂或气泡在平坦桌子上永远不归中。'],
100
+ ['加速度 X/Y/Z', '检查加速度计响应、震动检测、重力方向和运动稳定性。', '静止时出现大幅尖峰、对运动无响应或取下保护壳后读数不稳定。'],
101
+ ],
102
+ },
103
+ {
104
+ type: 'diagnostic',
105
+ variant: 'warning',
106
+ title: '此测试可帮助诊断的症状',
107
+ html: '<p>使用实时数值调查自动旋转不工作、陀螺仪感觉延迟、加速度计漂移、指南针校准警告、AR 跟踪偏移、相机水平错误、运动控制偏向一侧或手机仅在原生应用中报告运动但在浏览器中不报告等问题。</p>',
108
+ },
109
+ { type: 'title', text: '陀螺仪 vs 加速度计 vs 指南针', level: 3 },
110
+ {
111
+ type: 'comparative',
112
+ items: [
113
+ { title: '陀螺仪', description: '测量旋转速度。对 AR、游戏、相机稳定、运动控制和平滑方向变化至关重要。' },
114
+ { title: '加速度计', description: '测量加速度和重力方向。支持倾斜、震动检测、步数检测和数字水平仪行为。' },
115
+ { title: '指南针 / 磁力计', description: '帮助估计方向,但可能被磁铁、金属物体、车载支架、保护壳、扬声器、笔记本电脑和附近电子设备干扰。' },
116
+ ],
117
+ },
118
+ { type: 'title', text: '如何正确测试传感器校准', level: 3 },
119
+ {
120
+ type: 'list',
121
+ items: [
122
+ '测试前取下磁性保护壳、MagSafe 钱包、金属支架、手柄夹和其他配件。',
123
+ '将手机放在稳固的平坦桌子上,等待几秒钟后再判断漂移。',
124
+ '沿每个轴缓慢旋转手机,而不是立即摇晃。',
125
+ '如果浏览器不显示数据,将 Safari 或 Chrome 与原生传感器或指南针应用进行比较。',
126
+ '如果读数在多个应用中冻结,请重启设备并重复测试。',
127
+ ],
128
+ },
129
+ {
130
+ type: 'tip',
131
+ title: 'iPhone 和 Android 权限说明',
132
+ html: '在 iPhone 和 iPad 上,Safari 可能在点击后请求运动和方向权限。在 Android 上,Chrome 通常更直接地暴露运动传感器,但隐私设置、浏览器标志、省电模式和嵌入式 WebView 仍可能阻止或减少传感器数据。',
133
+ },
134
+ {
135
+ type: 'table',
136
+ headers: ['问题', '可能原因', '下一步'],
137
+ rows: [
138
+ ['没有任何值变化', '权限被拒绝、浏览器不受支持、桌面设备或受限 WebView。', '在手机上打开,使用 Safari 或 Chrome,允许运动访问并重新加载页面。'],
139
+ ['气泡在桌子上漂移', '校准问题、表面不平整、保护壳干扰或加速度计噪声。', '取下保护壳,使用已知的平坦表面,重启并与原生水平仪应用比较。'],
140
+ ['指南针方向错误', '磁干扰或系统指南针校准。', '远离金属和电子设备,使用操作系统的指南针校准流程。'],
141
+ ['数值跳动或出现尖峰', '传感器噪声、硬件损坏、浏览器激进限制或突然的物理运动。', '在静止状态下测试,关闭重度应用,并与另一个浏览器或原生应用比较。'],
142
+ ],
143
+ },
144
+ {
145
+ type: 'summary',
146
+ title: '此测试的用途',
147
+ items: [
148
+ '无需安装应用即可在线测试手机陀螺仪。',
149
+ '使用实时水平仪检查加速度计漂移。',
150
+ '查明运动控制是否因硬件、校准、权限或浏览器支持而失败。',
151
+ '为 AR、游戏、相机水平校正、导航或屏幕旋转故障排除准备手机。',
152
+ ],
153
+ },
154
+ ],
155
+ ui: {
156
+ startButton: '开始校准',
157
+ permissionHint: '点击一次以解锁运动传感器',
158
+ privacyBadge: '本地传感器数据',
159
+ privacyCopy: '方向和运动读数保留在此浏览器会话中。',
160
+ orientationPanel: '方向',
161
+ motionPanel: '运动',
162
+ bubblePanel: '数字水平仪',
163
+ statusReady: '准备获取传感器权限',
164
+ statusWaiting: '等待浏览器权限',
165
+ statusDenied: '传感器访问被拒绝或不可用',
166
+ statusUnsupported: '此浏览器未暴露运动传感器',
167
+ statusActive: '实时传感器流已激活',
168
+ steadyLabel: '稳定',
169
+ movingLabel: '移动中',
170
+ shakingLabel: '摇晃中',
171
+ alphaLabel: 'Alpha',
172
+ betaLabel: 'Beta',
173
+ gammaLabel: 'Gamma',
174
+ accelXLabel: 'X',
175
+ accelYLabel: 'Y',
176
+ accelZLabel: 'Z',
177
+ rotationAlphaLabel: 'Rot A',
178
+ rotationBetaLabel: 'Rot B',
179
+ rotationGammaLabel: 'Rot G',
180
+ levelOffsetLabel: '水平偏移',
181
+ motionMagnitudeLabel: '运动幅度',
182
+ cubeLabel: '3D 设备方向立方体',
183
+ bubbleLabel: '水平仪指示器',
184
+ calibrationLabel: '实时角度',
185
+ },
186
+ };
@@ -0,0 +1,11 @@
1
+ import { mobileSensorTest } from './entry';
2
+ import type { ToolDefinition } from '../../types';
3
+
4
+ export * from './entry';
5
+
6
+ export const MOBILE_SENSOR_TEST_TOOL: ToolDefinition = {
7
+ entry: mobileSensorTest,
8
+ Component: () => import('./component.astro'),
9
+ SEOComponent: () => import('./seo.astro'),
10
+ BibliographyComponent: () => import('./bibliography.astro'),
11
+ };
@@ -0,0 +1,39 @@
1
+ export interface MobileSensorSnapshot {
2
+ alpha: number;
3
+ beta: number;
4
+ gamma: number;
5
+ accelerationX: number;
6
+ accelerationY: number;
7
+ accelerationZ: number;
8
+ rotationAlpha: number;
9
+ rotationBeta: number;
10
+ rotationGamma: number;
11
+ }
12
+
13
+ export interface MobileSensorAssessment {
14
+ levelOffset: number;
15
+ motionMagnitude: number;
16
+ stability: 'steady' | 'moving' | 'shaking';
17
+ }
18
+
19
+ export function clamp(value: number, min: number, max: number): number {
20
+ return Math.min(max, Math.max(min, value));
21
+ }
22
+
23
+ export function safeNumber(value: number | null | undefined): number {
24
+ return Number.isFinite(value) ? Number(value) : 0;
25
+ }
26
+
27
+ export function assessMobileSensors(snapshot: MobileSensorSnapshot): MobileSensorAssessment {
28
+ const levelOffset = Math.hypot(snapshot.beta, snapshot.gamma);
29
+ const motionMagnitude = Math.hypot(snapshot.accelerationX, snapshot.accelerationY, snapshot.accelerationZ);
30
+ let stability: MobileSensorAssessment['stability'] = 'steady';
31
+
32
+ if (motionMagnitude > 18) {
33
+ stability = 'shaking';
34
+ } else if (motionMagnitude > 3 || levelOffset > 12) {
35
+ stability = 'moving';
36
+ }
37
+
38
+ return { levelOffset, motionMagnitude, stability };
39
+ }