Firmware does R→UV→Y→IR sequential scan autonomously. Miniprogram now listens for 4 consecutive ADC notifications, storing each as a separate spectrum group. Also listens for run_state=IDLE as scan completion signal. Displays all 4 spectrum groups with PD1-PD7 bars. Stores full scan data in globalData.lastScanData for diagnosis phase.
158 行
2.4 KiB
Plaintext
158 行
2.4 KiB
Plaintext
.scan-container {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
padding: 20rpx 0;
|
|
}
|
|
|
|
.face-outline {
|
|
width: 320rpx;
|
|
height: 400rpx;
|
|
border: 6rpx solid #e5e5e5;
|
|
border-radius: 50% 50% 45% 45%;
|
|
position: relative;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.scan-line {
|
|
position: absolute;
|
|
left: 10rpx;
|
|
right: 10rpx;
|
|
height: 6rpx;
|
|
background: linear-gradient(90deg, transparent, #E6508C, #DCB982, #E6508C, transparent);
|
|
animation: scan 2s ease-in-out infinite;
|
|
}
|
|
|
|
@keyframes scan {
|
|
0% { top: 0; opacity: 0.5; }
|
|
50% { opacity: 1; }
|
|
100% { top: calc(100% - 6rpx); opacity: 0.5; }
|
|
}
|
|
|
|
.scan-progress-bar {
|
|
width: 80%;
|
|
height: 8rpx;
|
|
background: #f0f0f0;
|
|
border-radius: 4rpx;
|
|
margin-top: 30rpx;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.scan-progress-fill {
|
|
height: 100%;
|
|
background: linear-gradient(90deg, #E6508C, #DCB982);
|
|
border-radius: 4rpx;
|
|
transition: width 0.3s;
|
|
}
|
|
|
|
.scan-status {
|
|
font-size: 24rpx;
|
|
color: #999;
|
|
margin-top: 16rpx;
|
|
text-align: center;
|
|
}
|
|
|
|
.scan-result {
|
|
background: #fff;
|
|
border-radius: 20rpx;
|
|
padding: 24rpx;
|
|
margin-top: 20rpx;
|
|
}
|
|
|
|
.result-title {
|
|
font-size: 28rpx;
|
|
font-weight: 600;
|
|
color: #333;
|
|
margin-bottom: 20rpx;
|
|
}
|
|
|
|
.pd-list {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 16rpx;
|
|
}
|
|
|
|
.pd-item {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 16rpx;
|
|
}
|
|
|
|
.pd-region {
|
|
font-size: 26rpx;
|
|
color: #666;
|
|
width: 160rpx;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.pd-value {
|
|
font-size: 28rpx;
|
|
font-weight: 600;
|
|
color: #E6508C;
|
|
width: 100rpx;
|
|
flex-shrink: 0;
|
|
text-align: right;
|
|
}
|
|
|
|
.pd-empty {
|
|
color: #ccc;
|
|
font-weight: normal;
|
|
}
|
|
|
|
.pd-bar-bg {
|
|
flex: 1;
|
|
height: 16rpx;
|
|
background: #f5f5f5;
|
|
border-radius: 8rpx;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.pd-bar-fill {
|
|
height: 100%;
|
|
background: linear-gradient(90deg, #E6508C, #DCB982);
|
|
border-radius: 8rpx;
|
|
min-width: 4rpx;
|
|
}
|
|
|
|
.vbat-info {
|
|
margin-top: 20rpx;
|
|
font-size: 24rpx;
|
|
color: #999;
|
|
text-align: center;
|
|
}
|
|
|
|
.spectrum-group {
|
|
margin-bottom: 24rpx;
|
|
}
|
|
|
|
.spectrum-group:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.spectrum-title {
|
|
font-size: 26rpx;
|
|
font-weight: 600;
|
|
color: #E6508C;
|
|
margin-bottom: 12rpx;
|
|
padding-bottom: 8rpx;
|
|
border-bottom: 2rpx solid #fdf2f8;
|
|
}
|
|
|
|
.empty-hint {
|
|
text-align: center;
|
|
color: #999;
|
|
font-size: 26rpx;
|
|
padding: 40rpx 0;
|
|
}
|
|
|
|
.scan-error {
|
|
text-align: center;
|
|
color: #ff4d4f;
|
|
font-size: 26rpx;
|
|
margin-top: 20rpx;
|
|
}
|
|
|
|
.btn-primary::after {
|
|
border: none;
|
|
}
|