Utilisation de fichiers cocoa multiples

Michael31Michael31 Membre
19:30 modifié dans API AppKit #1
Bonjour,

Presque un an d'écoulé depuis mon inscription sur votre site : missions professionnelles obligent, j'étais loin de mon Mac !
Le GUI est donc de retour sur mon bureau: cela avance mais je bute sur un problème digne d'un étourdi  :( ..
En fait, le programme complet étant assez volumineux, j'éclate les fonctions sur plusieurs fichiers qui sont attachés lors de la compilation: principe sans innovation, utilisé avec mes applications sous Delphi.
Problème : bien que je déclare les fichiers .h utilisés dans le source commun, ils ne sont pas vu lors du fonctionnement. J'ai essayé de grouper tous les fichiers dans le groupe CLASS ou dans OTHER SOURCE sans effet. Les fichiers  sont sans erreurs lors du lancement de BUILD, je vois bien les routines depuis  le cube bleu dans IB, mais pas de réponse aux actions en provenance des commandes associées dans le GUI.
A ce niveau, je suis un peu perdu . :(.. une aide pour éclairer mon ignorance serait des plus apprécier ...

pour info:

/********************/
#import "I2CFunctions.h"
#import "I2CbusCoder.h"
#import "HIDcontroller.h" // HID controller routines

@implementation I2CbusCoder
/********************/

les routines associées à  2CFunctions.h et / ou HIDcontroller.h ne sont pas vues par I2CbusCoder.h

merci pour votre aide,

Michael

Réponses

  • wiskywisky Membre
    19:30 modifié #2
    C'est la même classe mais répartie dans plusieurs fichier ? Où as-tu créer plusieurs classes chacune traitant des tâches précise et étant utilisé par i2CBusCoder ?
    Montre un peu plus de code si tu souhaite que nous t'aidions ;)
  • Michael31Michael31 Membre
    novembre 2009 modifié #3
    Merci pour l'aide. En lisant la totalité des messages dans le bac à  sable, je suis tombé sur un post semblable de 2004 ... mais cela ne suffit pas à  éclaircir ma lanterne..

    - les fichiers I2CbusCoder.h , I2CbusCoder.m, I2CFunctions.h et I2CFunctions.m sont sous la même classe.
    Les routines de chacun de ces fichiers doivent répondre aux commandes saisie sur l'écran du système ( voir image 1 ).
    Toutes les fonctions situées dans I2CbusCoder.m fonctionnent comme attendu en utilisant la délégation, associé aux tags pour identifier l'origine des commandes.
    Afin d'éclaircir le programme, j'ai éclater les fonctions par famille : les routines présentes dans le fichier I2CFunctions.m sont bien compilées, sans erreur, mais ne sont jamais activées par les commandes provenant de l'écran de saisie. voir image 2

    Une deuxième série de fichiers est en cours pour supporter le port HID. Pour essais, j'ai logé ces fichiers dans le groupe "Other Sources" : cela ne fonctionne pas car je ne sais ni envoyer / recevoir une chaà®ne de
    caractères, ni activer une fonction depuis le fichier I2CbusCoder.m.
    Une re- lecture du bouquin de Aaron Hillegass, version 3, s'impose pour moi car je suis plus que bloqué, sauf à  mettre toutes les fonctions dans un seul fichier , ce qui n'est pas très élégant mais délicat pour la mise point et la maintenance...
    Encore merci pour l'aide...

    Michael
    <br />#import &lt;Cocoa/Cocoa.h&gt;<br />				<br /><br />@interface I2CbusCoder : NSObject <br />{<br />	IBOutlet NSTextField *textField;<br />	IBOutlet id  TOTAL_RUN_text;<br />	IBOutlet id  ADDRESS_ERROR_text;<br />	IBOutlet id  DATA_ERROR_text;<br />	IBOutlet id  I2C_HEX_text;<br />	IBOutlet id  VID_text;<br />	IBOutlet id  PID_text;<br />	IBOutlet id  I2C_ADDRESS_text;<br />	IBOutlet id  I2C_DATA_text;<br />	IBOutlet id  I2C_MODE_text;<br />	IBOutlet id  I2C_DEC_text;<br />	IBOutlet id  I2C_STRING;<br />	IBOutlet id  NBRtestSeq_text;<br />	<br />	IBOutlet NSSlider *VBUS_slider;<br />	IBOutlet id VBUStext;<br />	IBOutlet id SCL_F_text;<br />	IBOutlet id PWIDTH_text;<br />	<br />	NSCalendarDate *now;<br />	NSTimer *timer;<br />	int data;<br />	<br />	int I2C_DEC_ADR;						// I2C physical address<br />	int TotalRun ;							// total number of test ran during I2C sequence<br />	int	ADDRerror;							// total I2C address error during I2C sequence<br />	int DATAerror;							// total DATA byte error during I2C sequence<br />	int NBRtestSeq;							// number of testsequence requested for a loop<br />	bool testLOOP;							// I2C test sequence = true when loop is requested<br />}<br />	- (void)controlTextDidChange:(NSNotification *)aNotification;<br /><br />	- (IBAction) hexAdress:(id) sender;		// hexadecimal I2C address code selected<br />	- (IBAction) binAdress:(id) sender;		// binary I2C address code selected<br />	<br />	- (IBAction) hexReg:(id) sender;		// hexadecimal Register code selected<br />	- (IBAction) binReg:(id) sender;		// binary Register code selected<br />	<br />	- (IBAction) hexByte:(id) sender;		// hexadecimal Byte code selected<br />	- (IBAction) binByte:(id) sender;		// Binary Byte code selected<br /><br />	- (IBAction) EnableByte1:(id) sender;	// enable/disable DATA byte1<br /><br />	- (IBAction) EnableByte2:(id) sender;	// enable/disable DATA byte2<br /><br />	- (IBAction) STOP:(id) sender;			// stop the I2C test<br /><br />	- (IBAction) SingleRUN: (id) sender;	// run a single I2C test sequence<br /><br />	- (IBAction) LoopRUN: (id) sender;		// run a continuous loop I2C test sequence<br /><br />	- (IBAction) I2C_OK: (id) sender;		// Valid the I2C address<br /><br />	- (IBAction) ERROR_RESET: (id) sender;	// reset the error counters<br /><br />	- (IBAction) I2C_SEND_STRING: (id) sender;	// send one hexadecimal string to I2C port.<br />												// see the format defined to run such a test<br />	- (IBAction) I2C_CHECK_STRING: (id) sender;	// check the string before to send<br /><br />	- (IBAction) VsourceCNTL: (id) sender;		// control the Vbus source selection<br /><br />	- (IBAction) NBRtestSequence: (id) sender;  // setup the number of test sequence requested for a loop<br /><br /><br />@end<br /><br /><br /><br /><br />#import &quot;I2CFunctions.h&quot;<br />#import &quot;I2CbusCoder.h&quot;<br />#import &quot;HIDcontroller.h&quot;						// HID controller routines<br /><br /><br />@implementation I2CbusCoder<br /><br /><br /> -(void)awakeFromNib<br />{	// preset the timer to display date &amp; time<br />	timer = [[NSTimer scheduledTimerWithTimeInterval :1<br />				target : self<br />				selector : @selector(upDateTimer:)<br />				userInfo:nil<br />				repeats:YES] retain];<br />	<br />	I2C_DEC_ADR = 0;							// clear I2C address<br />	TotalRun = 0;								// total number of test ran during I2C sequence<br />	ADDRerror = 0;								// total I2C address error during I2C sequence<br />	DATAerror = 0;								// total DATA byte error during I2C sequence<br />	testLOOP = FALSE;							// test loop non active<br />} <br /><br />//-------------------------------------------------------------------------------------------//<br /><br />-(void)upDateTimer:(NSTimer *)aTimer;		// update and display date &amp; time<br />{<br />	now = [NSCalendarDate calendarDate];<br />	[textField setObjectValue:now];<br />}<br /><br />//-------------------------------------------------------------------------------------------//	<br /><br />//function to convert decimal number to binary<br /><br />int decTobin(int m)<br /><br />{<br />	int rem;<br />	int store [100];<br />	int i = 0;<br />	<br />	do<br />	{<br />		rem = m % 2;				// extract the modulo 2<br />		m = m / 2;					// extract the binary value<br />		store[i] = rem;				// store bit value<br />		++i;						// increase next character<br />	}<br />	while (m != 0);					// repeat until the decimal number = 0<br />	<br />	return store[100];				// return the binary string<br />}	<br />//-------------------------------------------------------------------------------------------//<br /><br />//function to convert binary number to base 10<br /><br />int binToDec (char binValue &#91;])<br />{						<br />	int length = strlen(binValue);<br />	int power = 1;<br />	int sum = 0;<br />	int i=0;	<br />	{<br />		int charValue=0;<br />		for (i=length-1; i&gt;=0; --i)<br />		{<br />			//if value[i] is neither a 1 or 0 then its not a valid binary number<br />			if (binValue[i] != 48 &amp;&amp; binValue[i] != 49) {<br />				sum=0;									//invalid binary input -&gt; exit<br />				exit(1);<br />			}<br />			//convert the ascii value of the character to decimal so we can evaluate it<br />			charValue = binValue[i] -48;<br />			if (charValue != 0) {<br />				sum = sum + ( charValue * power);<br />			} <br />			power = power * 2;<br />		}	<br />		return sum;<br />	}<br />	return 1;<br />}<br /><br />//-------------------------------------------------------------------------------------------//<br />- (void) I2C_OK: (id) sender;			// Valid the I2C address<br />	<br />{<br />	int tempI2C = 0;<br />	tempI2C = I2C_DEC_ADR;<br />	//(int) writeHIDdevice: (NSString*) dataByte;<br />		<br />	//int z = writeHIDdevice(&quot;test&quot;);  //****&lt;&lt;&lt;&lt;&lt;&lt;&lt;****** this label is not acknoledged by this routine &gt;&gt;&gt;&gt;&gt;&gt;&gt;******///<br />	//z =z/1;<br />}<br /><br />//-------------------------------------------------------------------------------------------//<br />- (void) SingleRUN: (id) sender;	// run a single I2C test sequence<br />{<br />	// send the Single RUN code to the external MCU<br />	<br />	testLOOP = FALSE;<br />	TotalRun = TotalRun + 1;					// total number of test ran during I2C sequence<br />	[TOTAL_RUN_text setIntValue : TotalRun];<br />}<br /><br />//-------------------------------------------------------------------------------------------//<br />- (void) LoopRUN: (id) sender;		// run a continuous loop I2C test sequence<br />{<br />	// send the Loop RUN code to the external MCU<br />	int j = 0;<br />	<br />	for (j=1 ; j &lt;= NBRtestSeq ; ++j)<br />		{<br />			TotalRun = TotalRun + 1;					// total number of test ran during I2C sequence<br />			[TOTAL_RUN_text setIntValue : TotalRun];<br />		}<br />}<br /><br />//-------------------------------------------------------------------------------------------//<br /><br />-(void) STOP:(id) sender;<br />{<br />	// send the STOP code to theexternal MCU<br />	<br />	testLOOP = FALSE;							// stop the test loop sequence<br />}<br />//-------------------------------------------------------------------------------------------//<br />- (void) ERROR_RESET: (id) sender;	// reset the error counters<br />{<br />	TotalRun = 0;								// total number of test ran during I2C sequence<br />	ADDRerror = 0;								// total I2C address error during I2C sequence<br />	DATAerror = 0;								// total DATA byte error during I2C sequence<br />	NBRtestSeq = 0;								// clear any previous number of test sequence<br />	<br />	[ADDRESS_ERROR_text setIntValue:0];<br />	[DATA_ERROR_text setIntValue:0];<br />	[TOTAL_RUN_text setIntValue:0];	<br />}<br />//-------------------------------------------------------------------------------------------//<br />- (void) NBRtestSequence: (id) sender;  // setup the number of test sequence requested for a loop<br />{<br />	NSString *tempTx = [sender stringValue];<br />	NBRtestSeq= [tempTx intValue ];<br />	<br />	if (NBRtestSeq &gt; 10000)				// no more than 10000 loops<br />		NBRtestSeq = 10000;<br />}<br /><br />//-------------------------------------------------------------------------------------------//<br />- (void) hexAdress:(id) sender;		// hexadecimal I2C address code setup by the user<br />{<br />	int x;<br />	//char z;<br />	<br />	NSString *tempHEX;<br />	NSString *tempH = [sender stringValue];<br />	<br />	x = [tempH length];<br />	<br />	if (x&gt;2)<br />			tempH = [tempH substringToIndex:2];		// maximum two characters<br />	<br />	tempH=[tempH uppercaseString];<br />	<br />	x = [tempH length];						// extract the last character coming from the keyboard<br />	tempHEX = [tempH substringFromIndex:x-1];						<br /><br />	<br />	[sender setStringValue:tempH];			// update the display accordingly<br /><br />	}<br /><br />//-------------------------------------------------------------------------------------------//<br />- (void) binAdress:(id) sender;		// binary I2C address code selected<br />{<br />	int tag = [sender tag];<br />	NSString *HexTemp;<br />	<br />	if ([sender state] == NSOnState)			// is the bit checked to hight ?<br />		I2C_DEC_ADR = I2C_DEC_ADR + tag;		// yes, add the bit decimal value to I2C address<br />	else<br />		I2C_DEC_ADR = I2C_DEC_ADR - tag;		// no, remove the bit from I2C Address<br />	<br />	HexTemp = [NSString stringWithFormat : @&quot;%x&quot;,I2C_DEC_ADR];<br />	HexTemp = [HexTemp uppercaseString];<br />	[I2C_HEX_text setStringValue:HexTemp];<br />	[I2C_DEC_text setIntValue:I2C_DEC_ADR];<br />	<br />	tag = I2C_DEC_ADR %2;<br />	if (tag == 0)<br />		[I2C_MODE_text setStringValue: @&quot;I2C Operation = WRITE&quot;];<br />	else<br />		[I2C_MODE_text setStringValue: @&quot;I2C Operation = READ&quot;];<br />}<br />//-------------------------------------------------------------------------------------------//<br />- (void) binByte:(id) sender;		// binary I2C byte code selected<br />{<br />}<br /><br />//-------------------------------------------------------------------------------------------//<br />- (void) hexByte:(id) sender;		// hexadecimal I2C byte code selected<br />{<br />				<br />}<br />//-------------------------------------------------------------------------------------------//<br />- (void) binReg:(id) sender;		// binary I2C register code selected<br />{<br />	<br />}<br /><br />//-------------------------------------------------------------------------------------------//<br />- (void) hexReg:(id) sender;		// hexadecimal I2C register code selected<br />{<br />	<br />}<br /><br />//-------------------------------------------------------------------------------------------//<br />-(void) EnableByte1:(id) sender;<br />{<br />}<br /><br />//-------------------------------------------------------------------------------------------//<br />-(void) EnableByte2:(id) sender;<br />{<br />}<br /><br />//-------------------------------------------------------------------------------------------//<br />-(void) I2C_SEND_STRING: (id) sender;	// send one hexadecimal string to I2C port.<br />{<br />	<br />}<br /><br />//--------------------------------------------------------------------------------------------------//<br />//--- controlTextDidChange :																	  --//<br />//--- Extract a string from a text field andcheck that any character support the Hexadecimal code --//<br />//--- In addition, check the number of character per field and automatically cut the last keyed &nbsp; --//<br />//--- character according to the limit defined for the text fields								  --//<br />//--------------------------------------------------------------------------------------------------//<br /><br />- (void)controlTextDidChange:(NSNotification *)aNotification;<br />{<br />	int z;<br />	NSString *x;<br />	unichar w;<br />	int maxByte = 0;<br />	<br />	NSText * cell = [[aNotification  userInfo] objectForKey:@&quot;NSFieldEditor&quot;];<br />	<br />	x = [cell string];						// extract the string contained into the text field<br />	x = [x uppercaseString];				// convert to Upper case<br />	z = [x length];							// get the number of characters present in the string<br />	<br />	if (z == 0)								// make sure we will not make a negative value<br />		z=1;<br />	<br />	w = [x  characterAtIndex:z-1 ];			// extract the last character typed into the text field<br />	<br />		// identify the origin of the string and setup the maximum number of characters accordingly<br />		if (([[aNotification object] tag] &gt;= 1) &amp;&amp; ([[aNotification object] tag] &lt;= 5))<br />			maxByte = 2;<br />		else if ([[aNotification object] tag] == 99)<br />			maxByte = 80;<br />			<br />	// &nbsp; ||  ****<br />	//------------------------------------------------------------------------------------------//<br />	if (maxByte ==2)<br />	{<br />		if ( ( w &lt; &#39;0&#39; || w &gt;&#39;9&#39; )  &amp;&amp; (w &lt; &#39;A&#39; || w &gt;&#39;F&#39;))		// check the last character is <br />		{														// a valid Hexadecimal <br />			NSRange r = NSMakeRange(0, z-1);					// erase  the last keyed character<br />			x=[x substringWithRange:r];							// if it is not a valid Hexadecimal<br />		}<br />	}<br />	//------------------------------------------------------------------------------------------//		<br />	if (maxByte ==80)<br />	{<br />		if ( ( w &lt; &#39;0&#39; || w &gt;&#39;9&#39; )  &amp;&amp; (w &lt; &#39;A&#39; || w &gt;&#39;F&#39;) &amp;&amp; (w != &#39;;&#39;) &amp;&amp; (w !=&#39;/&#39;))		<br />		{														<br />			NSRange r = NSMakeRange(0, z-1);					<br />			x=[x substringWithRange:r];							<br />		}<br />	}<br />	//------------------------------------------------------------------------------------------//<br />	<br />	if (z &gt; maxByte)										// check the maximum of characters<br />		{														// associated with the related field<br />			NSRange r =NSMakeRange(0, maxByte);<br />			x=[x substringWithRange:r];<br />		}	<br />	<br />	[[aNotification object] setStringValue :x];					// update the associated textfield<br />}<br />		<br />//-------------------------------------------------------------------------------------------//<br />-(void) I2C_CHECK_STRING: (id) sender;	// check hexadecimal character of the string.<br />{<br />	NSString *tempS = [sender stringValue];<br />	tempS = [tempS uppercaseString];<br />	[sender setStringValue:tempS];		// update the display accordingly<br /><br />}<br />//-------------------------------------------------------------------------------------------//<br />- (void) VsourceCNTL: (id) sender;		// control the Vbus source selection<br />{<br />	float z;<br />	<br />	z = [sender  doubleValue];<br />	<br />	[VBUStext setFloatValue :z];<br />	<br />}<br /><br />//-------------------------------------------------------------------------------------------//<br /><br />@end<br /><br /><br />#import &lt;Cocoa/Cocoa.h&gt;<br /><br /><br />@interface I2CFunctions : NSObject {<br />	<br />	IBOutlet id SCL_F_text;<br />	IBOutlet id PWIDTH_text;<br />	<br />}<br /><br />-(void) setPWidth:(id) sender;<br />-(void) setSCLfreq:(id) sender;<br /><br />@end<br /><br /><br /><br />#import &quot;I2CFunctions.h&quot;<br /><br /><br />@implementation I2CFunctions<br /><br /><br />//-------------------------------------------------------------------------------------------//<br />-(void) setPWidth:(id) sender;<br />{<br />	<br />	float z;<br />	<br />	z = [sender  doubleValue];<br />	<br />	[ PWIDTH_text setFloatValue :z];<br />}<br /><br />//-------------------------------------------------------------------------------------------//<br /><br />-(void) setSCLfreq:(id) sender;<br />{<br />	float z;<br />	<br />	z = [sender  doubleValue];<br />	<br />	[SCL_F_text setFloatValue :z];<br />}<br /><br /><br /><br />//-------------------------------------------------------------------------------------------//<br /><br />//-------------------------------------------------------------------------------------------//<br /><br />//-------------------------------------------------------------------------------------------//<br />@end<br /><br />// HIDcontroller. h //<br /><br />#import &lt;Cocoa/Cocoa.h&gt;<br />#import &lt;IOKit/IOCFPlugIn.h&gt;<br />#import &lt;IOKit/hid/IOHIDLib.h&gt;<br />#import &lt;IOKit/hid/IOHIDKeys.h&gt;<br /><br />@interface HIDcontroller : NSObject {<br /><br />	long	idVID;						// HID Vendor Identification Device<br />	long	idPID;						// HID Product Identification Device<br />	<br />	IBOutlet  id DummyText;<br />}<br /><br />- (void) ExtractHIDdevice ;<br />- (int) readHIDdevice: (NSString*) dataByte;<br />- (int) writeHIDdevice: (NSString*) dataByte;<br /><br />@end<br /><br /><br />// HIDcontroller. m //<br /><br />#import &quot;HIDcontroller.h&quot;<br /><br /><br />@implementation HIDcontroller<br /><br />//-------------------------------------------------------------------------------------//<br />//--																				 &nbsp; //<br />//-------------------------------------------------------------------------------------//<br />- (void) ExtractHIDdevice ;<br />{<br />	NSString *gERROR;<br />	idVID = 0x6017;						// HID Vendor Identification Device<br />	idPID = 0x0200;<br />	<br />	IOReturn result = kIOReturnSuccess;<br />	io_iterator_t hidObjectIterator = 0;<br />	io_object_t hidDevice = IO_OBJECT_NULL;<br />	CFMutableDictionaryRef hidMatchDictionary = 0;<br />	CFMutableDictionaryRef hidProperties = 0;<br />	<br />	hidMatchDictionary = IOServiceMatching(kIOHIDDeviceKey);	// create a matching directory<br />	result = IOServiceGetMatchingServices(kIOMasterPortDefault,<br />										hidMatchDictionary,<br />										 &amp;hidObjectIterator);<br />	<br />		if ((result != kIOReturnSuccess) || (hidObjectIterator ==0))<br />			gERROR = @&quot;error&quot;; ; //setString (gERROR, @&quot; no iterator available &quot;);<br />	<br />	while (( hidDevice = IOIteratorNext(hidObjectIterator)))<br />	{<br />		hidProperties = 0;<br />		int vendor = 0;<br />		int product = 0;<br />		result = IORegistryEntryCreateCFProperties(hidDevice, &amp;hidProperties,<br />												 &nbsp; kCFAllocatorDefault, kNilOptions);<br />			if ((result== KERN_SUCCESS) &amp;&amp; hidProperties)<br />			{<br />				CFNumberRef vendorRef, productRef;<br />				vendorRef = CFDictionaryGetValue(hidProperties,CFSTR(kIOHIDVendorIDKey));<br />				productRef = CFDictionaryGetValue(hidProperties, CFSTR(kIOHIDProductIDKey));<br />				<br />					if (vendorRef)<br />					{	CFNumberGetValue(vendorRef, kCFNumberIntType, &amp; vendor);<br />						CFRelease(vendorRef);<br />					}<br />					<br />					if (productRef)<br />					{	CFNumberGetValue(productRef, kCFNumberIntType, &amp; product);<br />						CFRelease(productRef);<br />					}<br />			}<br />		<br />	<br />		[DummyText setIntValue:vendor];<br />		<br />		IOObjectRelease(hidObjectIterator);<br />		//return 0;<br />	}<br />}<br /><br />//-------------------------------------------------------------------------------------//<br />//--																				 &nbsp; //<br />//-------------------------------------------------------------------------------------//<br /><br />- (int) readHIDdevice: (NSString*) dataByte;<br />{<br />	return 0;<br />}<br /><br />//-------------------------------------------------------------------------------------//<br />//--																				 &nbsp; //<br />//-------------------------------------------------------------------------------------//<br /><br />- (int) writeHIDdevice: (NSString*) dataByte;<br />{<br />	return 0;<br />}<br /><br />@end<br />
    
  • CéroceCéroce Membre, Modérateur
    19:30 modifié #4
    dans 1258015037:

    les routines associées à  2CFunctions.h et / ou HIDcontroller.h ne sont pas vues par I2CbusCoder.h

    Qu'est ce que ça veut dire exactement ?
    ça ne compile pas, ou bien leur code n'est pas exécuté ?
  • Michael31Michael31 Membre
    19:30 modifié #5
    la compilation se fait sans erreur , les codes du fichier I2CFunctions ne sont jamais exécutés  :(. Tous les codes présents dans le fichier I2CbusCoder.m fonctionnent comme attendu, à  savoir réponses aux commandes provenant de l'écran de contrôle . ::)
    Par ailleurs, je ne peux accéder aux  routines ou aux variables existantes dans le fichier HIDcontroller  :( :(.

    Michael
  • CéroceCéroce Membre, Modérateur
    19:30 modifié #6
    Il faut que tu repenses l'organisation de ton code, selon le paradigme MVC, évoqué maintes fois ici, et également dans le livre d'Hillegass.

    - La communication fait partie de la couche modèle.
    - Il te faut créer un objet contrôleur qui va recevoir toutes les IBActions de ta fenêtre, et posséder toutes les Outlets.

    C'est ensuite au contrôleur d'appeler les fonctions/méthodes de ta couche modèle.

    Ceci amène à  la deuxième question: qui va instancier l'objet qui gère la communication ?
    Pour un projet comme celui-ci, le plus simple est que ce soit le contrôleur.
    Le contrôleur est instancié, quant à  lui, depuis le .nib, en plaçant un cube bleu. Dans sa méthode -init, tu pourras instancier un objet qui gère la communication.

    Ces quelques indications devraient t'aiguiller.
  • Michael31Michael31 Membre
    19:30 modifié #7
    bonjour,

    merci pour les informations.
    Manifestement, ce n'est pas simple d'utiliser cocoa en venant du monde Pascal.
    Je vais continuer mon analyse. Pour information, le projet fonctionne (matériel et logiciel) sous Delphi, mais je souhaite une version logicielle sous Mac pour supporter des applications en dehors du monde Windows. Dommage qu'un ensemble de développement sous Pascal n'existe pas sous Apple !

    bye

    Michael
  • CéroceCéroce Membre, Modérateur
    19:30 modifié #8
    En fait, dis-moi si je me trompe, ton problème semble plutôt que tu n'as pas encore intégré la logique "objet". Personnellement, ça m'a pris près de deux ans. J'ai eu beau apprendre le C++, je codais encore dans l'esprit du langage C, et c'est pour cela que je n'arrivais pas à  organiser mes programmes.

    ça demande un changement d'état d'esprit: passer du "que faut-il faire" à  "quel objet à  quelles responsabilités". C'est une science en soi, qui demande des années d'apprentissage.

    Cocoa utilise les notions "objet" avec souvent beaucoup d'élégance, mais ceci exige de la part du programmeur de penser totalement "objet".
  • AliGatorAliGator Membre, Modérateur
    19:30 modifié #9
    Oui, le Pascal est procédural alors que le C++ et l'Objective-C sont des langages Objets, et ça c'est une vision totalement différente !
    Je te conseille un bon bouquin pour apprendre la logique de la POO (Programmation Orientée Objet), ils sont en général bien expliqués et ça t'aidera je pense ;)
  • Michael31Michael31 Membre
    19:30 modifié #10
    Bonjour,

    La difficulté, ou le problème, c'est de devoir digérer une nouvelle technique pour développer un système qui est sans commune mesure avec les besoins de l'informatique " gros calibre". Tout en gardant à  l'esprit la limite du temps dédié à  ce système qui ne peut être infini... J'ai une approche de la POO avec Delphi, approche restreinte en comparaison des connaissances nécessaires, il me semble, pour utiliser au mieux Cocoa. Donc, des efforts en perspective...
    Cela étant, le système reste simple, en terme informatique : pas de jeu, pas de liaison complexe sur le web, pas de gestion de fichiers complexes, pas d'utilisateurs multiples, etc. reste la notion de commande temps réels et la liaison USB qui sont essentiels pour supporter une électronique complexe par ailleurs.
    Néanmoins, cela avance et , hier  soir, j'ai pu établir l'activation de la méthode B via la méthode A en utilisant la procédure performSelector sans toucher au reste du code existant. je vais étudier la méthode NSInvocation afin de pouvoir échanger plusieurs paramètres lors de l'appel des fonctions que je dois gérer dans ce contexte.
    Merci pour vos conseils et encouragements !

    Michael
  • wiskywisky Membre
    19:30 modifié #11
    dans 1258442332:

    Bonjour,

    La difficulté, ou le problème, c'est de devoir digérer une nouvelle technique pour développer un système qui est sans commune mesure avec les besoins de l'informatique " gros calibre". Tout en gardant à  l'esprit la limite du temps dédié à  ce système qui ne peut être infini... J'ai une approche de la POO avec Delphi, approche restreinte en comparaison des connaissances nécessaires, il me semble, pour utiliser au mieux Cocoa. Donc, des efforts en perspective...
    Cela étant, le système reste simple, en terme informatique : pas de jeu, pas de liaison complexe sur le web, pas de gestion de fichiers complexes, pas d'utilisateurs multiples, etc. reste la notion de commande temps réels et la liaison USB qui sont essentiels pour supporter une électronique complexe par ailleurs.
    Néanmoins, cela avance et , hier  soir, j'ai pu établir l'activation de la méthode B via la méthode A en utilisant la procédure performSelector sans toucher au reste du code existant. je vais étudier la méthode NSInvocation afin de pouvoir échanger plusieurs paramètres lors de l'appel des fonctions que je dois gérer dans ce contexte.
    Merci pour vos conseils et encouragements !

    Michael



    Tu m'a l'air pris de cours dans un projet ou les zones d'ombre sont multiple. Tu essaie de faire avec Cocoa comme ce que tu faisait sur delphi ou Pascal. Ca peu marché maintenant mais la maintenance du produit risque d'être dur et tu risque de tout ré-écrire.
    Bon courage et n'hésite pas à  poser des questions.

    Comment gère tu la connexion USB ? (utilise tu une class USB spécifique ou un mode de connexion simple ? )
  • Michael31Michael31 Membre
    19:30 modifié #12
    Bonjour,

    Je suis d'accord : le logiciel en cours ne répond probablement pas aux canons de cocoa ... désolé ...
    La communication avec le MCU extérieur ( MC9S08JM60 freescale)  se fait selon la procédure HID , USB 2.0. Le format des données est défini selon les spécifications du MCU. Je penses utiliser les modèles fournis par Apple, en particulier la note technique TN2187.
    A ce jour, le problème des échanges entre A et B est résolu : je peux donc écrire une chaà®ne de caractères, définie selon le type de donnée, pour préparer le rapport HID avant son envoie sur le bus.
    L'étape suivante est donc la liaison USB/HID.
    bye
    Michael
  • Michael31Michael31 Membre
    19:30 modifié #13
    Bonjour,

    Je  reviens vers vous pour clarifier / solutionner un problème avec le kit HIB développé par Apple.
    Les nouveaux API, de 2009, doivent simplifier la programmation du port USB pour un périphérique HID. Sur le papier,c'est bien. Sur la réalité, je tombe sur un problème en relation avec la méthode suivante :
    IOHIDManagerRegisterDeviceMatchingCallback(managerRef, [ select callBackRoutine , inContext);
    question: dés lors que la fonction attend un pointer sur la sous routine " callBackRoutine " ( que je crée par ailleurs ), comment établir cette demande de pointeur depuis cocoa ?
    Par ailleurs, la totalité des fonctions API sont au format C : comment les utiliser depuis cocoa en gardant en tète que de nombreuses de ces fonctions attendent des pointeurs de routines dans leurs paramètres ?

    merci pour votre aide,

    bye

    Michael
  • CéroceCéroce Membre, Modérateur
    novembre 2009 modifié #14
    Le langage Objective-C est 100% compatible avec le langage C (compatibilité ascendante, bien entendu).
    Tu peux donc appeler une fonction C depuis le code Cocoa comme d'habitude, et écrire des fonctions C dans une fichier .m.

    Quand les API ont besoin d'un callback, c'est un pointeur sur une fonction C qui est attendu. Il te suffit de donner le nom de la fonction C (sans les parenthèses). Fais juste attention que la fonction ait le prototype attendu, qui doit t'être fourni dans la documentation. Tu ne peux donc pas passer un pointeur sur une méthode ObjC.
Connectez-vous ou Inscrivez-vous pour répondre.