RDSAirControlVC.m 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601
  1. //
  2. // RDSAirControlVC.m
  3. // Temperature
  4. //
  5. // Created by RD on 2022/11/15.
  6. //
  7. #import "RDSAirControlVC.h"
  8. #import "CYCircularSlider.h"
  9. #import "RDSlider.h"
  10. #import "UIImage+Extension.h"
  11. #import "RDSCtrlModeView.h"
  12. #import "SPAlertController.h"
  13. #import "GCDTimer.h"// 轮询定时器
  14. #import "RDSRoomSetVC.h"
  15. @interface RDSAirControlVC ()<senderValueChangeDelegate,UIGestureRecognizerDelegate,UIPickerViewDataSource,UIPickerViewDelegate>
  16. // 工作模式(0:制冷,1:制热,2:除湿3:送风4:加湿)
  17. @property (nonatomic, strong) RDSCtrlModeView *modeView;
  18. @property (nonatomic, strong) UIButton *curModel;
  19. @property (weak, nonatomic) IBOutlet UIView *tempView;// 调节温度
  20. @property (nonatomic,strong) CYCircularSlider *cirSlider;// 温度圆形滑条
  21. @property (weak, nonatomic) IBOutlet UILabel *airTempLab;// 空调温度
  22. @property (weak, nonatomic) IBOutlet UILabel *modeLab;// 模式 档位
  23. @property (weak, nonatomic) IBOutlet UILabel *timingLab;// 定时
  24. @property (weak, nonatomic) IBOutlet UILabel *roomTempLab;// 室内温度
  25. @property (weak, nonatomic) IBOutlet UILabel *roomHumidityLab;// 湿度
  26. @property (weak, nonatomic) IBOutlet UILabel *roomPm25Lab;// pm2.5
  27. @property (weak, nonatomic) IBOutlet UILabel *roomCo2Lab;// co2
  28. @property (weak, nonatomic) IBOutlet RDSlider *fanSlider;// 风扇滑条
  29. @property (weak, nonatomic) IBOutlet UIButton *newairBtn;
  30. @property (weak, nonatomic) IBOutlet UIButton *powerBtn;
  31. @property (weak, nonatomic) IBOutlet UIButton *timingBtn;
  32. @property (nonatomic, strong) GCDTimer *gcdTimer;
  33. @property (nonatomic, strong) SPAlertController *timerAlert;
  34. @property (nonatomic, strong) NSMutableArray *timerData;// 定时picker数据源
  35. @property (nonatomic, strong) NSNumber *selectTimer;
  36. @property (strong, nonatomic) UITapGestureRecognizer *fanTap;
  37. @end
  38. @implementation RDSAirControlVC
  39. - (void)viewDidLoad {
  40. [super viewDidLoad];
  41. // Do any additional setup after loading the view from its nib.
  42. //当前页面禁用全屏右滑返回
  43. self.fd_interactivePopDisabled = YES;
  44. self.navigationItem.title = _roomModel.name;
  45. [self p_initUI];
  46. [self p_navEditItem];
  47. [self p_setUpTimer];// 初始化轮询
  48. _fanTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(p_onSliderTap:)];
  49. _fanTap.delegate = self;
  50. [self.fanSlider addGestureRecognizer:_fanTap];
  51. }
  52. - (void)viewDidDisappear:(BOOL)animated{
  53. [super viewDidDisappear:animated];
  54. [_gcdTimer pauseTimer];// 暂停轮询
  55. }
  56. - (void)p_navEditItem{
  57. UIBarButtonItem *item = [RDSBarButtonItem barButtonItemWithImage:@"icon_edit" target:self action:@selector(onEditAction)];
  58. [self.navigationItem setRightBarButtonItem:item];
  59. }
  60. - (void)p_initUI{
  61. [self p_setupModeView];
  62. UIImage *greenImg = [UIImage rds_imageWithColor:RDSGreenColor];
  63. UIImage *lightGreenImg = [UIImage rds_imageWithColor:RDSLightGreenColor];
  64. [_newairBtn setBackgroundImage:lightGreenImg forState:UIControlStateNormal];
  65. [_powerBtn setBackgroundImage:lightGreenImg forState:UIControlStateNormal];
  66. [_timingBtn setBackgroundImage:lightGreenImg forState:UIControlStateNormal];
  67. [_newairBtn setBackgroundImage:greenImg forState:UIControlStateSelected];
  68. [_powerBtn setBackgroundImage:greenImg forState:UIControlStateSelected];
  69. [_timingBtn setBackgroundImage:greenImg forState:UIControlStateSelected];
  70. CGFloat width = SCREEN_WIDTH-120;
  71. _cirSlider =[[CYCircularSlider alloc]initWithFrame:CGRectMake(10, 0, width, width)];
  72. _cirSlider.delegate = self;
  73. _cirSlider.backgroundColor = UIColor.clearColor;
  74. _cirSlider.filledColor = RDSGreenColor;
  75. _cirSlider.unfilledColor = RDSLightGreenColor;
  76. _cirSlider.lineWidth = 20;
  77. _cirSlider.minimumValue = 16;
  78. _cirSlider.maximumValue = 30;
  79. _cirSlider.value = 28;
  80. [self.tempView addSubview:_cirSlider];
  81. _fanSlider.minimumTrackTintColor = RDSGreenColor;
  82. [_fanSlider setThumbImage:[UIImage imageNamed:@"icon_point"] forState:UIControlStateNormal];
  83. [_fanSlider setThumbImage:[UIImage imageNamed:@"icon_point"] forState:UIControlStateHighlighted];
  84. // UIBezierPath *path = [UIBezierPath bezierPath];
  85. //
  86. // CAShapeLayer *shapeLayer = [CAShapeLayer layer];
  87. // shapeLayer.frame = CGRectMake(11, 4, 12, 6);
  88. // shapeLayer.path = path.CGPath;
  89. // shapeLayer.strokeColor = [UIColor grayColor].CGColor;
  90. // shapeLayer.fillColor = [UIColor whiteColor].CGColor;
  91. //
  92. // [self.fanSlider.layer insertSublayer:shapeLayer atIndex:0];
  93. //
  94. //循环创建(自己加个循环就好了) offset 计算每个分段的距离
  95. // CGFloat offset = _fanSlider.rds_width/5.0;
  96. // UIBezierPath *linePath = [UIBezierPath bezierPath];
  97. // [linePath moveToPoint:CGPointMake(offset * 1 , 0)];
  98. // [linePath addLineToPoint:CGPointMake(offset * 1 , 6)];
  99. //
  100. // CAShapeLayer *lineLayer = [CAShapeLayer layer];
  101. // lineLayer.path = linePath.CGPath;
  102. // lineLayer.strokeColor = [UIColor whiteColor].CGColor;
  103. // lineLayer.fillColor = [UIColor clearColor].CGColor;
  104. // [shapeLayer insertSublayer:lineLayer atIndex:0];
  105. }
  106. // cirSlider delegate
  107. - (void)senderVlueChangingWithNum:(int)num{
  108. _airTempLab.text = @(num).description;
  109. }
  110. - (void)senderVlueWithNum:(int)num{
  111. [self setTemp];
  112. }
  113. - (void)p_setupModeView{
  114. CGFloat viewW = (SCREEN_WIDTH-20*5)/4;// 一行显示4个,算上左右2边空白,共5个间隔
  115. RDSCtrlModeView *modeView = [[RDSCtrlModeView alloc] init];
  116. self.modeView = modeView;
  117. [self.view addSubview:modeView];
  118. [modeView mas_makeConstraints:^(MASConstraintMaker *make) {
  119. if (@available(iOS 11.0, *)) {
  120. make.top.equalTo(self.view.mas_safeAreaLayoutGuideTop).with.offset(10);
  121. } else {
  122. make.top.equalTo(self.view).offset(10);
  123. }
  124. make.height.equalTo(@(viewW));
  125. make.left.equalTo(self.view);//.offset(10);
  126. make.right.equalTo(self.view);//.offset(-10);
  127. }];
  128. RDS_WEAKSELF(weakSelf)
  129. modeView.onModeClick = ^(int mode) {
  130. [weakSelf onModeAction:mode];
  131. };
  132. }
  133. #pragma mark - Action 设备控制
  134. - (void)onEditAction{
  135. RDSRoomSetVC *vc = [[RDSRoomSetVC alloc] init];
  136. vc.roomModel = _roomModel;
  137. [self pushViewController:vc animated:YES];
  138. }
  139. // 点击模式
  140. - (void)onModeAction:(int)mode{
  141. [_gcdTimer restartTimer];// 重新开始轮询
  142. [RDSDemoApiHelper rds_setMode:mode control_number:_roomModel.control_number success:^(id responseObject) {
  143. if ([responseObject[@"code"] intValue] != 0) {
  144. [RDSHudShower showCenterToast:responseObject[@"message"]];
  145. }
  146. } failure:^(NSError *error) {
  147. [RDSHudShower showCenterToast:@"连接服务器失败"];
  148. }];
  149. }
  150. // 温度-1
  151. - (IBAction)onMovTempAction:(UIButton *)sender {
  152. if(!_roomModel.power) {
  153. [RDSHudShower showCenterToast:@"请先开机再进行其他操作"];
  154. return;
  155. }
  156. [_cirSlider setMovAngel];
  157. [self setTemp];
  158. }
  159. // 温度+1
  160. - (IBAction)onAddTempAction:(UIButton *)sender {
  161. if(!_roomModel.power) {
  162. [RDSHudShower showCenterToast:@"请先开机再进行其他操作"];
  163. return;
  164. }
  165. [_cirSlider setAddAngel];
  166. [self setTemp];
  167. }
  168. // 设置温度
  169. - (void)setTemp{
  170. [_gcdTimer restartTimer];// 重新开始轮询
  171. [RDSDemoApiHelper rds_setTemp:_cirSlider.value control_number:_roomModel.control_number success:^(id responseObject) {
  172. if ([responseObject[@"code"] intValue] != 0) {
  173. [RDSHudShower showCenterToast:responseObject[@"message"]];
  174. }
  175. } failure:^(NSError *error) {
  176. [RDSHudShower showCenterToast:@"连接服务器失败"];
  177. }];
  178. }
  179. - (IBAction)onFanSliderValueChanged:(RDSlider *)sender {
  180. if(!_roomModel.power) {
  181. [RDSHudShower showCenterToast:@"请先开机再进行其他操作"];
  182. return;
  183. }
  184. // 四舍五入 1~5挡位
  185. int value = round(sender.value);
  186. if (value < 1) value = 1;
  187. sender.value = value;
  188. }
  189. - (IBAction)onFanSliderValueDidChanged:(RDSlider *)sender {
  190. if(!_roomModel.power) {
  191. [RDSHudShower showCenterToast:@"请先开机再进行其他操作"];
  192. return;
  193. }
  194. [_gcdTimer restartTimer];// 重新开始轮询
  195. [self p_sendFanSpeed:sender.value];
  196. }
  197. - (void)p_onSliderTap:(UITapGestureRecognizer *)sender {
  198. if(!_roomModel.power) {
  199. [RDSHudShower showCenterToast:@"请先开机再进行其他操作"];
  200. return;
  201. }
  202. [_gcdTimer restartTimer];// 重新开始轮询
  203. UISlider *slider = (UISlider *)sender.view;
  204. CGPoint touchPoint = [sender locationInView:slider];
  205. float value = (slider.maximumValue - slider.minimumValue) * (touchPoint.x / slider.frame.size.width );
  206. int v = roundf(value);
  207. if (v<1) v = 1;
  208. [slider setValue:v animated:YES];
  209. [self p_sendFanSpeed:v];
  210. }
  211. - (void)p_sendFanSpeed:(int)value{
  212. [RDSDemoApiHelper rds_setSpeed:value control_number:_roomModel.control_number success:^(id responseObject) {
  213. if ([responseObject[@"code"] intValue] != 0) {
  214. [RDSHudShower showBottomToast:responseObject[@"message"]];
  215. }
  216. } failure:^(NSError *error) {
  217. [RDSHudShower showBottomToast:@"连接服务器失败"];
  218. }];
  219. }
  220. // 新风开关
  221. - (IBAction)onNewAirPowerAction:(UIButton *)sender {
  222. if(!_roomModel.power) {
  223. [RDSHudShower showCenterToast:@"请先开机再进行其他操作"];
  224. return;
  225. }
  226. [_gcdTimer restartTimer];// 重新开始轮询
  227. sender.selected = !sender.isSelected;
  228. [RDSDemoApiHelper rds_setNewFanPower:sender.isSelected control_number:_roomModel.control_number success:^(id responseObject) {
  229. if ([responseObject[@"code"] intValue] != 0) {
  230. [RDSHudShower showCenterToast:responseObject[@"message"]];
  231. }
  232. } failure:^(NSError *error) {
  233. [RDSHudShower showCenterToast:@"连接服务器失败"];
  234. }];
  235. }
  236. // 开关
  237. - (IBAction)onPowerAction:(UIButton *)sender {
  238. [_gcdTimer restartTimer];// 重新开始轮询
  239. sender.selected = !sender.isSelected;
  240. if(sender.isSelected){
  241. [_modeView setMode:_roomModel.mode];
  242. }
  243. [RDSDemoApiHelper rds_setPower:sender.isSelected control_number:_roomModel.control_number success:^(id responseObject) {
  244. if ([responseObject[@"code"] intValue] != 0) {
  245. [RDSHudShower showCenterToast:responseObject[@"message"]];
  246. }
  247. } failure:^(NSError *error) {
  248. [RDSHudShower showCenterToast:@"连接服务器失败"];
  249. }];
  250. }
  251. // 定时
  252. - (IBAction)onTimingAction:(UIButton *)sender {
  253. if(!_roomModel.power) {
  254. [RDSHudShower showCenterToast:@"请先开机再进行其他操作"];
  255. return;
  256. }
  257. if(!sender.isSelected){
  258. if(_selectTimer == nil || _selectTimer.floatValue == 0){
  259. _selectTimer = @0.5;
  260. }
  261. [self presentViewController:self.timerAlert animated:YES completion:nil];
  262. }else{
  263. if(_selectTimer == nil){
  264. _selectTimer = @0;
  265. }
  266. [self timerSelect];
  267. }
  268. }
  269. - (SPAlertController *)timerAlert{
  270. if (!_timerAlert){
  271. RDS_WEAKSELF(weakSelf)
  272. SPAlertController *alertController = [SPAlertController alertControllerWithTitle:@"定时关闭" message:@"" preferredStyle:SPAlertControllerStyleAlert animationType:SPAlertAnimationTypeDefault];
  273. UIPickerView *timerPick = [[UIPickerView alloc] init];
  274. timerPick.delegate = self;
  275. timerPick.dataSource = self;
  276. NSMutableArray *data = [NSMutableArray array];
  277. for (CGFloat i = 0.5; i<=24; i+=0.5) {
  278. [data addObject:@(i)];
  279. }
  280. self.timerData = data;
  281. _selectTimer = @(0.5);
  282. [timerPick selectRow:0 inComponent:0 animated:NO];
  283. UILabel *h = [[UILabel alloc] initWithFrame:CGRectMake(timerPick.rds_centerX+15, timerPick.rds_centerY-10, 20, 20)];
  284. h.text = @"h";
  285. h.textColor = RDSGreenColor;
  286. h.font = [UIFont systemFontOfSize:18];
  287. [timerPick addSubview:h];
  288. // 插入一个view
  289. [alertController insertComponentView:timerPick];
  290. SPAlertAction *action1 = [SPAlertAction actionWithTitle:@"取消" style:SPAlertActionStyleDefault handler:nil];
  291. SPAlertAction *action2 = [SPAlertAction actionWithTitle:@"确定" style:SPAlertActionStyleDefault handler:^(SPAlertAction * _Nonnull action) {
  292. [weakSelf timerSelect];
  293. }];
  294. [alertController addAction:action1];
  295. [alertController addAction:action2];
  296. _timerAlert = alertController;
  297. }
  298. return _timerAlert;
  299. }
  300. - (void)timerSelect{
  301. [_gcdTimer restartTimer];// 重新开始轮询
  302. _timingBtn.selected = !_timingBtn.isSelected;
  303. NSString *timingStr;
  304. NSString *selectTimer = [NSString stringWithFormat:@"%@h",_selectTimer];
  305. timingStr = _timingBtn.isSelected ? selectTimer : @"关";
  306. _timingLab.text = [NSString stringWithFormat:@"定时:%@",timingStr];
  307. [RDSDemoApiHelper rds_setTimer:_selectTimer onOff:_timingBtn.isSelected control_number:_roomModel.control_number success:^(id responseObject) {
  308. if ([responseObject[@"code"] intValue] != 0) {
  309. [RDSHudShower showCenterToast:responseObject[@"message"]];
  310. }
  311. } failure:^(NSError *error) {
  312. [RDSHudShower showCenterToast:@"连接服务器失败"];
  313. }];
  314. }
  315. #pragma mark pickerView delegate
  316. //滚动选中的行
  317. -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
  318. _selectTimer = _timerData[row];
  319. }
  320. //每行显示的内容
  321. -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
  322. CGFloat fHour = [_timerData[row] floatValue];
  323. NSString *str = [NSString stringWithFormat:@"%.1f",fHour];
  324. return str;
  325. }
  326. //列宽
  327. //-(CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component{
  328. //
  329. // return 100;
  330. //}
  331. #pragma mark pickerView dataSource
  332. // 多少组
  333. -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
  334. return 1;
  335. }
  336. // 行
  337. -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
  338. return _timerData.count;
  339. }
  340. //- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{
  341. //
  342. // UILabel *lbl = (UILabel *)view;
  343. //
  344. // if (lbl == nil) {
  345. // lbl = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, [pickerView rowSizeForComponent:component].width, [pickerView rowSizeForComponent:component].height)];
  346. // //在这里设置字体相关属性
  347. // lbl.font = [UIFont systemFontOfSize:22];
  348. // lbl.textColor = RDSGreenColor;
  349. // lbl.textAlignment = NSTextAlignmentCenter;
  350. // [lbl setBackgroundColor:[UIColor clearColor]];
  351. // }
  352. // //重新加载lbl的文字内容
  353. // lbl.text = [self pickerView:pickerView titleForRow:row forComponent:component];
  354. //
  355. // // 去掉选中行背景灰色
  356. // if(pickerView.subviews.count > 0){
  357. // pickerView.subviews[1].backgroundColor = UIColor.clearColor;
  358. // }
  359. //
  360. // return lbl;
  361. //
  362. //}
  363. #pragma mark - 轮询
  364. // 轮询设备状态 3秒一次
  365. - (void)p_setUpTimer{
  366. self.gcdTimer = [[GCDTimer alloc] init];
  367. RDS_WEAKSELF(weakSelf)
  368. [_gcdTimer scheduledTimerWithTimeInterval:3 afterTime:0 repeats:YES block:^{
  369. [weakSelf p_getRoomDetail];
  370. }];
  371. }
  372. - (void)p_getRoomDetail{
  373. RDS_WEAKSELF(weakSelf)
  374. [self.roomModel rds_getRoomDetailFinished:^(NSError * error) {
  375. [weakSelf p_refreshUI];
  376. }];
  377. }
  378. // 接口返回数据不正确 弃用
  379. - (void)p_getRoomStatus{
  380. RDS_WEAKSELF(weakSelf)
  381. [self.roomModel rds_getRoomStatusFinished:^(NSError * error) {
  382. [weakSelf p_refreshUI];
  383. }];
  384. }
  385. - (void)p_refreshUI{
  386. RDS_WEAKSELF(weakSelf)
  387. dispatch_async(dispatch_get_main_queue(), ^{
  388. // 用户拖动的时候不刷新
  389. if(!weakSelf.cirSlider.isTouchInside){
  390. weakSelf.cirSlider.value = weakSelf.roomModel.set_temp;
  391. weakSelf.airTempLab.text = @(weakSelf.roomModel.set_temp).description;
  392. }
  393. if (!weakSelf.fanSlider.isTouchInside){
  394. [weakSelf.fanSlider setValue:weakSelf.roomModel.fan_speed animated:YES];
  395. }
  396. [weakSelf.modeView setMode:weakSelf.roomModel.mode];
  397. weakSelf.roomTempLab.text = [NSString stringWithFormat:@"%d℃", weakSelf.roomModel.temperature];
  398. weakSelf.roomHumidityLab.text = [NSString stringWithFormat:@"%d%%", weakSelf.roomModel.humidity];
  399. weakSelf.roomPm25Lab.text = [NSString stringWithFormat:@"%d", weakSelf.roomModel.air_quality];
  400. weakSelf.roomCo2Lab.text = [NSString stringWithFormat:@"%d", weakSelf.roomModel.co2];
  401. weakSelf.powerBtn.selected = weakSelf.roomModel.power;
  402. weakSelf.newairBtn.selected = weakSelf.roomModel.new_fan;
  403. weakSelf.timingBtn.selected = weakSelf.roomModel.timer_status;
  404. NSString *mode;
  405. switch (weakSelf.roomModel.mode) {
  406. case 0:
  407. mode = @"制冷";
  408. break;
  409. case 1:
  410. mode = @"制热";
  411. break;
  412. case 2:
  413. mode = @"除湿";
  414. break;
  415. case 3:
  416. mode = @"送风";
  417. break;
  418. case 4:
  419. mode = @"加湿";
  420. break;
  421. default:
  422. break;
  423. }
  424. NSString *speed;
  425. switch (weakSelf.roomModel.fan_speed) {
  426. case 1:
  427. speed = @"一档";
  428. break;
  429. case 2:
  430. speed = @"二档";
  431. break;
  432. case 3:
  433. speed = @"三档";
  434. break;
  435. case 4:
  436. speed = @"四档";
  437. break;
  438. case 5:
  439. speed = @"五档";
  440. break;
  441. default:
  442. break;
  443. }
  444. weakSelf.modeLab.text = [NSString stringWithFormat:@"%@ %@", mode, speed];
  445. NSString *selectTimer = [NSString stringWithFormat:@"%@h",weakSelf.roomModel.duration];
  446. if (!weakSelf.roomModel.timer_status) selectTimer = @"关";
  447. weakSelf.timingLab.text = [NSString stringWithFormat:@"定时:%@",selectTimer];
  448. });
  449. }
  450. - (void)dealloc{
  451. [_gcdTimer stopTimer];;
  452. DDLog(@"dealloc~~");
  453. }
  454. @end