630 lines
21 KiB
Objective-C
630 lines
21 KiB
Objective-C
//
|
|
// ThreeControlCenterViewController.m
|
|
// Ifish
|
|
//
|
|
// Created by imac on 16/4/18.
|
|
// Copyright © 2016年 imac. All rights reserved.
|
|
//
|
|
|
|
#import "ThreeControlCenterViewController.h"
|
|
#import "manulswitchMSModel.h"
|
|
#import "SetTimeController.h"
|
|
#define LIGHT1_TAG 201
|
|
#define LIGHT2_TAG 202
|
|
#define PUMP_TAG 203
|
|
#import "ThreeControlName.h"
|
|
#import "ThreeControlNameViewController.h"
|
|
#import "UserExtendataArchaver.h"
|
|
//三控 返回消息类型
|
|
typedef NS_ENUM(NSInteger,ThreeControBackMsgTape){
|
|
|
|
// 三控六定时器 返回消息类型71字节
|
|
|
|
ThreeControlBackmsgTapeSenventyOneByte,
|
|
|
|
// 三控六定时器 返回消息类型 99 字节 (最早陈工)
|
|
ThreeControlBackmsgTapeNinetyNineByte
|
|
|
|
};
|
|
|
|
|
|
@interface ThreeControlCenterViewController ()
|
|
|
|
@property(nonatomic,strong) SetTimeController*SetTimeVC;
|
|
|
|
@property(nonatomic,assign) ThreeControBackMsgTape threeControltype;
|
|
|
|
@property(nonatomic,strong) BackmassegeModel*backmodel;
|
|
@property (nonatomic,strong) ThreeControlNameViewController *changeNameVC ;
|
|
@end
|
|
|
|
@implementation ThreeControlCenterViewController
|
|
|
|
- (void)viewDidLoad {
|
|
[super viewDidLoad];
|
|
//主界面按钮事件分离
|
|
_backmodel=[[BackmassegeModel alloc] init];
|
|
[Socketsingleton sharedInstance].communiteDelegate = self;
|
|
|
|
|
|
[self.SetTimeButton addTarget:self action:@selector(threeControlSetBtnAction:) forControlEvents:UIControlEventTouchUpInside];
|
|
[self.setbackBtn addTarget:self action:@selector(threeControlSetBtnAction:) forControlEvents:UIControlEventTouchUpInside];
|
|
|
|
|
|
UITapGestureRecognizer*tapgestureRecognizer=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(threeCenterViewSetTap)];
|
|
[self.setImag addGestureRecognizer:tapgestureRecognizer];
|
|
|
|
UITapGestureRecognizer*tapGesture=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(threeControlViewclockViewClick)];
|
|
self.clockView.userInteractionEnabled=YES;
|
|
[self.clockView addGestureRecognizer:tapGesture];
|
|
|
|
[self initThreeControlButton];
|
|
|
|
}
|
|
|
|
-(void)viewWillAppear:(BOOL)animated{
|
|
|
|
[self creatFishAnimation];
|
|
|
|
}
|
|
|
|
-(void)viewDidAppear:(BOOL)animated{
|
|
|
|
|
|
|
|
}
|
|
- (void)didReceiveMemoryWarning {
|
|
[super didReceiveMemoryWarning];
|
|
// Dispose of any resources that can be recreated.
|
|
}
|
|
|
|
#pragma mark - 初始化三控按钮
|
|
|
|
-(void)initThreeControlButton{
|
|
|
|
NSArray*nomalarr=@[@"PFLight1_off.png",@"PFLight1_off.png",@"ChongLang_off.png"];
|
|
|
|
CGFloat btnControlWith = kScreenSize.width*7/32;
|
|
CGFloat btnControlPlace = (kScreenSize.width - 3*btnControlWith * 105 / 122 )/4;
|
|
|
|
for (int i=0; i<nomalarr.count; i++) {
|
|
self.button=[UIButton buttonWithType:UIButtonTypeCustom];
|
|
self.button.layer.masksToBounds=YES;
|
|
self.button.layer.cornerRadius=8;
|
|
|
|
self.button.tag=201+i;
|
|
|
|
|
|
|
|
self.button.frame=CGRectMake(btnControlPlace +i*(btnControlPlace + btnControlWith * 105 / 122), kScreenSize.height - (btnControlPlace - 10) - btnControlWith -10 -64 , btnControlWith * 105 / 122, btnControlWith );
|
|
|
|
|
|
//self.button.frame=CGRectMake1(wSpace1+(i%3)*(60+wSpace1), kScreenSize.height-80-64,60, 60);
|
|
[self.button setImage:[UIImage imageNamed:nomalarr[i]] forState:UIControlStateNormal];
|
|
|
|
[self.button addTarget:self action:@selector(selctBtnCilck:) forControlEvents:UIControlEventTouchUpInside];
|
|
|
|
[self.tableView addSubview:self.button];
|
|
if (i==0) {
|
|
_light1Button=self.button;
|
|
|
|
}else if (i==1){
|
|
_light2Button=self.button;
|
|
|
|
}else if (i==2){
|
|
_pumpButton=self.button;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
NSArray*arry=@[@"灯1",@"灯2",@"UV/冲浪"];
|
|
|
|
for (int j=0; j<nomalarr.count; j++){
|
|
|
|
self.buttonNameLabel=[[UILabel alloc]initWithFrame:CGRectMake(btnControlPlace +j*(btnControlPlace + btnControlWith * 105 / 122), kScreenSize.height - (btnControlPlace - 10) - 20 -64, btnControlWith * 7 / 8, btnControlPlace -10)];
|
|
|
|
|
|
// self.timeLabel=[[UILabel alloc]initWithFrame:CGRectMake1(wSpace+(i%3)*(60+wSpace), kScreenSize.height-30-64,60, 20)];
|
|
self.buttonNameLabel.text=arry[j];
|
|
self.buttonNameLabel.font=[UIFont systemFontOfSize:15];
|
|
self.buttonNameLabel.textColor=[UIColor whiteColor];
|
|
self.buttonNameLabel.textAlignment=NSTextAlignmentCenter;
|
|
self.buttonNameLabel.tag=230+j;
|
|
self.buttonNameLabel.textColor=[UIColor colorWithRed:101/255.0f green:103/255.0f blue:103/254.0f alpha:1];
|
|
self.buttonNameLabel.font = [UIFont boldSystemFontOfSize:13];
|
|
[self.tableView addSubview:self.buttonNameLabel];
|
|
|
|
|
|
if (j==0) {
|
|
_light1name=self.buttonNameLabel;
|
|
|
|
}else if (j==1){
|
|
_light2name=self.buttonNameLabel;
|
|
|
|
}else if (j==2){
|
|
_pumpname=self.buttonNameLabel;
|
|
}
|
|
}
|
|
[self initCHNames];
|
|
}
|
|
|
|
#pragma mark 三控按钮事件
|
|
-(void)selctBtnCilck:(UIButton*)btn{
|
|
|
|
BackmassegeModel*backmodel=[[DataCenter defaultDtacenter]valueForKey:@"DeviceBackInfo"];
|
|
|
|
if (!self.currentDevice.isWorkModel) {
|
|
[self.view makeToast:@"无isWorkModel字段"];
|
|
return;
|
|
}
|
|
|
|
if (backmodel) {
|
|
|
|
if ([self.currentDevice.isWorkModel isEqualToString:@"1"]){
|
|
|
|
if ([backmodel.yunxingmoshi isEqualToString:@"01"]){
|
|
|
|
[self showLableAction:@"请先关闭定时模式"];
|
|
|
|
}
|
|
}
|
|
|
|
}else{
|
|
|
|
|
|
[self.indicatorView stopAnimating];
|
|
[self deviceNotOnlineState];
|
|
[self showLableAction:@"设备已离线"];
|
|
|
|
|
|
}
|
|
|
|
|
|
if ([self.currentDevice.isWorkModel isEqualToString:@"1"]) {
|
|
//有工作模式
|
|
manulswitchMSModel*manulModel=[[manulswitchMSModel alloc]init];
|
|
//设置指令mac地址
|
|
[[Socketsingleton sharedInstance] setSoketLightDataWith:manulModel];
|
|
NSString*switchString1=manulModel.description;
|
|
if (btn.selected) {
|
|
manulModel.switchBtn=@"00";//手动模式开
|
|
btn.selected=NO;
|
|
|
|
}else {
|
|
manulModel.switchBtn=@"01";// 手动模式关
|
|
btn.selected=YES;
|
|
}
|
|
manulModel.crc16Str=@"0000";// CRC16验证码
|
|
switch (btn.tag) {
|
|
case LIGHT1_TAG:
|
|
{
|
|
|
|
|
|
if ([backmodel.yunxingmoshi isEqualToString:@"00"]) {
|
|
btn.userInteractionEnabled=YES;
|
|
[btn setImage:[UIImage imageNamed:@"PFLight1_on.png"] forState:UIControlStateSelected];
|
|
manulModel.lightNumber=@"01";// 00 --灯1
|
|
NSString*switchString2=[NSString stringWithFormat:@"%@%@%@%@",switchString1,manulModel.lightNumber,manulModel.switchBtn,manulModel.crc16Str];
|
|
NSData*manulData=[dataContorl stringToHexData:switchString2];
|
|
|
|
[[Socketsingleton sharedInstance] soketWriteData:manulData];
|
|
|
|
if ([Socketsingleton sharedInstance].clientSocket.isConnected) {
|
|
//soket 未断开时显示
|
|
[self initHUD];
|
|
[self.myhud myhudstart];
|
|
|
|
}
|
|
|
|
}else{
|
|
if ([manulModel.switchBtn isEqualToString:@"00"]) {
|
|
btn.selected=YES;
|
|
}else{
|
|
btn.selected=NO;
|
|
}
|
|
|
|
}
|
|
}
|
|
break;
|
|
case LIGHT2_TAG:
|
|
{
|
|
if ([backmodel.yunxingmoshi isEqualToString:@"00"]) {
|
|
btn.userInteractionEnabled=YES;
|
|
[btn setImage:[UIImage imageNamed:@"PFLight1_on.png"] forState:UIControlStateSelected];
|
|
manulModel.lightNumber=@"02";// 01 --灯2
|
|
NSString*switchString2=[NSString stringWithFormat:@"%@%@%@%@",switchString1,manulModel.lightNumber,manulModel.switchBtn,manulModel.crc16Str];
|
|
NSData*manulData=[dataContorl stringToHexData:switchString2];
|
|
|
|
[[Socketsingleton sharedInstance] soketWriteData:manulData];
|
|
|
|
if ([Socketsingleton sharedInstance].clientSocket.isConnected) {
|
|
//soket 未断开时显示
|
|
[self initHUD];
|
|
[self.myhud myhudstart];
|
|
|
|
}
|
|
|
|
}else{
|
|
if ([manulModel.switchBtn isEqualToString:@"00"]) {
|
|
btn.selected=YES;
|
|
}else{
|
|
btn.selected=NO;
|
|
}
|
|
|
|
}
|
|
}
|
|
break;
|
|
case PUMP_TAG:
|
|
|
|
{
|
|
if ([backmodel.yunxingmoshi isEqualToString:@"00"]) {
|
|
btn.userInteractionEnabled=YES;
|
|
[btn setImage:[UIImage imageNamed:@"ChongLang_on.png"] forState:UIControlStateSelected];
|
|
manulModel.lightNumber=@"03";// 02 --水泵
|
|
NSString*switchString2=[NSString stringWithFormat:@"%@%@%@%@",switchString1,manulModel.lightNumber,manulModel.switchBtn,manulModel.crc16Str];
|
|
NSData*manulData=[dataContorl stringToHexData:switchString2];
|
|
|
|
[[Socketsingleton sharedInstance] soketWriteData:manulData];
|
|
|
|
if ([Socketsingleton sharedInstance].clientSocket.isConnected) {
|
|
//soket 未断开时显示
|
|
[self initHUD];
|
|
[self.myhud myhudstart];
|
|
|
|
}
|
|
|
|
}else{
|
|
if ([manulModel.switchBtn isEqualToString:@"00"]) {
|
|
btn.selected=YES;
|
|
}else{
|
|
btn.selected=NO;
|
|
}
|
|
}
|
|
|
|
}
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
}
|
|
|
|
|
|
|
|
}else{
|
|
//无工作模式
|
|
|
|
manulswitchMSModel*manulModel=[[manulswitchMSModel alloc]init];
|
|
//设置指令mac地址
|
|
[[Socketsingleton sharedInstance] setSoketLightDataWith:manulModel];
|
|
NSString*switchString1=manulModel.description;
|
|
if (btn.selected) {
|
|
manulModel.switchBtn=@"00";//手动模式开
|
|
btn.selected=NO;
|
|
|
|
}else {
|
|
manulModel.switchBtn=@"01";// 手动模式关
|
|
btn.selected=YES;
|
|
}
|
|
manulModel.crc16Str=@"0000";// CRC16验证码
|
|
switch (btn.tag) {
|
|
case LIGHT1_TAG:
|
|
{
|
|
|
|
|
|
|
|
btn.userInteractionEnabled=YES;
|
|
[btn setImage:[UIImage imageNamed:@"PFLight1_on.png"] forState:UIControlStateSelected];
|
|
manulModel.lightNumber=@"01";// 00 --灯1
|
|
NSString*switchString2=[NSString stringWithFormat:@"%@%@%@%@",switchString1,manulModel.lightNumber,manulModel.switchBtn,manulModel.crc16Str];
|
|
NSData*manulData=[dataContorl stringToHexData:switchString2];
|
|
|
|
[[Socketsingleton sharedInstance] soketWriteData:manulData];
|
|
|
|
if ([Socketsingleton sharedInstance].clientSocket.isConnected) {
|
|
//soket 未断开时显示
|
|
[self initHUD];
|
|
[self.myhud myhudstart];
|
|
|
|
}
|
|
|
|
|
|
}
|
|
break;
|
|
case LIGHT2_TAG:
|
|
{
|
|
|
|
btn.userInteractionEnabled=YES;
|
|
[btn setImage:[UIImage imageNamed:@"PFLight1_on.png"] forState:UIControlStateSelected];
|
|
manulModel.lightNumber=@"02";// 01 --灯2
|
|
NSString*switchString2=[NSString stringWithFormat:@"%@%@%@%@",switchString1,manulModel.lightNumber,manulModel.switchBtn,manulModel.crc16Str];
|
|
NSData*manulData=[dataContorl stringToHexData:switchString2];
|
|
|
|
[[Socketsingleton sharedInstance] soketWriteData:manulData];
|
|
|
|
if ([Socketsingleton sharedInstance].clientSocket.isConnected) {
|
|
//soket 未断开时显示
|
|
[self initHUD];
|
|
[self.myhud myhudstart];
|
|
|
|
}
|
|
|
|
}
|
|
break;
|
|
case PUMP_TAG:
|
|
|
|
{
|
|
|
|
btn.userInteractionEnabled=YES;
|
|
[btn setImage:[UIImage imageNamed:@"ChongLang_on.png"] forState:UIControlStateSelected];
|
|
manulModel.lightNumber=@"03";// 02 --水泵
|
|
NSString*switchString2=[NSString stringWithFormat:@"%@%@%@%@",switchString1,manulModel.lightNumber,manulModel.switchBtn,manulModel.crc16Str];
|
|
NSData*manulData=[dataContorl stringToHexData:switchString2];
|
|
|
|
[[Socketsingleton sharedInstance] soketWriteData:manulData];
|
|
|
|
if ([Socketsingleton sharedInstance].clientSocket.isConnected) {
|
|
//soket 未断开时显示
|
|
[self initHUD];
|
|
[self.myhud myhudstart];
|
|
|
|
}
|
|
|
|
|
|
}
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
#pragma mark - 三控界面设置btn点击事件
|
|
|
|
-(void)threeControlSetBtnAction:(UIButton*)btn{
|
|
|
|
NSLog(@"点击了设置");
|
|
if (self.binddeviceArr.count ==0) {
|
|
[self.view makeToast:@"暂未绑定设备"];
|
|
}else{
|
|
BackmassegeModel*backmodel=[[DataCenter defaultDtacenter]valueForKey:@"DeviceBackInfo"];
|
|
if (backmodel) {
|
|
[self pushSetTimeVC];
|
|
}else{
|
|
[self deviceNotOnlineState];
|
|
|
|
[self showLableAction:@"设备已离线"];
|
|
|
|
[self.indicatorView stopAnimating];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#pragma mark - 设置图片点击事件
|
|
|
|
-(void)threeCenterViewSetTap{
|
|
|
|
NSLog(@"点击了图片");
|
|
if (self.binddeviceArr.count ==0) {
|
|
[self.view makeToast:@"暂未绑定设备"];
|
|
}else{
|
|
|
|
|
|
BackmassegeModel*backmodel=[[DataCenter defaultDtacenter]valueForKey:@"DeviceBackInfo"];
|
|
if (backmodel) {
|
|
[self pushSetTimeVC];
|
|
}else{
|
|
[self showLableAction:@"设备已离线"];
|
|
[self deviceNotOnlineState];
|
|
[self.indicatorView stopAnimating];
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
#pragma mark - 锁屏图片点击事件
|
|
|
|
-(void)threeControlViewclockViewClick{
|
|
|
|
[self pushSetTimeVC];
|
|
}
|
|
|
|
#pragma mark - 转跳设置界面
|
|
|
|
-(void)pushSetTimeVC{
|
|
|
|
_SetTimeVC=[[SetTimeController alloc]init];
|
|
//_SetTimeVC.clientSocket= self.singletonSocket.clientSocket;
|
|
_SetTimeVC.currentdevice=self.currentDevice;
|
|
[self.navigationController pushViewController:_SetTimeVC animated:YES];
|
|
|
|
|
|
//self.navigationBarHidden=NO;
|
|
|
|
}
|
|
|
|
#pragma mark 登陆成功后收到服务端的回执之后,调用的代理方法
|
|
-(void)socketDidGetBackmsgData:(NSData *)data onsoket:(AsyncSocket *)sock{
|
|
|
|
NSLog(@"登陆成功后收收到服务器的回执--->%@",data);
|
|
|
|
//[sock readDataWithTimeout:-1 tag:0];
|
|
NSString*string1=[dataContorl dataToHexString:data];
|
|
|
|
self.temperature.hidden=NO;
|
|
//设备在线显示与设备离线相对应
|
|
self.dulabel.hidden=NO;
|
|
//设备在线显示与设备离线相对应 收到返回数据改变显示状态
|
|
self.notOnLineLabel.hidden = YES;
|
|
self.temperaturebackImg.hidden=NO;
|
|
|
|
[self.indicatorView stopAnimating];
|
|
//[_HUD hide:YES];
|
|
[self.myhud hidmyHud];
|
|
|
|
|
|
if (_SetTimeVC.indicatorView) {
|
|
[_SetTimeVC.indicatorView stopAnimating];
|
|
}
|
|
|
|
|
|
|
|
self.dataLength=string1.length;
|
|
|
|
if (string1.length==IFISH_BACKMASGTYAP99) {
|
|
//99 字节 全用BackmassegeModel
|
|
|
|
//三控 6定时器 99字节两控
|
|
self.threeControltype = ThreeControlBackmsgTapeNinetyNineByte;
|
|
[DeviceCommunicateDataUnity readSoketbackMassageOfThreeControlData:data WithModel:_backmodel];
|
|
|
|
if ([_backmodel.yunxingmoshi isEqualToString:@"00"]) {
|
|
self.waringLabel.hidden=YES;
|
|
self.clockView.hidden=YES;
|
|
}else{
|
|
self.clockView.hidden=NO;
|
|
self.waringLabel.hidden=NO;
|
|
}
|
|
|
|
if ([_backmodel.baojingSwitch isEqualToString:@"01"]) {
|
|
|
|
self.temperaturebackImg.hidden=NO;
|
|
|
|
}else{
|
|
|
|
self.temperaturebackImg.hidden=YES;
|
|
|
|
}
|
|
|
|
}else if (string1.length==IFISH_BACKMASGTYAP71){
|
|
|
|
self.threeControltype = ThreeControlBackmsgTapeSenventyOneByte;
|
|
[DeviceCommunicateDataUnity readSoketThreeControlBackMassageData:data WithModel:_backmodel];
|
|
|
|
if ([_backmodel.yunxingmoshi isEqualToString:@"00"]) {
|
|
self.waringLabel.hidden=YES;
|
|
self.clockView.hidden=YES;
|
|
}else{
|
|
self.clockView.hidden=NO;
|
|
self.waringLabel.hidden=NO;
|
|
}
|
|
|
|
//背景图片状态
|
|
|
|
if ([_backmodel.baojingSwitch isEqualToString:@"01"]) {
|
|
|
|
self.temperaturebackImg.hidden=NO;
|
|
// self.shuixiangwendu.hidden=YES;
|
|
|
|
}else{
|
|
|
|
self.temperaturebackImg.hidden=YES;
|
|
//self.shuixiangwendu.hidden=NO;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//按钮状态
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
|
|
|
switch (self.threeControltype) {
|
|
|
|
case ThreeControlBackmsgTapeSenventyOneByte:
|
|
{
|
|
|
|
[DeviceCommunicateDataUnity resetThreeControlButtonState:_light1Button addlight2:_light2Button addpump:_pumpButton withBackModel:_backmodel];
|
|
// 实时刷新设置界面 时间设置
|
|
_SetTimeVC.timeArr=[DeviceCommunicateDataUnity refreshThreeControlTimerAddTemperatureWithBackMassageModel:_backmodel];
|
|
[_SetTimeVC.tableView reloadData];
|
|
|
|
|
|
}
|
|
break;
|
|
case ThreeControlBackmsgTapeNinetyNineByte:
|
|
{
|
|
[DeviceCommunicateDataUnity resetThreeControlButtonState:_light1Button addlight2:_light2Button addpump:_pumpButton withBackModel:_backmodel];
|
|
// 实时刷新设置界面 时间设置
|
|
_SetTimeVC.timeArr=[DeviceCommunicateDataUnity refreshThreeControlTimerAddTemperatureWithBackMassageModel:_backmodel];
|
|
[_SetTimeVC.tableView reloadData];
|
|
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
});
|
|
|
|
//温度label
|
|
[DeviceCommunicateDataUnity setTemperaturelabel:self.temperature addTemperaturebackImg:self.temperaturebackImg addbubleImge:self.bubble WithBackData:data addWithBackMassageModel:_backmodel addWithTableview:self.tableView] ;
|
|
|
|
[self endRefreshing];
|
|
|
|
//}
|
|
|
|
|
|
}
|
|
//设备登陆成功
|
|
-(void)ifishDeviceLogInSuccees{
|
|
self.isconnect=YES;
|
|
NSLog(@"app登录成功");
|
|
|
|
}
|
|
-(void)ifishDeviceLogInFail{
|
|
|
|
[self endRefreshing];
|
|
[self.indicatorView stopAnimating];
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
[self deviceNotOnlineState];//设备离线
|
|
|
|
|
|
});
|
|
|
|
}
|
|
|
|
#pragma mark -父类方法
|
|
-(void)shezhiMingCheng
|
|
{
|
|
|
|
_changeNameVC = [[ThreeControlNameViewController alloc] init];
|
|
_changeNameVC.name = self.name.text;
|
|
_changeNameVC.device = self.currentDevice;
|
|
__weak typeof (self)wself = self;
|
|
_changeNameVC.NameWithBlock = ^(NSString *nameStr){
|
|
wself.name.text = nameStr;
|
|
[wself initCHNames];
|
|
};
|
|
[ wself.navigationController pushViewController: _changeNameVC animated:YES];
|
|
}
|
|
|
|
|
|
-(void)initCHNames{
|
|
|
|
ThreeControlName *name = [UserExtendataArchaver currentThreeControlName:self.currentDevice.macAddress];
|
|
self.light1name.text = name.light1Name;
|
|
self.light2name.text = name.light2Name;
|
|
|
|
self.pumpname.text = name.pumpName;
|
|
|
|
|
|
}
|
|
|
|
|
|
@end
|