RecordConfig.mm 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. //
  2. // RecordConfig.m
  3. // FunSDKDemo
  4. //
  5. // Created by XM on 2018/11/6.
  6. // Copyright © 2018年 XM. All rights reserved.
  7. //
  8. #import "RecordConfig.h"
  9. #import "SupportExtRecord.h"
  10. #import "Record.h"
  11. #import "ExtRecord.h"
  12. #import "RecordDataSourse.h"
  13. @interface RecordConfig ()
  14. {
  15. SupportExtRecord suport; //录像能力级
  16. Record record; //主码流录像配置
  17. ExtRecord exRecord; //辅码流录像配置
  18. NSInteger suporttype; //录像配置支持情况
  19. RecordDataSourse *dataSourse; //录像配置资源支持对象
  20. }
  21. @end
  22. @implementation RecordConfig
  23. #pragma mark 判断当前录像配置是否可用
  24. - (BOOL)checkRecord {
  25. if (suporttype == -1) {
  26. //如果没有获取能力级,肯定不可用
  27. return NO;
  28. }else if (suporttype == 0){
  29. //只支持主码流
  30. return [self checkMainRecord];
  31. }else if (suporttype == 1) {
  32. //只支持辅码流
  33. return [self checkExtraRecord];
  34. }else {
  35. //主辅码流都要正常才可以配置
  36. return [self checkMainRecord] && [self checkExtraRecord];
  37. }
  38. }
  39. - (BOOL)checkMainRecord {
  40. if (suporttype == -1) {
  41. return NO;
  42. }
  43. //判断数组数据是否正常,防止越界
  44. if (record.Mask.Size() < 7 || record.Mask[0].Size() < 6 || record.TimeSection.Size() < 7 || record.TimeSection[0].Size()< 6) {
  45. //数据异常,无法配置
  46. return NO;
  47. }
  48. return YES;
  49. }
  50. -(BOOL)checkExtraRecord {
  51. if (suporttype == -1) {
  52. return NO;
  53. }
  54. //判断数组数据是否正常,防止越界
  55. if (exRecord.Mask.Size() < 7 || exRecord.Mask[0].Size() < 6 || exRecord.TimeSection.Size() < 7 || exRecord.TimeSection[0].Size()< 6) {
  56. //数据异常,无法配置
  57. return NO;
  58. }
  59. return YES;
  60. }
  61. #pragma mark - 获取录像配置。 1、获取是否支持主辅码流录像。2、获取支持的录像配置
  62. -(void)getRecordConfig {
  63. //初始化录像资源支持对象
  64. dataSourse = [[RecordDataSourse alloc] init];
  65. //获取通道
  66. ChannelObject *channel = [[DeviceControl getInstance] getSelectChannel];
  67. //获取当前通道主码流和辅码流是否支持录像配置
  68. [self AddConfig:[CfgParam initWithName:channel.deviceMac andConfig:&suport andChannel:channel.channelNumber andCfgType:CFG_GET]];
  69. [self GetConfig];
  70. }
  71. //获取主码流录像配置
  72. - (void)getMainRecordConfig {
  73. //获取通道
  74. ChannelObject *channel = [[DeviceControl getInstance] getSelectChannel];
  75. //获取当前通道主码流和辅码流是否支持录像配置
  76. [self AddConfig:[CfgParam initWithName:channel.deviceMac andConfig:&record andChannel:channel.channelNumber andCfgType:CFG_GET_SET]];
  77. [self GetConfig:NSSTR(record.Name())];
  78. }
  79. //获取辅码流录像配置
  80. -(void)getExtraRecordConfig {
  81. //获取通道
  82. ChannelObject *channel = [[DeviceControl getInstance] getSelectChannel];
  83. //获取当前通道主码流和辅码流是否支持录像配置
  84. [self AddConfig:[CfgParam initWithName:channel.deviceMac andConfig:&exRecord andChannel:channel.channelNumber andCfgType:CFG_GET_SET]];
  85. [self GetConfig:NSSTR(exRecord.Name())];
  86. }
  87. #pragma mark - 获编码配置回调
  88. -(void)OnGetConfig:(CfgParam *)param{
  89. if ([param.name isEqualToString:NSSTR(suport.Name())]) {
  90. //读取录像能力级
  91. suporttype = [NSSTR(suport.AbilityPram.Value()) integerValue];
  92. if (suporttype == 0) {
  93. //只支持主码流
  94. [self getMainRecordConfig];
  95. }else if(suporttype == 1) {
  96. //只支持辅码流
  97. [self getExtraRecordConfig];
  98. }else if (suporttype == 2) {
  99. //主码流辅码流都支持
  100. [self getMainRecordConfig];
  101. [self getExtraRecordConfig];
  102. }
  103. //回调给上层界面当前通道的录像配置支持情况
  104. if ([self.delegate respondsToSelector:@selector(recordSuportStatu:)]) {
  105. [self.delegate recordSuportStatu:suporttype];
  106. }
  107. }
  108. if ([param.name isEqualToString:NSSTR(record.Name())]) {
  109. //主码流录像配置
  110. if ([self.delegate respondsToSelector:@selector(getRecordConfigResult:)]) {
  111. [self.delegate getRecordConfigResult:param.errorCode];
  112. }
  113. }
  114. if ([param.name isEqualToString:NSSTR(exRecord.Name())]) {
  115. //辅码流录像配置
  116. if ([self.delegate respondsToSelector:@selector(getRecordConfigResult:)]) {
  117. [self.delegate getRecordConfigResult:param.errorCode];
  118. }
  119. }
  120. }
  121. #pragma mark - 保存录像配置
  122. - (void)setRecordConfig {
  123. [self SetConfig];
  124. }
  125. #pragma mark 保存录像配置回调
  126. -(void)OnSetConfig:(CfgParam *)param{
  127. if ([param.name isEqualToString:NSSTR(record.Name())] || [param.name isEqualToString:NSSTR(exRecord.Name())]) {
  128. if ([self.delegate respondsToSelector:@selector(setRecordConfigResult:)]) {
  129. [self.delegate setRecordConfigResult:param.errorCode];
  130. }
  131. }
  132. }
  133. #pragma mark - 读取各项配置的属性值
  134. - (NSString*)getMainPreRecord { //读取主码流录像预录时间
  135. int PreRecord = record.PreRecord.Value();
  136. return [NSString stringWithFormat:@"%d",PreRecord];
  137. }
  138. - (NSString*)getExtraPreRecord { //读取辅码流录像预录时间
  139. int PreRecord = exRecord.PreRecord.Value();
  140. return [NSString stringWithFormat:@"%d",PreRecord];
  141. }
  142. - (NSString*)getMainPacketLength { //读取主码流录像时长
  143. int PacketLength = record.PacketLength.Value();
  144. return [NSString stringWithFormat:@"%d",PacketLength];
  145. }
  146. - (NSString*)getExtraPacketLength { //读取辅码流录像时长
  147. int PacketLength = exRecord.PacketLength.Value();
  148. return [NSString stringWithFormat:@"%d",PacketLength];
  149. }
  150. - (NSString*)getMainRecordMode { //获取主码流录像打开状态。包括始终录像、报警联动录像、关闭录像
  151. //正常来说判断录像状态需要RecordMode、Mask、TimeSection时间设置三个加在一起才能判断,不过可以做简化只判断Mask和RecordMode,然后再保存的时候把RecordMode和TimeSection按各种情形设置
  152. if (![self checkMainRecord]) {
  153. return TS("");
  154. }
  155. int mask = record.Mask[0][0].Value();
  156. if ([NSSTR(record.RecordMode.Value()) isEqualToString:@"ClosedRecord"]) {
  157. // ClosedRecord是不录像,强制设置mask为0,也就是不录像
  158. mask = 0;
  159. }
  160. return [dataSourse getRecordModeString:(int)mask];
  161. }
  162. - (NSString*)getExtraRecordMode { //获取辅码流录像打开状态
  163. if (![self checkExtraRecord]) {
  164. return TS("");
  165. }
  166. int mask = exRecord.Mask[0][0].Value();
  167. if ([NSSTR(exRecord.RecordMode.Value()) isEqualToString:@"ClosedRecord"]) {
  168. // ClosedRecord是不录像,强制设置mask为0,也就是不录像
  169. mask = 0;
  170. }
  171. return [dataSourse getRecordModeString:(int)mask];
  172. }
  173. #pragma mark - 设置各项配置的属性值
  174. - (void)setMainPreRecord:(NSString*)perRecord { //读取主码流录像预置时间
  175. record.PreRecord = [perRecord intValue];
  176. }
  177. - (void)setExtraPreRecord:(NSString*)perRecord { //读取辅码流录像预置时间
  178. exRecord.PreRecord = [perRecord intValue];
  179. }
  180. - (void)setMainPacketLength:(NSString*)PacketLength { //读取主码流录像时长
  181. record.PacketLength = [PacketLength intValue];
  182. }
  183. - (void)setExtraPacketLength:(NSString*)PacketLength { //读取辅码流录像时长
  184. exRecord.PacketLength = [PacketLength intValue];
  185. }
  186. //如果设置报警联动录像,那么设备报警功能需要打开才会录像,否则不会录像
  187. - (void)setMainRecordMode:(NSString*)maskString { //设置主码流录像开关状态
  188. if (![self checkRecord]) { //数据异常,不能保存
  189. return;
  190. }
  191. //先获取录像状态对应的mask值
  192. NSInteger mask = [dataSourse getRecordModeMask:maskString];
  193. if (mask == 0) { //停止录像
  194. //1、设置RecordMode为停止录像
  195. record.RecordMode = SZSTR(@"ClosedRecord") ;
  196. }else{
  197. //1、设置RecordMode为配置录像(联动录像和一直录像都可以找通过配置实现)
  198. record.RecordMode = SZSTR(@"ConfigRecord") ;
  199. }
  200. //2、设置每一天的mask都为传递进来的值
  201. for (int i =0; i< record.Mask.Size(); i++) {
  202. // mask:0停止录像。6报警联动录像。7一直录像
  203. record.Mask[i][0] = (int)mask;
  204. }
  205. //3、设置TimeSection第一段为一整天(这里可以根据需求,一共可以设置6段时间)
  206. for (int j = 0; j< record.TimeSection.Size(); j++) {
  207. //第一个1表示这一段有效,后面的是有效时间
  208. record.TimeSection[j][0] = SZSTR(@"1 00:00:00-24:00:00");
  209. //如果想自定义录像时间段和录像类型,可以通过设置每一天的6段TimeSection和对应的6段mask实现
  210. }
  211. }
  212. - (void)setExtraRecordMode:(NSString*)maskString { //设置辅码流录像开关状态
  213. if (![self checkRecord]) { //数据异常,不能保存
  214. return;
  215. }
  216. NSInteger mask = [dataSourse getRecordModeMask:maskString];
  217. if (mask == 0) { //停止录像
  218. //1、设置RecordMode为停止录像
  219. exRecord.RecordMode = SZSTR(@"ClosedRecord") ;
  220. }else{
  221. //1、设置RecordMode为配置录像(联动录像和一直录像都可以找通过配置实现)
  222. exRecord.RecordMode = SZSTR(@"ConfigRecord") ;
  223. }
  224. //2、设置每一天的mask都为传递进来的值
  225. for (int i =0; i< exRecord.Mask.Size(); i++) {
  226. // mask:0停止录像。6报警联动录像。7一直录像
  227. exRecord.Mask[i][0] = (int)mask;
  228. }
  229. //3、设置TimeSection第一段为一整天(这里可以根据需求,一共可以设置6段时间)
  230. for (int j = 0; j< exRecord.TimeSection.Size(); j++) {
  231. //第一个1表示这一段有效,后面的是有效时间
  232. exRecord.TimeSection[j][0] = SZSTR(@"1 00:00:00-24:00:00");
  233. //如果想自定义录像时间段和录像类型,可以通过设置每一天的6段TimeSection和对应的6段mask实现
  234. }
  235. }
  236. #pragma mark - 获取各种配置的设置范围
  237. - (NSMutableArray *)getMainRecordModeArray { //主码流录像状态数组
  238. //录像状态有3种,没有录像、报警录像、一直录像
  239. return [[dataSourse getRecordModeArray] mutableCopy];
  240. }
  241. - (NSMutableArray *)getMainPrerecordArray { //主码流预录时间数组
  242. return [[dataSourse getPreRecordArray] mutableCopy];
  243. }
  244. - (NSMutableArray *)getMainPacketLengthArray { //主码流录像时长数组
  245. return [[dataSourse getPacketLengthArray] mutableCopy];
  246. }
  247. - (NSMutableArray *)getExtraRecordModeArray { //辅码流录像状态数组
  248. //录像状态有3种,没有录像、报警录像、一直录像
  249. return [[dataSourse getRecordModeArray] mutableCopy];
  250. }
  251. - (NSMutableArray *)getExtraPrerecordArray { //辅码流预录时间数组
  252. return [[dataSourse getPreRecordArray] mutableCopy];
  253. }
  254. - (NSMutableArray *)getExtraPacketLengthArray { //辅码流录像时长数组
  255. return [[dataSourse getPacketLengthArray] mutableCopy];
  256. }
  257. #pragma mark - 示例:设置周二晚上主码流为报警联动录像
  258. - (void)setTuesdayNightAlarmRecord {
  259. if ( ![self checkRecord]) {//判断数据是否正常
  260. return;
  261. }
  262. //1、设置RecordMode为配置录像
  263. record.RecordMode = SZSTR(@"ConfigRecord") ;
  264. //2、设置周二的mask都为6。(周日-周六对应0-6)
  265. record.Mask[2][0] = 6;
  266. //3、设置时间。假设晚上从6点开始,就是18:00:00-24:00:00
  267. record.TimeSection[2][0] = SZSTR(@"1 18:00:00-24:00:00");
  268. //4、保存配置
  269. // ~~~~~~
  270. }
  271. - (void)didReceiveMemoryWarning {
  272. [super didReceiveMemoryWarning];
  273. // Dispose of any resources that can be recreated.
  274. }
  275. @end